[monitoring-plugins] check_dbi: more refactoring for sanities sake

Lorenz Kästle git at monitoring-plugins.org
Fri Nov 7 14:20:12 CET 2025


 Module: monitoring-plugins
 Branch: master
 Commit: 071de8a73a283ac7e262194c2c08fabfef4473b1
 Author: Lorenz Kästle <12514511+RincewindsHat at users.noreply.github.com>
   Date: Wed Oct 29 23:27:12 2025 +0100
    URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=071de8a7

check_dbi: more refactoring for sanities sake

---

 plugins/check_dbi.c | 168 ++++++++++++++++------------------------------------
 1 file changed, 51 insertions(+), 117 deletions(-)

diff --git a/plugins/check_dbi.c b/plugins/check_dbi.c
index 035e30cd..ddd0b328 100644
--- a/plugins/check_dbi.c
+++ b/plugins/check_dbi.c
@@ -358,7 +358,7 @@ int main(int argc, char **argv) {
 						// so we expected a number
 						// this is a CRITICAL
 						xasprintf(&sc_query.output, "Query '%s' result is not numeric",
-								  config.dbi_query, query_res.result_string);
+								  config.dbi_query);
 						sc_query = mp_set_subcheck_state(sc_query, STATE_CRITICAL);
 
 					} else {
@@ -490,7 +490,6 @@ check_dbi_config_wrapper process_arguments(int argc, char **argv) {
 			}
 			break;
 		}
-
 		case 'm':
 			if (!strcasecmp(optarg, "CONN_TIME")) {
 				result.config.metric = METRIC_CONN_TIME;
@@ -510,7 +509,6 @@ check_dbi_config_wrapper process_arguments(int argc, char **argv) {
 			} else {
 				timeout_interval = atoi(optarg);
 			}
-
 			break;
 		case 'H': /* host */
 			if (!is_host(optarg)) {
@@ -522,7 +520,6 @@ check_dbi_config_wrapper process_arguments(int argc, char **argv) {
 		case 'v':
 			verbose++;
 			break;
-
 		case 'd':
 			result.config.dbi_driver = optarg;
 			break;
@@ -718,21 +715,12 @@ void print_usage(void) {
 	printf(" [-e <string>] [-r|-R <regex>]\n");
 }
 
-const char *get_field_str(dbi_conn conn, dbi_result res, unsigned short field_type,
-						  mp_dbi_metric metric, mp_dbi_type type) {
-	const char *str;
-
-	if (field_type != DBI_TYPE_STRING) {
-		printf("CRITICAL - result value is not a string\n");
-		return NULL;
-	}
-
-	str = dbi_result_get_string_idx(res, 1);
+const char *get_field_str(dbi_result res, mp_dbi_metric metric, mp_dbi_type type) {
+	const char *str = dbi_result_get_string_idx(res, 1);
 	if ((!str) || (strcmp(str, "ERROR") == 0)) {
 		if (metric != METRIC_QUERY_RESULT) {
 			return NULL;
 		}
-		np_dbi_print_error(conn, "CRITICAL - failed to fetch string value");
 		return NULL;
 	}
 
@@ -742,36 +730,50 @@ const char *get_field_str(dbi_conn conn, dbi_result res, unsigned short field_ty
 	return str;
 }
 
-double get_field(dbi_conn conn, dbi_result res, unsigned short *field_type, mp_dbi_metric metric,
-				 mp_dbi_type type) {
-	double val = NAN;
+typedef struct {
+	double value;
+	int error_code;
+	int dbi_error_code; // not sure if useful
+} get_field_wrapper;
+get_field_wrapper get_field(dbi_result res, mp_dbi_metric metric, mp_dbi_type type) {
+
+	unsigned short field_type = dbi_result_get_field_type_idx(res, 1);
+	get_field_wrapper result = {
+		.value = NAN,
+		.error_code = OK,
+	};
 
-	if (*field_type == DBI_TYPE_INTEGER) {
-		val = (double)dbi_result_get_longlong_idx(res, 1);
-	} else if (*field_type == DBI_TYPE_DECIMAL) {
-		val = dbi_result_get_double_idx(res, 1);
-	} else if (*field_type == DBI_TYPE_STRING) {
+	if (field_type == DBI_TYPE_INTEGER) {
+		result.value = (double)dbi_result_get_longlong_idx(res, 1);
+	} else if (field_type == DBI_TYPE_DECIMAL) {
+		result.value = dbi_result_get_double_idx(res, 1);
+	} else if (field_type == DBI_TYPE_STRING) {
 		const char *val_str;
 		char *endptr = NULL;
 
-		val_str = get_field_str(conn, res, *field_type, metric, type);
+		val_str = get_field_str(res, metric, type);
 		if (!val_str) {
-			if (metric != METRIC_QUERY_RESULT) {
-				return NAN;
-			}
-			*field_type = DBI_TYPE_ERROR;
-			return NAN;
+			result.error_code = ERROR;
+			field_type = DBI_TYPE_ERROR;
+			return result;
 		}
 
-		val = strtod(val_str, &endptr);
+		result.value = strtod(val_str, &endptr);
 		if (endptr == val_str) {
 			if (metric != METRIC_QUERY_RESULT) {
-				return NAN;
+				result.error_code = ERROR;
+				return result;
 			}
-			printf("CRITICAL - result value is not a numeric: %s\n", val_str);
-			*field_type = DBI_TYPE_ERROR;
-			return NAN;
+
+			if (verbose) {
+				printf("CRITICAL - result value is not a numeric: %s\n", val_str);
+			}
+
+			field_type = DBI_TYPE_ERROR;
+			result.error_code = ERROR;
+			return result;
 		}
+
 		if ((endptr != NULL) && (*endptr != '\0')) {
 			if (verbose) {
 				printf("Garbage after value: %s\n", endptr);
@@ -779,86 +781,18 @@ double get_field(dbi_conn conn, dbi_result res, unsigned short *field_type, mp_d
 		}
 	} else {
 		if (metric != METRIC_QUERY_RESULT) {
-			return NAN;
+			result.error_code = ERROR;
+			return result;
 		}
-		printf("CRITICAL - cannot parse value of type %s (%i)\n",
-			   (*field_type == DBI_TYPE_BINARY)     ? "BINARY"
-			   : (*field_type == DBI_TYPE_DATETIME) ? "DATETIME"
-													: "<unknown>",
-			   *field_type);
-		*field_type = DBI_TYPE_ERROR;
-		return NAN;
-	}
-	return val;
-}
-
-mp_state_enum get_query_result(dbi_conn conn, dbi_result res, const char **res_val_str,
-							   double *res_val, mp_dbi_metric metric, mp_dbi_type type) {
-	unsigned short field_type;
-	double val = NAN;
-
-	if (dbi_result_get_numrows(res) == DBI_ROW_ERROR) {
-		if (metric != METRIC_QUERY_RESULT) {
-			return STATE_OK;
-		}
-		np_dbi_print_error(conn, "CRITICAL - failed to fetch rows");
-		return STATE_CRITICAL;
+		// printf("CRITICAL - cannot parse value of type %s (%i)\n",
+		// (*field_type == DBI_TYPE_BINARY)     ? "BINARY"
+		// : (*field_type == DBI_TYPE_DATETIME) ? "DATETIME"
+		// : "<unknown>",
+		// *field_type);
+		field_type = DBI_TYPE_ERROR;
+		result.error_code = ERROR;
 	}
-
-	if (dbi_result_get_numrows(res) < 1) {
-		if (metric != METRIC_QUERY_RESULT) {
-			return STATE_OK;
-		}
-		printf("WARNING - no rows returned\n");
-		return STATE_WARNING;
-	}
-
-	if (dbi_result_get_numfields(res) == DBI_FIELD_ERROR) {
-		if (metric != METRIC_QUERY_RESULT) {
-			return STATE_OK;
-		}
-		np_dbi_print_error(conn, "CRITICAL - failed to fetch fields");
-		return STATE_CRITICAL;
-	}
-
-	if (dbi_result_get_numfields(res) < 1) {
-		if (metric != METRIC_QUERY_RESULT) {
-			return STATE_OK;
-		}
-		printf("WARNING - no fields returned\n");
-		return STATE_WARNING;
-	}
-
-	if (dbi_result_first_row(res) != 1) {
-		if (metric != METRIC_QUERY_RESULT) {
-			return STATE_OK;
-		}
-		np_dbi_print_error(conn, "CRITICAL - failed to fetch first row");
-		return STATE_CRITICAL;
-	}
-
-	field_type = dbi_result_get_field_type_idx(res, 1);
-	if (field_type != DBI_TYPE_ERROR) {
-		if (type == TYPE_STRING) {
-			/* the value will be freed in dbi_result_free */
-			*res_val_str = strdup(get_field_str(conn, res, field_type, metric, type));
-		} else {
-			val = get_field(conn, res, &field_type, metric, type);
-		}
-	}
-
-	*res_val = val;
-
-	if (field_type == DBI_TYPE_ERROR) {
-		if (metric != METRIC_QUERY_RESULT) {
-			return STATE_OK;
-		}
-		np_dbi_print_error(conn, "CRITICAL - failed to fetch data");
-		return STATE_CRITICAL;
-	}
-
-	dbi_result_free(res);
-	return STATE_OK;
+	return result;
 }
 
 static do_query_result do_query(dbi_conn conn, mp_dbi_metric metric, mp_dbi_type type,
@@ -942,10 +876,10 @@ static do_query_result do_query(dbi_conn conn, mp_dbi_metric metric, mp_dbi_type
 			unsigned short field_type = dbi_result_get_field_type_idx(res, 1);
 			if (field_type != DBI_TYPE_ERROR) {
 				if (type == TYPE_STRING) {
-					result.result_string =
-						strdup(get_field_str(conn, res, field_type, metric, type));
+					result.result_string = strdup(get_field_str(res, metric, type));
 				} else {
-					result.result_number = get_field(conn, res, &field_type, metric, type);
+					get_field_wrapper gfw = get_field(res, metric, type);
+					result.result_number = gfw.value;
 				}
 			} else {
 				// Error when retrieving the field, that is OK if the Query result is not of
@@ -967,7 +901,7 @@ static do_query_result do_query(dbi_conn conn, mp_dbi_metric metric, mp_dbi_type
 	return result;
 }
 
-double timediff(struct timeval start, struct timeval end) {
+static double timediff(struct timeval start, struct timeval end) {
 	double diff;
 
 	while (start.tv_usec > end.tv_usec) {
@@ -978,7 +912,7 @@ double timediff(struct timeval start, struct timeval end) {
 	return diff;
 }
 
-void np_dbi_print_error(dbi_conn conn, char *fmt, ...) {
+static void np_dbi_print_error(dbi_conn conn, char *fmt, ...) {
 	const char *errmsg = NULL;
 	va_list ap;
 



More information about the Commits mailing list