Module: monitoring-plugins
 Branch: master
 Commit: 071de8a73a283ac7e262194c2c08fabfef4473b1
 Author: Lorenz Kästle <[email protected]>
   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;
 

Reply via email to