diff --git a/api-ulfius/src/main.c b/api-ulfius/src/main.c index 0048650..e33b10c 100644 --- a/api-ulfius/src/main.c +++ b/api-ulfius/src/main.c @@ -25,6 +25,7 @@ #define ROUTE_HELLO "/hello" #define ROUTE_BUS_STOP "/bus-stop" #define ROUTE_TRAIN_STATION "/train-station" +#define ROUTE_PARK_RIDE "/park-ride" pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; @@ -37,6 +38,8 @@ int callback_default (const struct _u_request * request, struct _u_response * re int callback_get_bus_stop_count (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_get_train_station_count (const struct _u_request * request, struct _u_response * response, void * user_data); int callback_get_train_station_info (const struct _u_request * request, struct _u_response * response, void * user_data); +int callback_get_park_ride_count (const struct _u_request * request, struct _u_response * response, void * user_data); +int callback_get_park_ride_info (const struct _u_request * request, struct _u_response * response, void * user_data); /** * decode a u_map into a string @@ -176,6 +179,8 @@ int main(int argc, char *argv[]) { ulfius_add_endpoint_by_val(&instance, "GET", ROUTE_BUS_STOP, "/count", 0, &callback_get_bus_stop_count, (void *)conn); ulfius_add_endpoint_by_val(&instance, "GET", ROUTE_TRAIN_STATION, "/count", 0, &callback_get_train_station_count, (void *)conn); ulfius_add_endpoint_by_val(&instance, "GET", ROUTE_TRAIN_STATION, "/info", 0, &callback_get_train_station_info, (void *)conn); + ulfius_add_endpoint_by_val(&instance, "GET", ROUTE_PARK_RIDE, "/count", 0, &callback_get_park_ride_count, (void *)conn); + ulfius_add_endpoint_by_val(&instance, "GET", ROUTE_PARK_RIDE, "/info", 0, &callback_get_park_ride_info, (void *)conn); // default_endpoint declaration ulfius_set_default_endpoint(&instance, &callback_default, NULL); @@ -244,7 +249,7 @@ int callback_get_bus_stop_count (const struct _u_request * request, struct _u_re conn = (PGconn *)user_data; /*define prepared statement*/ - prepStatement = "SELECT count(id) FROM rvb.tbl_bus_stop;"; + prepStatement = "SELECT count(DISTINCT osm_id) FROM rvb.tbl_bus_stop;"; //lock PGconn mutex pthread_mutex_lock(&mutex); @@ -311,7 +316,7 @@ int callback_get_train_station_count (const struct _u_request * request, struct conn = (PGconn *)user_data; /*define prepared statement*/ - prepStatement = "SELECT count(id) FROM rvb.tbl_railway;"; + prepStatement = "SELECT count(DISTINCT osm_id) FROM rvb.tbl_railway;"; //lock PGconn mutex pthread_mutex_lock(&mutex); @@ -363,6 +368,73 @@ int callback_get_train_station_count (const struct _u_request * request, struct return U_CALLBACK_CONTINUE; } +/** + * Callback function to reply number of all train stations + */ +int callback_get_park_ride_count (const struct _u_request * request, struct _u_response * response, void * user_data) { + /*declarations*/ + PGconn *conn; + char *prepStatement; + PGresult *pqRes; + int nbRecords,nbFields; + json_t *arrayRecords, *arrayFields, *stringField; + + printf("callback_get_park_ride_count() Started...\n"); + conn = (PGconn *)user_data; + + /*define prepared statement*/ + prepStatement = "SELECT count(DISTINCT osm_id) FROM rvb.tbl_park_ride;"; + + //lock PGconn mutex + pthread_mutex_lock(&mutex); + + /*create prepared statement*/ + pqRes = PQexecParams(conn, prepStatement, 0, NULL, NULL, NULL, NULL, 0); + + //unlock PGconn mutex + pthread_mutex_unlock(&mutex); + + if (PQresultStatus(pqRes) != PGRES_TUPLES_OK) { + printf("callback_get_park_ride_count() 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 /entities route: Dba error!"); + printf("callback_get_park_ride_count() Done.\n"); + return U_CALLBACK_CONTINUE; + } + + /*evaluate result*/ + nbRecords = PQntuples(pqRes); + //printf("callback_get_park_ride_count() nbRecords: %d\n",nbRecords); + nbFields = PQnfields(pqRes); + //printf("callback_get_park_ride_count() nbFields: %d\n",nbFields); + arrayRecords=json_array(); + for(int i=0;i