75 lines
2.5 KiB
C
75 lines
2.5 KiB
C
|
|
#include "fbdata.h"
|
|
|
|
|
|
void finish_with_error(MYSQL *con) {
|
|
fprintf(stderr, "%s\n", mysql_error(con));
|
|
mysql_close(con);
|
|
exit(1);
|
|
}
|
|
|
|
|
|
void updateData(sourcedata data[]) {
|
|
|
|
// query database for latest values
|
|
char query[] = "\
|
|
SELECT time, source, metric, value \
|
|
FROM readings AS r \
|
|
INNER JOIN (SELECT MAX(time) AS maxtime, source_id, metric_id FROM readings GROUP BY source_id,metric_id) AS mr \
|
|
ON mr.maxtime = r.time AND mr.source_id = r.source_id AND mr.metric_id = r.metric_id \
|
|
INNER JOIN sources AS s \
|
|
ON r.source_id = s.id \
|
|
INNER JOIN metrics AS m \
|
|
ON r.metric_id = m.id;\
|
|
";
|
|
|
|
|
|
printf("Connecting to database ...\n");
|
|
printf("MySQL client version: %s\n", mysql_get_client_info());
|
|
|
|
MYSQL *con;
|
|
if (!(con = mysql_init(NULL))) finish_with_error(con);
|
|
if (!mysql_real_connect(con, "web-pi", "grafanaReader", "grafanaReader", "grafanaData", 0, NULL, 0)) finish_with_error(con);
|
|
|
|
//printf("%s\n",query);
|
|
printf("Running query ...\n");
|
|
//printf("Query: %s\n", query);
|
|
if (mysql_query(con, query)) finish_with_error(con);
|
|
printf("Finished.\n");
|
|
|
|
MYSQL_RES *result;
|
|
if (!(result = mysql_store_result(con))) finish_with_error(con);
|
|
int num_fields = mysql_num_fields(result);
|
|
if (num_fields > 3) { // sanity check to honor bounds
|
|
MYSQL_ROW row;
|
|
while ((row = mysql_fetch_row(result))) {
|
|
unsigned long *length = mysql_fetch_lengths (result); // only valid for current row
|
|
int l = *(length + 3) - 2;
|
|
//printf("%s [l = %d]\n", row[3], l);
|
|
|
|
// data binding
|
|
for (int i = 0; i < 4; i++) {
|
|
if (strcmp(row[1], data[i].text) == 0) {
|
|
if (strcmp(row[2], "Temperatur") == 0 && data[i].temperature == NULL) {
|
|
data[i].temperature = calloc((l + 1),sizeof(char)); // +1 for null-termination
|
|
memcpy(data[i].temperature, row[3], l * sizeof(char));
|
|
}
|
|
else if (strcmp(row[2], "Luftfeuchte") == 0 && data[i].humidity == NULL){
|
|
data[i].humidity = calloc((l + 1),sizeof(char)); // +1 for null-termination
|
|
memcpy(data[i].humidity, row[3], l * sizeof(char));
|
|
}
|
|
}
|
|
}
|
|
|
|
// debugging
|
|
//for(int i = 0; i < num_fields; i++) printf("%s ", row[i] ? row[i] : "NULL");
|
|
//printf("\n");
|
|
}
|
|
}
|
|
// free memory after dashboard was updated
|
|
mysql_free_result(result);
|
|
mysql_close(con);
|
|
printf("Done!\n");
|
|
}
|
|
|