X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=server%2Fdata.c;h=edfd4c3d388c74d7236469c7cde3db0274c184d1;hb=75b9743b95672218a61811b03433c0ab6e00ec5c;hp=c4d7b584302ba9f786ad4dd21c3550d136d54931;hpb=ef065a355c92c834adcfa49f866d23ef4153cf36;p=matches%2FMCTX3420.git diff --git a/server/data.c b/server/data.c index c4d7b58..edfd4c3 100644 --- a/server/data.c +++ b/server/data.c @@ -1,6 +1,6 @@ /** * @file data.c - * @purpose Implementation of data handling functions; saving, loading, displaying, selecting. + * @brief Implementation of data handling functions; saving, loading, displaying, selecting. */ #include "data.h" @@ -13,8 +13,8 @@ void Data_Init(DataFile * df) { // Everything is NULL - df->filename = NULL; - df->file = NULL; + memset(df, 0, sizeof(DataFile)); + pthread_mutex_init(&(df->mutex), NULL); } /** @@ -161,13 +161,13 @@ void Data_PrintByIndexes(DataFile * df, int start_index, int end_index, DataForm switch (format) { case JSON: - fmt_string = "[%f,%f]"; + fmt_string = "[%.9f,%f]"; separator = ','; // For JSON we need an opening bracket FCGI_PrintRaw("["); break; case TSV: - fmt_string = "%f\t%f"; + fmt_string = "%.9f\t%f"; separator = '\n'; break; } @@ -285,3 +285,74 @@ int Data_FindByTime(DataFile * df, double time_stamp, DataPoint * closest) return index; } + +/** + * Helper; handle FCGI response that requires data + * Should be called first. + * @param df - DataFile to access + * @param start - Info about start_time param + * @param end - Info about end_time param + * @param fmt - Info about format param + * @param current_time - Current time + */ +void Data_Handler(DataFile * df, FCGIValue * start, FCGIValue * end, DataFormat format, double current_time) +{ + double start_time = *(double*)(start->value); + double end_time = *(double*)(end->value); + + if (format == JSON) + { + FCGI_JSONKey("data"); + } + + // If a time was specified + if (FCGI_RECEIVED(start->flags) || FCGI_RECEIVED(end->flags)) + { + // Wrap times relative to the current time + if (start_time < 0) + start_time += current_time; + if (end_time < 0) + end_time += current_time; + + // Print points by time range + Data_PrintByTimes(df, start_time, end_time, format); + + } + else // No time was specified; just return a recent set of points + { + pthread_mutex_lock(&(df->mutex)); + int start_index = df->num_points-DATA_BUFSIZ; + int end_index = df->num_points-1; + pthread_mutex_unlock(&(df->mutex)); + + // Bounds check + if (start_index < 0) + start_index = 0; + if (end_index < 0) + end_index = 0; + + // Print points by indexes + Data_PrintByIndexes(df, start_index, end_index, format); + } + +} + +/** + * Helper - Convert human readable format string to DataFormat + * @param fmt - FCGIValue to use + */ +DataFormat Data_GetFormat(FCGIValue * fmt) +{ + const char * fmt_str = *(const char**)(fmt->value); + // Check if format type was specified + if (FCGI_RECEIVED(fmt->flags)) + { + if (strcmp(fmt_str, "json") == 0) + return JSON; + else if (strcmp(fmt_str, "tsv") == 0) + return TSV; + else + Log(LOGERR, "Unknown format type \"%s\"", fmt_str); + } + return JSON; +}