コード例 #1
0
void udb_query_finish_result (udb_query_t const *q, /* {{{ */
    udb_query_preparation_area_t *prep_area)
{
  udb_result_preparation_area_t *r_area;
  udb_result_t *r;

  if ((q == NULL) || (prep_area == NULL))
    return;

  prep_area->column_num = 0;
  sfree (prep_area->host);
  sfree (prep_area->plugin);
  sfree (prep_area->db_name);

  prep_area->interval = 0;

  for (r = q->results, r_area = prep_area->result_prep_areas;
      r != NULL; r = r->next, r_area = r_area->next)
  {
    /* this may happen during error conditions of the caller */
    if (r_area == NULL)
      break;
    udb_result_finish_result (r, r_area);
  }
} /* }}} void udb_query_finish_result */
コード例 #2
0
ファイル: utils_db_query.c プロジェクト: haojunyu/collectd
void udb_query_finish_result (udb_query_t *q) /* {{{ */
{
  udb_result_t *r;

  if (q == NULL)
    return;

  q->column_num = 0;
  sfree (q->host);
  sfree (q->plugin);
  sfree (q->db_name);

  for (r = q->results; r != NULL; r = r->next)
    udb_result_finish_result (r);
} /* }}} void udb_query_finish_result */
コード例 #3
0
static int udb_result_prepare_result (udb_result_t const *r, /* {{{ */
    udb_result_preparation_area_t *prep_area,
    char **column_names, size_t column_num)
{
  size_t i;

  if ((r == NULL) || (prep_area == NULL))
    return (-EINVAL);

#define BAIL_OUT(status) \
  prep_area->ds = NULL; \
  sfree (prep_area->instances_pos); \
  sfree (prep_area->values_pos); \
  sfree (prep_area->metadata_pos); \
  sfree (prep_area->instances_buffer); \
  sfree (prep_area->values_buffer); \
  sfree (prep_area->metadata_buffer); \
  return (status)

  /* Make sure previous preparations are cleaned up. */
  udb_result_finish_result (r, prep_area);
  prep_area->instances_pos = NULL;
  prep_area->values_pos = NULL;
  prep_area->metadata_pos = NULL;

  /* Read `ds' and check number of values {{{ */
  prep_area->ds = plugin_get_ds (r->type);
  if (prep_area->ds == NULL)
  {
    ERROR ("db query utils: udb_result_prepare_result: Type `%s' is not "
        "known by the daemon. See types.db(5) for details.",
        r->type);
    BAIL_OUT (-1);
  }

  if (prep_area->ds->ds_num != r->values_num)
  {
    ERROR ("db query utils: udb_result_prepare_result: The type `%s' "
        "requires exactly %zu value%s, but the configuration specifies %zu.",
        r->type,
        prep_area->ds->ds_num, (prep_area->ds->ds_num == 1) ? "" : "s",
        r->values_num);
    BAIL_OUT (-1);
  }
  /* }}} */

  /* Allocate r->instances_pos, r->values_pos, r->metadata_post,
   * r->instances_buffer, r->values_buffer, and r->metadata_buffer {{{ */
  if (r->instances_num > 0)
  {
    prep_area->instances_pos
      = (size_t *) calloc (r->instances_num, sizeof (size_t));
    if (prep_area->instances_pos == NULL)
    {
      ERROR ("db query utils: udb_result_prepare_result: calloc failed.");
      BAIL_OUT (-ENOMEM);
    }

    prep_area->instances_buffer
      = (char **) calloc (r->instances_num, sizeof (char *));
    if (prep_area->instances_buffer == NULL)
    {
      ERROR ("db query utils: udb_result_prepare_result: calloc failed.");
      BAIL_OUT (-ENOMEM);
    }
  } /* if (r->instances_num > 0) */

  prep_area->values_pos
    = (size_t *) calloc (r->values_num, sizeof (size_t));
  if (prep_area->values_pos == NULL)
  {
    ERROR ("db query utils: udb_result_prepare_result: calloc failed.");
    BAIL_OUT (-ENOMEM);
  }

  prep_area->values_buffer
    = (char **) calloc (r->values_num, sizeof (char *));
  if (prep_area->values_buffer == NULL)
  {
    ERROR ("db query utils: udb_result_prepare_result: calloc failed.");
    BAIL_OUT (-ENOMEM);
  }

  prep_area->metadata_pos
    = (size_t *) calloc (r->metadata_num, sizeof (size_t));
  if (prep_area->metadata_pos == NULL)
  {
    ERROR ("db query utils: udb_result_prepare_result: calloc failed.");
    BAIL_OUT (-ENOMEM);
  }

  prep_area->metadata_buffer
    = (char **) calloc (r->metadata_num, sizeof (char *));
  if (prep_area->metadata_buffer == NULL)
  {
    ERROR ("db query utils: udb_result_prepare_result: calloc failed.");
    BAIL_OUT (-ENOMEM);
  }

  /* }}} */

  /* Determine the position of the plugin instance column {{{ */
  for (i = 0; i < r->instances_num; i++)
  {
    size_t j;

    for (j = 0; j < column_num; j++)
    {
      if (strcasecmp (r->instances[i], column_names[j]) == 0)
      {
        prep_area->instances_pos[i] = j;
        break;
      }
    }

    if (j >= column_num)
    {
      ERROR ("db query utils: udb_result_prepare_result: "
          "Column `%s' could not be found.",
          r->instances[i]);
      BAIL_OUT (-ENOENT);
    }
  } /* }}} for (i = 0; i < r->instances_num; i++) */


  /* Determine the position of the value columns {{{ */
  for (i = 0; i < r->values_num; i++)
  {
    size_t j;

    for (j = 0; j < column_num; j++)
    {
      if (strcasecmp (r->values[i], column_names[j]) == 0)
      {
        prep_area->values_pos[i] = j;
        break;
      }
    }

    if (j >= column_num)
    {
      ERROR ("db query utils: udb_result_prepare_result: "
          "Column `%s' could not be found.",
          r->values[i]);
      BAIL_OUT (-ENOENT);
    }
  } /* }}} for (i = 0; i < r->values_num; i++) */

  /* Determine the position of the metadata columns {{{ */
  for (i = 0; i < r->metadata_num; i++)
  {
    size_t j;

    for (j = 0; j < column_num; j++)
    {
      if (strcasecmp (r->metadata[i], column_names[j]) == 0)
      {
        prep_area->metadata_pos[i] = j;
        break;
      }
    }

    if (j >= column_num)
    {
      ERROR ("db query utils: udb_result_prepare_result: "
          "Metadata column `%s' could not be found.",
          r->values[i]);
      BAIL_OUT (-ENOENT);
    }
  } /* }}} for (i = 0; i < r->metadata_num; i++) */

#undef BAIL_OUT
  return (0);
} /* }}} int udb_result_prepare_result */