diff --git a/readme.md b/readme.md index 46f41fa..39cc90a 100644 --- a/readme.md +++ b/readme.md @@ -27,6 +27,8 @@ curl -X POST --data "name=Hi from curl!" http://:/entities/create * read all ``` curl -X GET http://:/entities/info +curl -X GET http://:/relations/info +curl -X GET http://:/distances/info ``` * read single diff --git a/relations/.gitignore b/relations/.gitignore index 06b458e..433022d 100644 --- a/relations/.gitignore +++ b/relations/.gitignore @@ -1 +1,3 @@ cfg-sib00_rgncycle.txt +*.o +main \ No newline at end of file diff --git a/relations/main.c b/relations/main.c index d7e30b4..133247c 100644 --- a/relations/main.c +++ b/relations/main.c @@ -25,24 +25,32 @@ #define ROUTE_HELLO "/hello" #define ROUTE_ENTITIES "/entities" #define ROUTE_RELATIONS "/relations" +#define ROUTE_DISTANCES "/distances" pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; /** * callback functions declaration */ +/* callback for Test*/ int callback_get_hello (const struct _u_request * request, struct _u_response * response, void * user_data); +/* callback for Root*/ int callback_default (const struct _u_request * request, struct _u_response * response, void * user_data); + /* callback for Entities*/ int callback_create_entity (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_get_entities (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_get_entity (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_update_entity (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_delete_entity (const struct _u_request * request, struct _u_response * response, void * user_data); + /* callback for Relations*/ int callback_get_relations (const struct _u_request * request, struct _u_response * response, void * user_data); +/* callback for Distances*/ +int callback_get_distances (const struct _u_request * request, struct _u_response * response, void * user_data); + /** * decode a u_map into a string */ @@ -193,6 +201,9 @@ int main(int argc, char *argv[]) { /* callbacks for Relations*/ ulfius_add_endpoint_by_val(&instance, "GET", ROUTE_RELATIONS, "/info", 0, &callback_get_relations, (void *)conn); + /* callbacks for Distances*/ + ulfius_add_endpoint_by_val(&instance, "GET", ROUTE_DISTANCES, "/info", 0, &callback_get_distances, (void *)conn); + // default_endpoint declaration ulfius_set_default_endpoint(&instance, &callback_default, NULL); @@ -279,10 +290,10 @@ int callback_get_entity (const struct _u_request * request, struct _u_response * conn = (PGconn *)user_data; /*define prepared statement*/ - len=snprintf(NULL,0,"SELECT * FROM entities WHERE entity_id=%s;",value); + len=snprintf(NULL,0,"SELECT * FROM tbl_entities WHERE entity_id=%s;",value); prepStmEntities=malloc((size_t)(len+1)); //TODO Release prepStmEntities! - snprintf(prepStmEntities,(size_t)(len+1),"SELECT * FROM entities WHERE entity_id=%s;",value); + snprintf(prepStmEntities,(size_t)(len+1),"SELECT * FROM tbl_entities WHERE entity_id=%s;",value); //printf("callback_get_entity() prepStmEntities: %s\n",prepStmEntities); //lock PGconn mutex @@ -340,7 +351,7 @@ int callback_get_entity (const struct _u_request * request, struct _u_response * } } }else{ - printf("callback_delete_entity() HTTP GET request error!\n"); + printf("callback_get_entity() HTTP GET request error!\n"); ulfius_set_string_body_response(response, 400, "This is the /entity/:id/info route: HTTP GET request error!"); } /*clean up remainings*/ @@ -363,7 +374,7 @@ int callback_get_entities (const struct _u_request * request, struct _u_response conn = (PGconn *)user_data; /*define prepared statement*/ - prepStmEntities = "SELECT * FROM entities;"; + prepStmEntities = "SELECT * FROM tbl_entities;"; //lock PGconn mutex pthread_mutex_lock(&mutex); @@ -436,7 +447,7 @@ int callback_get_relations (const struct _u_request * request, struct _u_respons conn = (PGconn *)user_data; /*define prepared statement*/ - prepStmEntities = "SELECT * FROM relations;"; + prepStmEntities = "SELECT * FROM tbl_relations;"; //lock PGconn mutex pthread_mutex_lock(&mutex); @@ -486,6 +497,71 @@ int callback_get_relations (const struct _u_request * request, struct _u_respons return U_CALLBACK_CONTINUE; } +/** + * Callback function to reply all distances + */ +int callback_get_distances (const struct _u_request * request, struct _u_response * response, void * user_data) { + /*declarations*/ + PGconn *conn; + char *prepStmEntities; + PGresult *pqRes; + int nbRecords,nbFields; + json_t *arrayRecords, *arrayFields, *stringField; + + printf("callback_get_distances() Started...\n"); + conn = (PGconn *)user_data; + + /*define prepared statement*/ + prepStmEntities = "SELECT * FROM tbl_distances;"; + + //lock PGconn mutex + pthread_mutex_lock(&mutex); + + /*create prepared statement*/ + pqRes = PQexecParams(conn, prepStmEntities, 0, NULL, NULL, NULL, NULL, 0); + + //unlock PGconn mutex + pthread_mutex_unlock(&mutex); + + if (PQresultStatus(pqRes) != PGRES_TUPLES_OK) { + printf("callback_get_distances() No data retrieved\n"); + /*clean up result*/ + PQclear(pqRes); + //TODO Why this casting? + (void)(request); + (void)(user_data); + ulfius_set_string_body_response(response, 500, "This is the /distances route: Dba error!"); + printf("callback_get_distances() Done.\n"); + return U_CALLBACK_CONTINUE; + } + + /*evaluate result*/ + nbRecords = PQntuples(pqRes); + nbFields = PQnfields(pqRes); + arrayRecords=json_array(); + for(int i=0;i