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; }
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; }
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); } }
/* * 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; }
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); }