- StatusCodes status = STATUS_OK;
-
- OutputType output_type = JSON;
-
-
-
- const char * key; const char * value;
-
- Sensor * sensor = NULL;
-
- struct timeval now;
- gettimeofday(&now, NULL);
-
- 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)
- {
- Log(LOGERR, "No valid sensor id given");
- status = STATUS_ERROR;
- }
-
- if (status == STATUS_ERROR)
- {
- FCGI_RejectJSON(context, "Invalid input parameters");
- return;
- }
-
-
- if (seek_time)
- {
- if (end_time < 0 && !points_specified)
- end_index = sensor->points_written;
- else
- {
- int count = 0; DataPoint d;
- end_index = FindTime(sensor, end_time, &count, &d);
- Log(LOGDEBUG, "FindTime - Looked for %f; found [%f,%f] after %d iterations; sensor %d, position %d", end_time, d.time_stamp, d.value, count, sensor->id, end_index);
- }
- if (start_time < 0)
- start_time = 0;
- else
- {
- int count = 0; DataPoint d;
- start_index = FindTime(sensor, start_time, &count, &d);
- Log(LOGDEBUG, "FindTime - Looked for %f; found [%f,%f] after %d iterations; sensor %d, position %d", start_time, d.time_stamp, d.value, count, sensor->id, start_index);
- }
-
- if (points_specified)
- end_index = start_index + query_size;
- }
- else
- {
- start_index = sensor->points_written - query_size;
-
- end_index = sensor->points_written;
- }
-
- if (start_index < 0)
- {
- Log(LOGNOTE, "start_index = %d => Clamped to 0", start_index);
- start_index = 0;
- }
- if (end_index > sensor->points_written)
- {
- Log(LOGNOTE, "end_index = %d => Clamped to %d", end_index, sensor->points_written);
- end_index = sensor->points_written;
- }
-
- switch (output_type)