Added a private mysql_query function that does try to reconnect a lost MySQL connection.

Mon, 10 Jun 2019 20:04:12 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Mon, 10 Jun 2019 20:04:12 +0200
changeset 405
ef3f0274a1ea
parent 404
39a688b8d069
child 406
0ad967f2d6ee

Added a private mysql_query function that does try to reconnect a lost MySQL connection.

bmsd/mysql.c file | annotate | diff | comparison | revisions
bmsd/mysql.h file | annotate | diff | comparison | revisions
--- 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);
 }
 
--- 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);

mercurial