bmsd/mysql.c

changeset 0
033898178630
child 43
dcb9ff8846fa
equal deleted inserted replaced
-1:000000000000 0:033898178630
1 /**
2 * @file mysql.c
3 * @brief MySQL/MariaDB access.
4 * @author Michiel Broek <mbroek at mbse dot eu>
5 *
6 * Copyright (C) 2018
7 *
8 * This file is part of the bms (Brewery Management System)
9 *
10 * This is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by the
12 * Free Software Foundation; either version 2, or (at your option) any
13 * later version.
14 *
15 * bms is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with ThermFerm; see the file COPYING. If not, write to the Free
22 * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
23 */
24
25 #include "bms.h"
26 #include "xutil.h"
27 #include "mysql.h"
28 #include "nodes.h"
29
30
31 MYSQL *con = NULL;
32 MYSQL_RES *res_set;
33 MYSQL_ROW row;
34
35 extern sys_config Config;
36 extern sys_node_list *nodes;
37 extern sys_fermenter_list *fermenters;
38 extern int debug;
39
40
41 time_t datetime_to_time_t(char *dt_string)
42 {
43 struct tm tm;
44
45 memset(&tm, 0, sizeof(struct tm));
46 tm.tm_year = atoi(strtok(dt_string, "-")) - 1900;
47 tm.tm_mon = atoi(strtok(NULL, "-")) - 1;
48 tm.tm_mday = atoi(strtok(NULL, " "));
49 tm.tm_hour = atoi(strtok(NULL, ":"));
50 tm.tm_min = atoi(strtok(NULL, ":"));
51 tm.tm_sec = atoi(strtok(NULL, "\0"));
52 tm.tm_isdst = 1;
53
54 return mktime(&tm);
55 }
56
57
58
59 int bms_mysql_init(void)
60 {
61 sys_node_list *node, *tmpp;
62 sys_fermenter_list *fermenter, *tmpf;
63 int ncnt = 0, fcnt = 0;
64
65 con = mysql_init(NULL);
66 if (con == NULL) {
67 syslog(LOG_NOTICE, "MySQL: mysql_init() failed");
68 return 1;
69 }
70
71 if (mysql_real_connect(con, Config.mysql_host, Config.mysql_user, Config.mysql_pass, Config.mysql_database, Config.mysql_port, NULL, 0) == NULL) {
72 syslog(LOG_NOTICE, "MySQL: mysql_real_connect() %s", mysql_error(con));
73 return 2;
74 }
75
76 syslog(LOG_NOTICE, "MySQL: connected to %s:%d database %s", Config.mysql_host, Config.mysql_port, Config.mysql_database);
77 syslog(LOG_NOTICE, "MySQL: %s server info: %s", mysql_get_host_info(con), mysql_get_server_info(con));
78 if (debug)
79 fprintf(stdout, "MySQL: connected\n");
80
81 /*
82 * Restore nodes from the database
83 */
84 if (mysql_query(con, "SELECT * FROM nodes")) {
85 syslog(LOG_NOTICE, "MySQL: SELECT * FROM nodes error %u (%s))", mysql_errno(con), mysql_error(con));
86 } else {
87 res_set = mysql_store_result(con);
88 if (res_set == NULL) {
89 syslog(LOG_NOTICE, "MySQL: mysq_store_result error %u (%s))", mysql_errno(con), mysql_error(con));
90 } else {
91 // Process results
92 while ((row = mysql_fetch_row(res_set)) != NULL) {
93 node = (sys_node_list *)malloc(sizeof(sys_node_list));
94 memset(node, 0, sizeof(sys_node_list));
95 node->next = NULL;
96 node->uuid = xstrcpy(row[1]);
97 node->node = xstrcpy(row[2]);
98 node->online = false; // Will be set using MQTT
99 node->group_id = xstrcpy(row[4]);
100 node->hardwaremake = xstrcpy(row[5]);
101 node->hardwaremodel = xstrcpy(row[6]);
102 node->os = xstrcpy(row[7]);
103 node->os_version = xstrcpy(row[8]);
104 node->firmware = xstrcpy(row[9]);
105 node->firstseen = datetime_to_time_t(row[10]);
106 node->lastseen = datetime_to_time_t(row[11]);
107 node->temperature = atof(row[12]);
108 node->humidity = atof(row[13]);
109 node->barometer = atof(row[14]);
110 node->gps_latitude = atof(row[15]);
111 node->gps_longitude = atof(row[16]);
112 node->gps_altitude = atof(row[17]);
113 node->net_address = xstrcpy(row[18]);
114 node->net_ifname = xstrcpy(row[19]);
115 node->net_rssi = atoi(row[20]);
116
117 if (nodes == NULL) {
118 nodes = node;
119 } else {
120 for (tmpp = nodes; tmpp; tmpp = tmpp->next) {
121 if (tmpp->next == NULL) {
122 tmpp->next = node;
123 break;
124 }
125 }
126 }
127 ncnt++;
128 }
129 mysql_free_result(res_set);
130 }
131 }
132
133 if (mysql_query(con, "SELECT * FROM fermenters")) {
134 syslog(LOG_NOTICE, "MySQL: SELECT * FROM fermenters error %u (%s))", mysql_errno(con), mysql_error(con));
135 } else {
136 res_set = mysql_store_result(con);
137 if (res_set == NULL) {
138 syslog(LOG_NOTICE, "MySQL: mysq_store_result error %u (%s))", mysql_errno(con), mysql_error(con));
139 } else {
140 while ((row = mysql_fetch_row(res_set)) != NULL) {
141 fermenter = (sys_fermenter_list *)malloc(sizeof(sys_fermenter_list));
142 memset(fermenter, 0, sizeof(sys_fermenter_list));
143 fermenter->next = NULL;
144 fermenter->uuid = xstrcpy(row[1]);
145 fermenter->alias = xstrcpy(row[2]);
146 fermenter->node = xstrcpy(row[3]);
147 fermenter->online = false; // Will be set later
148 fermenter->beercode = xstrcpy(row[5]);
149 fermenter->beername = xstrcpy(row[6]);
150 if (strlen(row[7])) {
151 fermenter->air_address = xstrcpy(row[7]);
152 fermenter->air_state = xstrcpy(row[8]);
153 fermenter->air_temperature = atof(row[9]);
154 }
155 if (strlen(row[10])) {
156 fermenter->beer_address = xstrcpy(row[10]);
157 fermenter->beer_state = xstrcpy(row[11]);
158 fermenter->beer_temperature = atof(row[12]);
159 }
160 if (strlen(row[13])) {
161 fermenter->chiller_address = xstrcpy(row[13]);
162 fermenter->chiller_state = xstrcpy(row[14]);
163 fermenter->chiller_temperature = atof(row[15]);
164 }
165 if (strlen(row[16])) {
166 fermenter->heater_address = xstrcpy(row[16]);
167 fermenter->heater_state = atoi(row[17]);
168 fermenter->heater_usage = atoi(row[18]);
169 }
170 if (strlen(row[19])) {
171 fermenter->cooler_address = xstrcpy(row[19]);
172 fermenter->cooler_state = atoi(row[20]);
173 fermenter->cooler_usage = atoi(row[21]);
174 }
175 if (strlen(row[22])) {
176 fermenter->fan_address = xstrcpy(row[22]);
177 fermenter->fan_state = atoi(row[23]);
178 fermenter->fan_usage = atoi(row[24]);
179 }
180 if (strlen(row[25])) {
181 fermenter->light_address = xstrcpy(row[25]);
182 fermenter->light_state = atoi(row[26]);
183 fermenter->light_usage = atoi(row[27]);
184 }
185 if (strlen(row[28])) {
186 fermenter->door_address = xstrcpy(row[28]);
187 fermenter->door_state = atoi(row[29]);
188 }
189 if (strlen(row[30])) {
190 fermenter->psu_address = xstrcpy(row[30]);
191 fermenter->psu_state = atoi(row[31]);
192 }
193 fermenter->mode = xstrcpy(row[32]);
194 fermenter->alarm = atoi(row[33]);
195 fermenter->setpoint_high = atof(row[34]);
196 fermenter->setpoint_low = atof(row[35]);
197 if (strlen(row[36])) {
198 fermenter->profile_uuid = xstrcpy(row[36]);
199 fermenter->profile_name = xstrcpy(row[37]);
200 fermenter->profile_state = xstrcpy(row[38]);
201 fermenter->profile_percent = atoi(row[39]);
202 fermenter->profile_inittemp_high = atof(row[40]);
203 fermenter->profile_inittemp_low = atof(row[41]);
204 fermenter->profile_steps = xstrcpy(row[42]);
205 }
206 fermenter->stage = xstrcpy(row[43]);
207
208 if (fermenters == NULL) {
209 fermenters = fermenter;
210 } else {
211 for (tmpf = fermenters; tmpf; tmpf = tmpf->next) {
212 if (tmpf->next == NULL) {
213 tmpf->next = fermenter;
214 break;
215 }
216 }
217 }
218 fcnt++;
219 }
220 mysql_free_result(res_set);
221 }
222 }
223
224 syslog(LOG_NOTICE, "MySQL: loaded %d nodes, %d fermenters", ncnt, fcnt);
225 return 0;
226 }
227
228
229
230 void bms_mysql_end(void)
231 {
232 sys_fermenter_list *tmpf, *oldtmpf;
233 sys_node_list *tmpn, *oldtmpn;
234
235 mysql_close(con);
236
237 syslog(LOG_NOTICE, "MySQL: disconnected");
238 if (debug)
239 fprintf(stdout, "MySQL: disconnected\n");
240
241 for (tmpf = fermenters; tmpf; tmpf = oldtmpf) {
242 oldtmpf = tmpf->next;
243 if (tmpf->uuid)
244 free(tmpf->uuid);
245 if (tmpf->alias)
246 free(tmpf->alias);
247 if (tmpf->node)
248 free(tmpf->node);
249 if (tmpf->beercode)
250 free(tmpf->beercode);
251 if (tmpf->beername)
252 free(tmpf->beername);
253 if (tmpf->air_address)
254 free(tmpf->air_address);
255 if (tmpf->air_state)
256 free(tmpf->air_state);
257 if (tmpf->beer_address)
258 free(tmpf->beer_address);
259 if (tmpf->beer_state)
260 free(tmpf->beer_state);
261 if (tmpf->chiller_address)
262 free(tmpf->chiller_address);
263 if (tmpf->chiller_state)
264 free(tmpf->chiller_state);
265 if (tmpf->heater_address)
266 free(tmpf->heater_address);
267 if (tmpf->cooler_address)
268 free(tmpf->cooler_address);
269 if (tmpf->fan_address)
270 free(tmpf->fan_address);
271 if (tmpf->light_address)
272 free(tmpf->light_address);
273 if (tmpf->door_address)
274 free(tmpf->door_address);
275 if (tmpf->psu_address)
276 free(tmpf->psu_address);
277 if (tmpf->mode)
278 free(tmpf->mode);
279 if (tmpf->stage)
280 free(tmpf->stage);
281 if (tmpf->profile_uuid)
282 free(tmpf->profile_uuid);
283 if (tmpf->profile_name)
284 free(tmpf->profile_name);
285 if (tmpf->profile_state)
286 free(tmpf->profile_state);
287 if (tmpf->profile_steps)
288 free(tmpf->profile_steps);
289 free(tmpf);
290 }
291 for (tmpn = nodes; tmpn; tmpn = oldtmpn) {
292 oldtmpn = tmpn->next;
293 if (tmpn->uuid)
294 free(tmpn->uuid);
295 if (tmpn->node)
296 free(tmpn->node);
297 if (tmpn->group_id)
298 free(tmpn->group_id);
299 if (tmpn->hardwaremake)
300 free(tmpn->hardwaremake);
301 if (tmpn->hardwaremodel)
302 free(tmpn->hardwaremodel);
303 if (tmpn->os)
304 free(tmpn->os);
305 if (tmpn->os_version)
306 free(tmpn->os_version);
307 if (tmpn->firmware)
308 free(tmpn->firmware);
309 if (tmpn->net_address)
310 free(tmpn->net_address);
311 if (tmpn->net_ifname)
312 free(tmpn->net_ifname);
313 free(tmpn);
314 }
315 }
316
317
318
319 void bms_mysql_ping(void)
320 {
321 }
322
323
324
325 void node_mysql_insert(sys_node_list *node)
326 {
327 char *query = malloc(512), first[21], last[21];
328 struct tm *mytime;
329
330 mytime = localtime(&node->firstseen);
331 snprintf(first, 20, "%04d-%02d-%02d %02d:%02d:%02d",
332 mytime->tm_year + 1900, mytime->tm_mon + 1, mytime->tm_mday, mytime->tm_hour, mytime->tm_min, mytime->tm_sec);
333 mytime = localtime(&node->lastseen);
334 snprintf(last, 20, "%04d-%02d-%02d %02d:%02d:%02d",
335 mytime->tm_year + 1900, mytime->tm_mon + 1, mytime->tm_mday, mytime->tm_hour, mytime->tm_min, mytime->tm_sec);
336
337 snprintf(query, 511,
338 "INSERT INTO nodes SET uuid='%s', node='%s', online='%s', group_id='%s', " \
339 "hardwaremake='%s', hardwaremodel='%s', os='%s', os_version='%s', firmware='%s', firstseen='%s', lastseen='%s', " \
340 "temperature='%.3f', humidity='%.3f', barometer='%.3f', gps_latitude='%.8f', gps_longitude='%.8f', gps_altitude='%.8f', " \
341 "net_address='%s', net_ifname='%s', net_rssi='%d'",
342 node->uuid, node->node, node->online ?"Y":"N", node->group_id,
343 node->hardwaremake, node->hardwaremodel, node->os, node->os_version, node->firmware, first, last,
344 node->temperature, node->humidity, node->barometer, node->gps_latitude, node->gps_longitude, node->gps_altitude,
345 node->net_address, node->net_ifname, node->net_rssi);
346
347 if (mysql_query(con, query)) {
348 syslog(LOG_NOTICE, "MySQL: INSERT INTO nodes error %u (%s))", mysql_errno(con), mysql_error(con));
349 } else {
350 syslog(LOG_NOTICE, "MySQL: insert new node %s", node->node);
351 }
352
353 free(query);
354 }
355
356
357
358 void node_mysql_update(sys_node_list *node)
359 {
360 char *query = malloc(512), last[21];
361 struct tm *mytime;
362
363 mytime = localtime(&node->lastseen);
364 snprintf(last, 20, "%04d-%02d-%02d %02d:%02d:%02d",
365 mytime->tm_year + 1900, mytime->tm_mon + 1, mytime->tm_mday, mytime->tm_hour, mytime->tm_min, mytime->tm_sec);
366
367 snprintf(query, 511,
368 "UPDATE nodes SET online='%s', hardwaremake='%s', hardwaremodel='%s', os='%s', os_version='%s', firmware='%s', lastseen='%s', " \
369 "temperature='%.3f', humidity='%.3f', barometer='%.3f', gps_latitude='%.8f', gps_longitude='%.8f', gps_altitude='%.8f', " \
370 "net_address='%s', net_ifname='%s', net_rssi='%d' WHERE uuid='%s'",
371 node->online ?"Y":"N", node->hardwaremake, node->hardwaremodel, node->os, node->os_version, node->firmware, last,
372 node->temperature, node->humidity, node->barometer, node->gps_latitude, node->gps_longitude, node->gps_altitude,
373 node->net_address, node->net_ifname, node->net_rssi, node->uuid);
374
375 if (mysql_query(con, query)) {
376 syslog(LOG_NOTICE, "MySQL: UPDATE nodes error %u (%s))", mysql_errno(con), mysql_error(con));
377 }
378
379 free(query);
380 }
381
382
383
384 void node_mysql_death(char *node)
385 {
386 char *query = malloc(512);
387
388 snprintf(query, 511, "UPDATE nodes SET online='N' WHERE node='%s'", node);
389 // printf("%s\n", query);
390
391 if (mysql_query(con, query)) {
392 syslog(LOG_NOTICE, "MySQL: UPDATE nodes error %u (%s))", mysql_errno(con), mysql_error(con));
393 }
394
395 free(query);
396 }
397
398
399
400 void fermenter_mysql_insert(sys_fermenter_list *fermenter)
401 {
402 char *query = malloc(2560);
403
404 snprintf(query, 2559,
405 "INSERT INTO fermenters SET uuid='%s', alias='%s', node='%s', online='%s', " \
406 "beercode='%s', beername='%s', " \
407 "air_address='%s', air_state='%s', air_temperature='%.3f', " \
408 "beer_address='%s', beer_state='%s', beer_temperature='%.3f', " \
409 "chiller_address='%s', chiller_state='%s', chiller_temperature='%.3f', " \
410 "heater_address='%s', heater_state='%d', heater_usage='%lu', " \
411 "cooler_address='%s', cooler_state='%d', cooler_usage='%lu', " \
412 "fan_address='%s', fan_state='%d', fan_usage='%lu', " \
413 "light_address='%s', light_state='%d', light_usage='%lu', " \
414 "door_address='%s', door_state='%d', " \
415 "psu_address='%s', psu_state='%d', " \
416 "mode='%s', alarm='%d', setpoint_high='%.3f', setpoint_low='%.3f', " \
417 "profile_uuid='%s', profile_name='%s', profile_state='%s', profile_percent='%d', " \
418 "profile_inittemp_high='%.3f', profile_inittemp_low='%.3f', profile_steps='%s', stage='%s'",
419 fermenter->uuid, fermenter->alias, fermenter->node, fermenter->online ? "Y":"N",
420 fermenter->beercode ? fermenter->beercode : "", fermenter->beername ? fermenter->beername : "",
421 fermenter->air_address ? fermenter->air_address : "", fermenter->air_state ? fermenter->air_state : "", fermenter->air_temperature,
422 fermenter->beer_address ? fermenter->beer_address : "", fermenter->beer_state ? fermenter->beer_state : "", fermenter->beer_temperature,
423 fermenter->chiller_address ? fermenter->chiller_address : "", fermenter->chiller_state ? fermenter->chiller_state : "", fermenter->chiller_temperature,
424 fermenter->heater_address ? fermenter->heater_address : "", fermenter->heater_state, fermenter->heater_usage,
425 fermenter->cooler_address ? fermenter->cooler_address : "", fermenter->cooler_state, fermenter->cooler_usage,
426 fermenter->fan_address ? fermenter->fan_address : "", fermenter->fan_state, fermenter->fan_usage,
427 fermenter->light_address ? fermenter->light_address : "", fermenter->light_state, fermenter->light_usage,
428 fermenter->door_address ? fermenter->door_address : "", fermenter->door_state,
429 fermenter->psu_address ? fermenter->psu_address : "", fermenter->psu_state,
430 fermenter->mode, fermenter->alarm, fermenter->setpoint_high, fermenter->setpoint_low,
431 fermenter->profile_uuid ? fermenter->profile_uuid : "", fermenter->profile_name ? fermenter->profile_name : "",
432 fermenter->profile_state ? fermenter->profile_state : "", fermenter->profile_percent,
433 fermenter->profile_inittemp_high, fermenter->profile_inittemp_low,
434 fermenter->profile_steps ? fermenter->profile_steps : "", fermenter->stage);
435
436 // printf("%s\n", query);
437
438 if (mysql_query(con, query)) {
439 syslog(LOG_NOTICE, "MySQL: INSERT INTO fermenters error %u (%s))", mysql_errno(con), mysql_error(con));
440 } else {
441 syslog(LOG_NOTICE, "MySQL: insert new fermenter %s/%s", fermenter->node, fermenter->alias);
442 }
443
444 free(query);
445 }
446
447
448 void fermenter_mysql_update(sys_fermenter_list *fermenter)
449 {
450 char *query = malloc(2560);
451
452 snprintf(query, 2559,
453 "UPDATE fermenters SET online='%s', beercode='%s', beername='%s', " \
454 "air_address='%s', air_state='%s', air_temperature='%.3f', " \
455 "beer_address='%s', beer_state='%s', beer_temperature='%.3f', " \
456 "chiller_address='%s', chiller_state='%s', chiller_temperature='%.3f', " \
457 "heater_address='%s', heater_state='%d', heater_usage='%lu', " \
458 "cooler_address='%s', cooler_state='%d', cooler_usage='%lu', " \
459 "fan_address='%s', fan_state='%d', fan_usage='%lu', " \
460 "light_address='%s', light_state='%d', light_usage='%lu', " \
461 "door_address='%s', door_state='%d', " \
462 "psu_address='%s', psu_state='%d', " \
463 "mode='%s', alarm='%d', setpoint_high='%.3f', setpoint_low='%.3f', " \
464 "profile_uuid='%s', profile_name='%s', profile_state='%s', profile_percent='%d', " \
465 "profile_inittemp_high='%.3f', profile_inittemp_low='%.3f', profile_steps='%s', stage='%s' WHERE uuid='%s'",
466 fermenter->online ? "Y":"N", fermenter->beercode ? fermenter->beercode : "", fermenter->beername ? fermenter->beername : "",
467 fermenter->air_address ? fermenter->air_address : "", fermenter->air_state ? fermenter->air_state : "", fermenter->air_temperature,
468 fermenter->beer_address ? fermenter->beer_address : "", fermenter->beer_state ? fermenter->beer_state : "", fermenter->beer_temperature,
469 fermenter->chiller_address ? fermenter->chiller_address : "", fermenter->chiller_state ? fermenter->chiller_state : "", fermenter->chiller_temperature,
470 fermenter->heater_address ? fermenter->heater_address : "", fermenter->heater_state, fermenter->heater_usage,
471 fermenter->cooler_address ? fermenter->cooler_address : "", fermenter->cooler_state, fermenter->cooler_usage,
472 fermenter->fan_address ? fermenter->fan_address : "", fermenter->fan_state, fermenter->fan_usage,
473 fermenter->light_address ? fermenter->light_address : "", fermenter->light_state, fermenter->light_usage,
474 fermenter->door_address ? fermenter->door_address : "", fermenter->door_state,
475 fermenter->psu_address ? fermenter->psu_address : "", fermenter->psu_state,
476 fermenter->mode, fermenter->alarm, fermenter->setpoint_high, fermenter->setpoint_low,
477 fermenter->profile_uuid ? fermenter->profile_uuid : "", fermenter->profile_name ? fermenter->profile_name : "",
478 fermenter->profile_state ? fermenter->profile_state : "", fermenter->profile_percent,
479 fermenter->profile_inittemp_high, fermenter->profile_inittemp_low,
480 fermenter->profile_steps ? fermenter->profile_steps : "", fermenter->stage, fermenter->uuid);
481
482 // printf("%s\n", query);
483
484 if (mysql_query(con, query)) {
485 syslog(LOG_NOTICE, "MySQL: UPDATE fermenters error %u (%s))", mysql_errno(con), mysql_error(con));
486 }
487
488 free(query);
489 }
490
491
492
493 void fermenter_mysql_death(char *node, char *alias)
494 {
495 char *query = malloc(512);
496
497 if (alias)
498 snprintf(query, 511, "UPDATE fermenters SET online='N' WHERE node='%s' and alias='%s'", node, alias);
499 else
500 snprintf(query, 511, "UPDATE fermenters SET online='N' WHERE node='%s'", node);
501
502 if (mysql_query(con, query)) {
503 syslog(LOG_NOTICE, "MySQL: UPDATE fermenters error %u (%s))", mysql_errno(con), mysql_error(con));
504 }
505
506 free(query);
507 }
508
509
510
511 void fermentation_mysql_log(fermentation_log *log)
512 {
513 char *query, buf[65];
514
515 query = xstrcpy((char *)"INSERT INTO log_fermentation SET datetime='");
516 query = xstrcat(query, log->datetime);
517 query = xstrcat(query, (char *)":00");
518 if (log->product_uuid) {
519 query = xstrcat(query, (char *)"', product_uuid='");
520 query = xstrcat(query, log->product_uuid);
521 }
522 if (log->product_code) {
523 query = xstrcat(query, (char *)"', product_code='");
524 query = xstrcat(query, log->product_code);
525 }
526 if (log->product_name) {
527 query = xstrcat(query, (char *)"', product_name='");
528 query = xstrcat(query, log->product_name);
529 }
530 query = xstrcat(query, (char *)"', stage='");
531 query = xstrcat(query, log->stage);
532 query = xstrcat(query, (char *)"', mode='");
533 query = xstrcat(query, log->mode);
534 query = xstrcat(query, (char *)"', temperature_beer='");
535 snprintf(buf, 64, "%.3f", log->temperature_beer);
536 query = xstrcat(query, buf);
537 query = xstrcat(query, (char *)"', temperature_air='");
538 snprintf(buf, 64, "%.3f", log->temperature_air);
539 query = xstrcat(query, buf);
540 query = xstrcat(query, (char *)"', temperature_chiller='");
541 snprintf(buf, 64, "%.3f", log->temperature_chiller);
542 query = xstrcat(query, buf);
543 query = xstrcat(query, (char *)"', temperature_room='");
544 snprintf(buf, 64, "%.3f", log->temperature_room);
545 query = xstrcat(query, buf);
546 query = xstrcat(query, (char *)"', target_low='");
547 snprintf(buf, 64, "%.1f", log->setpoint_low);
548 query = xstrcat(query, buf);
549 query = xstrcat(query, (char *)"', target_high='");
550 snprintf(buf, 64, "%.1f", log->setpoint_high);
551 query = xstrcat(query, buf);
552 query = xstrcat(query, (char *)"', heater_power='");
553 snprintf(buf, 64, "%d", log->heater_power);
554 query = xstrcat(query, buf);
555 query = xstrcat(query, (char *)"', heater_usage='");
556 snprintf(buf, 64, "%ld", log->heater_usage);
557 query = xstrcat(query, buf);
558 query = xstrcat(query, (char *)"', cooler_power='");
559 snprintf(buf, 64, "%d", log->cooler_power);
560 query = xstrcat(query, buf);
561 query = xstrcat(query, (char *)"', cooler_usage='");
562 snprintf(buf, 64, "%ld", log->cooler_usage);
563 query = xstrcat(query, buf);
564 query = xstrcat(query, (char *)"', fan_power='");
565 snprintf(buf, 64, "%d", log->fan_power);
566 query = xstrcat(query, buf);
567 query = xstrcat(query, (char *)"', fan_usage='");
568 snprintf(buf, 64, "%ld", log->fan_usage);
569 query = xstrcat(query, buf);
570 query = xstrcat(query, (char *)"'");
571 // sg
572 if (log->event) {
573 query = xstrcat(query, (char *)", event='");
574 query = xstrcat(query, log->event);
575 query = xstrcat(query, (char *)"'");
576 }
577 if (log->fermenter_uuid) {
578 query = xstrcat(query, (char *)", fermenter_uuid='");
579 query = xstrcat(query, log->fermenter_uuid);
580 query = xstrcat(query, (char *)"'");
581 }
582 if (log->fermenter_node) {
583 query = xstrcat(query, (char *)", fermenter_node='");
584 query = xstrcat(query, log->fermenter_node);
585 query = xstrcat(query, (char *)"'");
586 }
587 if (log->fermenter_alias) {
588 query = xstrcat(query, (char *)", fermenter_alias='");
589 query = xstrcat(query, log->fermenter_alias);
590 query = xstrcat(query, (char *)"'");
591 }
592
593 if (mysql_real_query(con, query, strlen(query))) {
594 syslog(LOG_NOTICE, "MySQL: `%s' error %u (%s)\n)", query, mysql_errno(con), mysql_error(con));
595 }
596
597 free(query);
598 }
599
600

mercurial