bind plugin: Fixes for FreeBSD 7.1
[collectd.git] / src / utils_db_query.c
index e1ed7e6..c2897c7 100644 (file)
@@ -361,14 +361,6 @@ static void udb_result_submit (udb_result_t *r, udb_query_t *q) /* {{{ */
   assert (r->ds != NULL);
   assert (((size_t) r->ds->ds_num) == r->values_num);
 
-  DEBUG ("db query utils: udb_result_submit: r->instance_prefix = %s;",
-      (r->instance_prefix == NULL) ? "NULL" : r->instance_prefix);
-  for (i = 0; i < r->instances_num; i++)
-  {
-    DEBUG ("db query utils: udb_result_submit: r->instances_buffer[%zu] = %s;",
-        i, r->instances_buffer[i]);
-  }
-
   vl.values = (value_t *) calloc (r->ds->ds_num, sizeof (value_t));
   if (vl.values == NULL)
   {
@@ -405,22 +397,35 @@ static void udb_result_submit (udb_result_t *r, udb_query_t *q) /* {{{ */
   sstrncpy (vl.plugin_instance, q->db_name, sizeof (vl.type_instance));
   sstrncpy (vl.type, r->type, sizeof (vl.type));
 
-  if (r->instance_prefix == NULL)
+  /* Set vl.type_instance {{{ */
+  if (r->instances_num <= 0)
   {
-    strjoin (vl.type_instance, sizeof (vl.type_instance),
-        r->instances_buffer, r->instances_num, "-");
+    if (r->instance_prefix == NULL)
+      vl.type_instance[0] = 0;
+    else
+      sstrncpy (vl.type_instance, r->instance_prefix,
+          sizeof (vl.type_instance));
   }
-  else
+  else /* if ((r->instances_num > 0) */
   {
-    char tmp[DATA_MAX_NAME_LEN];
+    if (r->instance_prefix == NULL)
+    {
+      strjoin (vl.type_instance, sizeof (vl.type_instance),
+          r->instances_buffer, r->instances_num, "-");
+    }
+    else
+    {
+      char tmp[DATA_MAX_NAME_LEN];
 
-    strjoin (tmp, sizeof (tmp), r->instances_buffer, r->instances_num, "-");
-    tmp[sizeof (tmp) - 1] = 0;
+      strjoin (tmp, sizeof (tmp), r->instances_buffer, r->instances_num, "-");
+      tmp[sizeof (tmp) - 1] = 0;
 
-    snprintf (vl.type_instance, sizeof (vl.type_instance), "%s-%s",
-        r->instance_prefix, tmp);
+      snprintf (vl.type_instance, sizeof (vl.type_instance), "%s-%s",
+          r->instance_prefix, tmp);
+    }
   }
   vl.type_instance[sizeof (vl.type_instance) - 1] = 0;
+  /* }}} */
 
   plugin_dispatch_values (&vl);
 
@@ -517,12 +522,22 @@ static int udb_result_prepare_result (udb_result_t *r, /* {{{ */
 
   /* Allocate r->instances_pos, r->values_pos, r->instances_buffer, and
    * r->values_buffer {{{ */
-  r->instances_pos = (size_t *) calloc (r->instances_num, sizeof (size_t));
-  if (r->instances_pos == NULL)
+  if (r->instances_num > 0)
   {
-    ERROR ("db query utils: udb_result_prepare_result: malloc failed.");
-    BAIL_OUT (-ENOMEM);
-  }
+    r->instances_pos = (size_t *) calloc (r->instances_num, sizeof (size_t));
+    if (r->instances_pos == NULL)
+    {
+      ERROR ("db query utils: udb_result_prepare_result: malloc failed.");
+      BAIL_OUT (-ENOMEM);
+    }
+
+    r->instances_buffer = (char **) calloc (r->instances_num, sizeof (char *));
+    if (r->instances_buffer == NULL)
+    {
+      ERROR ("db query utils: udb_result_prepare_result: malloc failed.");
+      BAIL_OUT (-ENOMEM);
+    }
+  } /* if (r->instances_num > 0) */
 
   r->values_pos = (size_t *) calloc (r->values_num, sizeof (size_t));
   if (r->values_pos == NULL)
@@ -531,13 +546,6 @@ static int udb_result_prepare_result (udb_result_t *r, /* {{{ */
     BAIL_OUT (-ENOMEM);
   }
 
-  r->instances_buffer = (char **) calloc (r->instances_num, sizeof (char *));
-  if (r->instances_buffer == NULL)
-  {
-    ERROR ("db query utils: udb_result_prepare_result: malloc failed.");
-    BAIL_OUT (-ENOMEM);
-  }
-
   r->values_buffer = (char **) calloc (r->values_num, sizeof (char *));
   if (r->values_buffer == NULL)
   {
@@ -679,12 +687,6 @@ static int udb_result_create (const char *query_name, /* {{{ */
           "result in query `%s'", query_name);
       status = -1;
     }
-    if (r->instances == NULL)
-    {
-      WARNING ("db query utils: `InstancesFrom' not given for "
-          "result in query `%s'", query_name);
-      status = -1;
-    }
     if (r->values == NULL)
     {
       WARNING ("db query utils: `ValuesFrom' not given for "
@@ -918,63 +920,90 @@ void udb_query_free (udb_query_t **query_list, size_t query_list_len) /* {{{ */
   sfree (query_list);
 } /* }}} void udb_query_free */
 
-int udb_query_pick_from_list (oconfig_item_t *ci, /* {{{ */
+int udb_query_pick_from_list_by_name (const char *name, /* {{{ */
     udb_query_t **src_list, size_t src_list_len,
     udb_query_t ***dst_list, size_t *dst_list_len)
 {
-  const char *name;
-  udb_query_t *q;
-  udb_query_t **tmp_list;
-  size_t tmp_list_len;
   size_t i;
+  int num_added;
 
-  if ((ci == NULL) || (src_list == NULL) || (dst_list == NULL)
+  if ((name == NULL) || (src_list == NULL) || (dst_list == NULL)
       || (dst_list_len == NULL))
   {
-    ERROR ("db query utils: Invalid argument.");
+    ERROR ("db query utils: udb_query_pick_from_list_by_name: "
+        "Invalid argument.");
     return (-EINVAL);
   }
 
-  if ((ci->values_num != 1)
-      || (ci->values[0].type != OCONFIG_TYPE_STRING))
+  num_added = 0;
+  for (i = 0; i < src_list_len; i++)
   {
-    ERROR ("db query utils: The `%s' config option "
-        "needs exactly one string argument.", ci->key);
-    return (-1);
-  }
-  name = ci->values[0].value.string;
+    udb_query_t **tmp_list;
+    size_t tmp_list_len;
 
-  q = NULL;
-  for (i = 0; i < src_list_len; i++)
-    if (strcasecmp (name, src_list[i]->name) == 0)
+    if (strcasecmp (name, src_list[i]->name) != 0)
+      continue;
+
+    tmp_list_len = *dst_list_len;
+    tmp_list = (udb_query_t **) realloc (*dst_list, (tmp_list_len + 1)
+        * sizeof (udb_query_t *));
+    if (tmp_list == NULL)
     {
-      q = src_list[i];
-      break;
+      ERROR ("db query utils: realloc failed.");
+      return (-ENOMEM);
     }
 
-  if (q == NULL)
+    tmp_list[tmp_list_len] = src_list[i];
+    tmp_list_len++;
+
+    *dst_list = tmp_list;
+    *dst_list_len = tmp_list_len;
+
+    num_added++;
+  } /* for (i = 0; i < src_list_len; i++) */
+
+  if (num_added <= 0)
   {
-    ERROR ("db query utils: Cannot find query `%s'. Make sure the <%s> "
+    ERROR ("db query utils: Cannot find query `%s'. Make sure the <Query> "
         "block is above the database definition!",
-        name, ci->key);
+        name);
     return (-ENOENT);
   }
+  else
+  {
+    DEBUG ("db query utils: Added %i versions of query `%s'.",
+        num_added, name);
+  }
 
-  tmp_list_len = *dst_list_len;
-  tmp_list = (udb_query_t **) realloc (*dst_list, (tmp_list_len + 1)
-      * sizeof (udb_query_t *));
-  if (tmp_list == NULL)
+  return (0);
+} /* }}} int udb_query_pick_from_list_by_name */
+
+int udb_query_pick_from_list (oconfig_item_t *ci, /* {{{ */
+    udb_query_t **src_list, size_t src_list_len,
+    udb_query_t ***dst_list, size_t *dst_list_len)
+{
+  const char *name;
+
+  if ((ci == NULL) || (src_list == NULL) || (dst_list == NULL)
+      || (dst_list_len == NULL))
   {
-    ERROR ("db query utils: realloc failed.");
-    return (-ENOMEM);
+    ERROR ("db query utils: udb_query_pick_from_list: "
+        "Invalid argument.");
+    return (-EINVAL);
   }
-  tmp_list[tmp_list_len] = q;
-  tmp_list_len++;
 
-  *dst_list = tmp_list;
-  *dst_list_len = tmp_list_len;
+  if ((ci->values_num != 1)
+      || (ci->values[0].type != OCONFIG_TYPE_STRING))
+  {
+    ERROR ("db query utils: The `%s' config option "
+        "needs exactly one string argument.", ci->key);
+    return (-1);
+  }
+  name = ci->values[0].value.string;
 
-  return (0);
+  return (udb_query_pick_from_list_by_name (name,
+        src_list, src_list_len,
+        dst_list, dst_list_len));
 } /* }}} int udb_query_pick_from_list */
 
 const char *udb_query_get_name (udb_query_t *q) /* {{{ */