# HG changeset patch # User Michiel Broek # Date 1560189852 -7200 # Node ID ef3f0274a1ea5f7258c329d488c8b85d2bb6f119 # Parent 39a688b8d0692fe527d26092512860da5c67dd0b Added a private mysql_query function that does try to reconnect a lost MySQL connection. diff -r 39a688b8d069 -r ef3f0274a1ea bmsd/mysql.c --- a/bmsd/mysql.c Wed Jun 05 20:24:16 2019 +0200 +++ b/bmsd/mysql.c Mon Jun 10 20:04:12 2019 +0200 @@ -325,6 +325,38 @@ +int bms_mysql_query(const char *query) +{ + int rc = mysql_query(con, query); + + if (rc) { + syslog(LOG_NOTICE, "MySQL: error %u (%s)", mysql_errno(con), mysql_error(con)); + syslog(LOG_NOTICE, query); + } else { + return 0; + } + + /* Any error execpt server gone away */ + if (rc != 2006) + return rc; + + /* Try to reconnect and do the query again */ + mysql_close(con); + if (mysql_real_connect(con, Config.mysql_host, Config.mysql_user, Config.mysql_pass, Config.mysql_database, Config.mysql_port, NULL, 0) == NULL) { + syslog(LOG_NOTICE, "MySQL: mysql_real_connect() %s", mysql_error(con)); + return 2; + } + syslog(LOG_NOTICE, "MySQL: reconnected."); + rc = mysql_query(con, query); + if (rc) { + syslog(LOG_NOTICE, "MySQL: error %u (%s)", mysql_errno(con), mysql_error(con)); + syslog(LOG_NOTICE, query); + } + return rc; +} + + + void bms_mysql_ping(void) { } @@ -353,10 +385,7 @@ node->temperature, node->humidity, node->barometer, node->gps_latitude, node->gps_longitude, node->gps_altitude, node->net_address, node->net_ifname, node->net_rssi); - if (mysql_query(con, query)) { - syslog(LOG_NOTICE, "MySQL: INSERT INTO mon_nodes error %u (%s))", mysql_errno(con), mysql_error(con)); - syslog(LOG_NOTICE, query); - } else { + if (bms_mysql_query(query) == 0) { syslog(LOG_NOTICE, "MySQL: insert new node %s", node->node); } @@ -382,11 +411,7 @@ node->temperature, node->humidity, node->barometer, node->gps_latitude, node->gps_longitude, node->gps_altitude, node->net_address, node->net_ifname, node->net_rssi, node->uuid); - if (mysql_query(con, query)) { - syslog(LOG_NOTICE, "MySQL: UPDATE mon_nodes error %u (%s))", mysql_errno(con), mysql_error(con)); - syslog(LOG_NOTICE, query); - } - + bms_mysql_query(query); free(query); } @@ -397,12 +422,7 @@ char *query = malloc(512); snprintf(query, 511, "UPDATE mon_nodes SET online='N' WHERE node='%s'", node); - - if (mysql_query(con, query)) { - syslog(LOG_NOTICE, "MySQL: UPDATE mon_nodes error %u (%s))", mysql_errno(con), mysql_error(con)); - syslog(LOG_NOTICE, query); - } - + bms_mysql_query(query); free(query); } @@ -447,13 +467,9 @@ fermenter->profile_steps ? fermenter->profile_steps : "", fermenter->stage, fermenter->yeast_lo, fermenter->yeast_hi, fermenter->webcam_url ? fermenter->webcam_url : "", fermenter->webcam_light); - if (mysql_query(con, query)) { - syslog(LOG_NOTICE, "MySQL: INSERT INTO mon_fermenters error %u (%s))", mysql_errno(con), mysql_error(con)); - syslog(LOG_NOTICE, query); - } else { + if (bms_mysql_query(query) == 0) { syslog(LOG_NOTICE, "MySQL: insert new fermenter %s/%s", fermenter->node, fermenter->alias); } - free(query); } @@ -495,11 +511,7 @@ fermenter->profile_steps ? fermenter->profile_steps : "", fermenter->stage, fermenter->yeast_lo, fermenter->yeast_hi, fermenter->webcam_url ? fermenter->webcam_url : "", fermenter->webcam_light, fermenter->uuid); - if (mysql_query(con, query)) { - syslog(LOG_NOTICE, "MySQL: UPDATE mon_fermenters error %u (%s))", mysql_errno(con), mysql_error(con)); - syslog(LOG_NOTICE, query); - } - + bms_mysql_query(query); free(query); } @@ -514,11 +526,7 @@ else snprintf(query, 511, "UPDATE mon_fermenters SET online='N' WHERE node='%s'", node); - if (mysql_query(con, query)) { - syslog(LOG_NOTICE, "MySQL: UPDATE mon_fermenters error %u (%s))", mysql_errno(con), mysql_error(con)); - syslog(LOG_NOTICE, query); - } - + bms_mysql_query(query); free(query); } diff -r 39a688b8d069 -r ef3f0274a1ea bmsd/mysql.h --- a/bmsd/mysql.h Wed Jun 05 20:24:16 2019 +0200 +++ b/bmsd/mysql.h Mon Jun 10 20:04:12 2019 +0200 @@ -18,6 +18,13 @@ void bms_mysql_end(void); /** + * @brief Send query to the MySQL server with one reconnect attempt. + * @param query The SQL query to send. + * @return Return 0 if no error, else the error code. + */ +int bms_mysql_query(const char *query); + +/** * @brief Ping MySQL connection and try to reconnect if the connection is broken. */ void bms_mysql_ping(void);