-
- double start_time = -1;
- double end_time = -1;
- double current_time = (now.tv_sec - g_options.start_time.tv_sec) + 1e-6*(now.tv_usec - g_options.start_time.tv_usec);
- bool seek_time = false;
- bool points_specified = false;
- int query_size = SENSOR_QUERYBUFSIZ;
- int start_index = -1;
- int end_index = -1;
-
-
- while ((params = FCGI_KeyPair(params, &key, &value)) != NULL)
- {
- Log(LOGDEBUG, "Got key=%s and value=%s", key, value);
- if (strcmp(key, "id") == 0)
- {
- if (sensor != NULL)
- {
- Log(LOGERR, "Only one sensor id should be specified");
- status = STATUS_ERROR;
- break;
- }
- if (*value == '\0')
- {
- Log(LOGERR, "No id specified.");
- status = STATUS_ERROR;
- break;
- }
-
- sensor = Sensor_Identify(value);
- if (sensor == NULL)
- {
- Log(LOGERR, "Invalid sensor id: %s", value);
- status = STATUS_ERROR;
- break;
- }
- }
- else if (strcmp(key, "format") == 0)
- {
- if (strcmp(value, "json") == 0)
- output_type = JSON;
- else if (strcmp(value, "csv") == 0)
- output_type = CSV;
- else if (strcmp(value, "tsv") == 0)
- output_type = TSV;
- }
- else if (strcmp(key, "points") == 0)
- {
- points_specified = true;
- if (strcmp(value, "all") == 0)
- {
- query_size = sensor->points_written;
- }
- else
- {
- char * end;
- query_size = strtol(value, &end, 10);
- if (*end != '\0')
- {
- Log(LOGERR, "Require \"all\" or an integer value: %s = %s", key, value);
- status = STATUS_ERROR;
- break;
- }
- }
-
- }
- else if (strcmp(key, "start_time") == 0)
- {
- seek_time = true;
- char * end;
- start_time = strtod(value, &end);
- if (*end != '\0')
- {
- Log(LOGERR, "Require a double: %s = %s", key, value);
- status = STATUS_ERROR;
- break;
- }
-
- // Treat negative values as being relative to the current time
- if (start_time < 0)
- {
- start_time = current_time + start_time;
- }
- start_time = floor(start_time);
- }
- else if (strcmp(key, "end_time") == 0)
- {
- seek_time = true;
- char * end;
- end_time = strtod(value, &end);
- if (*end != '\0')
- {
- Log(LOGERR, "Require a double: %s = %s", key, value);
- status = STATUS_ERROR;
- break;
- }
-
- // Treat negative values as being relative to the current time
- if (end_time < 0)
- {
- end_time = current_time + end_time;
- }
- end_time = ceil(end_time);
- }
- // For backward compatability:
- else if (strcmp(key, "dump") == 0)
- {
- output_type = TSV;
- query_size = sensor->points_written+1;
- }
- else
- {
- Log(LOGERR, "Unknown key \"%s\" (value = %s)", key, value);
- status = STATUS_ERROR;
- break;
- }
- }
-
- if (status != STATUS_ERROR && sensor == NULL)
+ double current_time = TIMEVAL_DIFF(now, g_options.start_time);
+
+ int id = 0;
+ double start_time = 0;
+ double end_time = current_time;
+ const char * fmt_str;
+
+ // key/value pairs
+ FCGIValue values[] = {
+ {"id", &id, FCGI_REQUIRED(FCGI_INT_T)},
+ {"format", &fmt_str, FCGI_STRING_T},
+ {"start_time", &start_time, FCGI_DOUBLE_T},
+ {"end_time", &end_time, FCGI_DOUBLE_T},
+ };
+
+ // enum to avoid the use of magic numbers
+ typedef enum {
+ ID,
+ FORMAT,
+ START_TIME,
+ END_TIME,
+ } SensorParams;
+
+ // Fill values appropriately
+ if (!FCGI_ParseRequest(context, params, values, sizeof(values)/sizeof(FCGIValue)))