Пример #1
0
static gboolean
afamqp_worker_publish(AMQPDestDriver *self, LogMessage *msg)
{
  gint pos = 0, ret;
  amqp_table_t table;
  amqp_basic_properties_t props;
  gboolean success = TRUE;
  ScratchBuffer *routing_key = scratch_buffer_acquire();
  ScratchBuffer *body = scratch_buffer_acquire();
  amqp_bytes_t body_bytes = amqp_cstring_bytes("");

  gpointer user_data[] = { &self->entries, &pos, &self->max_entries };

  value_pairs_foreach(self->vp, afamqp_vp_foreach, msg, self->seq_num,
                      user_data);

  table.num_entries = pos;
  table.entries = self->entries;

  props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG
    | AMQP_BASIC_DELIVERY_MODE_FLAG | AMQP_BASIC_HEADERS_FLAG;
  props.content_type = amqp_cstring_bytes("text/plain");
  props.delivery_mode = self->persistent;
  props.headers = table;

  log_template_format(self->routing_key_template, msg, NULL, LTZ_LOCAL,
                      self->seq_num, NULL, sb_string(routing_key));

  if (self->body_template)
    {
      log_template_format(self->body_template, msg, NULL, LTZ_LOCAL,
                          self->seq_num, NULL, sb_string(body));
      body_bytes = amqp_cstring_bytes(sb_string(body)->str);
    }

  ret = amqp_basic_publish(self->conn, 1, amqp_cstring_bytes(self->exchange),
                           amqp_cstring_bytes(sb_string(routing_key)->str),
                           0, 0, &props, body_bytes);

  scratch_buffer_release(routing_key);
  scratch_buffer_release(body);

  if (ret < 0)
    {
      msg_error("Network error while inserting into AMQP server",
                evt_tag_int("time_reopen", self->time_reopen), NULL);
      success = FALSE;
    }

  while (--pos >= 0)
    {
      amqp_bytes_free(self->entries[pos].key);
      amqp_bytes_free(self->entries[pos].value.value.bytes);
    }

  return success;
}
Пример #2
0
ScratchBuffer *
scratch_buffer_acquire(void)
{
  ScratchBuffer *sb;

  sb = g_trash_stack_pop(&local_scratch_buffers);
  if (!sb)
    {
      sb = g_new(ScratchBuffer, 1);
      g_string_steal(sb_string(sb));
    }
  else
    g_string_set_size(sb_string(sb), 0);
  return sb;
}
Пример #3
0
void
scratch_buffers_free(void)
{
  ScratchBuffer *sb;

  while ((sb = g_trash_stack_pop(&local_scratch_buffers)) != NULL)
    {
      g_free(sb_string(sb)->str);
      g_free(sb);
    }
}
Пример #4
0
/*
 * Prints a value-thing.  This function is designed to be called by the
 * registry module.
 *
 * Arguments:
 *      vt              Pointer to the value-thing to be printed.  Shall not be
 *                      NULL.
 * Returns:
 *      0               Success
 */
static int printValueThing(
    ValueThing* const     vt)
{
    int         status = sb_set(_valuePath, _nodePath, REG_SEP, vt_getName(vt),
        NULL);

    if (0 != status) {
        log_add("Couldn't form pathname for value \"%s\"", vt_getName(vt));
    }
    else {
        (void)printf("%s : %s\n", sb_string(_valuePath), vt_getValue(vt));
        status = 0;
    }

    return status;
}
Пример #5
0
static void
log_json_parser_process_single (struct json_object *jso,
                                const gchar *prefix,
                                const gchar *obj_key,
                                LogMessage *msg)
{
  ScratchBuffer *key, *value;
  gboolean parsed = FALSE;

  key = scratch_buffer_acquire ();
  value = scratch_buffer_acquire ();

  switch (json_object_get_type (jso))
    {
    case json_type_boolean:
      parsed = TRUE;
      if (json_object_get_boolean (jso))
        g_string_assign (sb_string (value), "true");
      else
        g_string_assign (sb_string (value), "false");
      break;
    case json_type_double:
      parsed = TRUE;
      g_string_printf (sb_string (value), "%f",
                       json_object_get_double (jso));
      break;
    case json_type_int:
      parsed = TRUE;
      g_string_printf (sb_string (value), "%i",
                       json_object_get_int (jso));
      break;
    case json_type_string:
      parsed = TRUE;
      g_string_assign (sb_string (value),
                       json_object_get_string (jso));
      break;
    case json_type_object:
      if (prefix)
        g_string_assign (sb_string (key), prefix);
      g_string_append (sb_string (key), obj_key);
      g_string_append_c (sb_string (key), '.');
      log_json_parser_process_object (jso, sb_string (key)->str, msg);
      break;
    case json_type_array:
      {
        gint i, plen;

        g_string_assign (sb_string (key), obj_key);

        plen = sb_string (key)->len;

        for (i = 0; i < json_object_array_length (jso); i++)
          {
            g_string_truncate (sb_string (key), plen);
            g_string_append_printf (sb_string (key), "[%d]", i);
            log_json_parser_process_single (json_object_array_get_idx (jso, i),
                                            prefix,
                                            sb_string (key)->str, msg);
          }
        break;
      }
    default:
      msg_error ("JSON parser encountered an unknown type, skipping",
                 evt_tag_str ("key", obj_key), NULL);
      break;
    }

  if (parsed)
    {
      if (prefix)
        {
          g_string_assign (sb_string (key), prefix);
          g_string_append (sb_string (key), obj_key);
          log_msg_set_value (msg,
                             log_msg_get_value_handle (sb_string (key)->str),
                             sb_string (value)->str, sb_string (value)->len);
        }
      else
        log_msg_set_value (msg,
                           log_msg_get_value_handle (obj_key),
                           sb_string (value)->str, sb_string (value)->len);
    }

  scratch_buffer_release (key);
  scratch_buffer_release (value);
}