gboolean bson_cursor_get_javascript_w_scope (const bson_cursor *c, const gchar **js, bson **scope) { bson *b; gint32 size, docpos; if (!js || !scope) return FALSE; BSON_CURSOR_CHECK_TYPE (c, BSON_TYPE_JS_CODE_W_SCOPE); docpos = bson_stream_doc_size (bson_data (c->obj), c->value_pos + sizeof (gint32)) + sizeof (gint32) * 2; size = bson_stream_doc_size (bson_data (c->obj), c->value_pos + docpos) - sizeof (gint32) - 1; b = bson_new_sized (size); b->data = g_byte_array_append (b->data, bson_data (c->obj) + c->value_pos + docpos + sizeof (gint32), size); bson_finish (b); *scope = b; *js = (gchar *)(bson_data (c->obj) + c->value_pos + sizeof (gint32) * 2); return TRUE; }
static gpointer afmongodb_worker_thread (gpointer arg) { MongoDBDestDriver *self = (MongoDBDestDriver *)arg; msg_debug ("Worker thread started", evt_tag_str("driver", self->super.super.id), NULL); afmongodb_dd_connect(self, FALSE); self->ns = g_strconcat (self->db, ".", self->coll, NULL); self->current_value = g_string_sized_new(256); self->bson = bson_new_sized(4096); while (!self->writer_thread_terminate) { g_mutex_lock(self->suspend_mutex); if (self->writer_thread_suspended) { g_cond_timed_wait(self->writer_thread_wakeup_cond, self->suspend_mutex, &self->writer_thread_suspend_target); self->writer_thread_suspended = FALSE; g_mutex_unlock(self->suspend_mutex); } else if (!log_queue_check_items(self->queue, NULL, afmongodb_dd_message_became_available_in_the_queue, self, NULL)) { g_cond_wait(self->writer_thread_wakeup_cond, self->suspend_mutex); g_mutex_unlock(self->suspend_mutex); } else g_mutex_unlock(self->suspend_mutex); if (self->writer_thread_terminate) break; if (!afmongodb_worker_insert (self)) { afmongodb_dd_disconnect(self); afmongodb_dd_suspend(self); } } afmongodb_dd_disconnect(self); g_free (self->ns); g_string_free (self->current_value, TRUE); bson_free (self->bson); msg_debug ("Worker thread finished", evt_tag_str("driver", self->super.super.id), NULL); return NULL; }
static void afmongodb_worker_thread_init(LogThrDestDriver *d) { MongoDBDestDriver *self = (MongoDBDestDriver *)d; afmongodb_dd_connect(self, FALSE); self->ns = g_strconcat (self->db, ".", self->coll, NULL); self->current_value = g_string_sized_new(256); self->bson = bson_new_sized(4096); }
gboolean bson_cursor_get_array (const bson_cursor *c, bson **dest) { bson *b; gint32 size; if (!dest) return FALSE; BSON_CURSOR_CHECK_TYPE (c, BSON_TYPE_ARRAY); size = bson_stream_doc_size (bson_data(c->obj), c->value_pos) - sizeof (gint32) - 1; b = bson_new_sized (size); b->data = g_byte_array_append (b->data, bson_data (c->obj) + c->value_pos + sizeof (gint32), size); bson_finish (b); *dest = b; return TRUE; }
static gpointer afmongodb_worker_thread (gpointer arg) { MongoDBDestDriver *self = (MongoDBDestDriver *)arg; gboolean success; msg_debug ("Worker thread started", evt_tag_str("driver", self->super.super.id), NULL); success = afmongodb_dd_connect(self, FALSE); self->ns = g_strconcat (self->db, ".", self->coll, NULL); self->current_value = g_string_sized_new(256); self->bson_sel = bson_new_sized(64); self->bson_upd = bson_new_sized(512); self->bson_set = bson_new_sized(512); while (!self->writer_thread_terminate) { g_mutex_lock(self->suspend_mutex); if (self->writer_thread_suspended) { g_cond_timed_wait(self->writer_thread_wakeup_cond, self->suspend_mutex, &self->writer_thread_suspend_target); self->writer_thread_suspended = FALSE; g_mutex_unlock(self->suspend_mutex); } else { g_mutex_unlock(self->suspend_mutex); g_mutex_lock(self->queue_mutex); if (log_queue_get_length(self->queue) == 0) { g_cond_wait(self->writer_thread_wakeup_cond, self->queue_mutex); } g_mutex_unlock(self->queue_mutex); } if (self->writer_thread_terminate) break; if (!afmongodb_worker_insert (self)) { afmongodb_dd_disconnect(self); afmongodb_dd_suspend(self); } } afmongodb_dd_disconnect(self); g_free (self->ns); g_string_free (self->current_value, TRUE); bson_free (self->bson_sel); bson_free (self->bson_upd); bson_free (self->bson_set); msg_debug ("Worker thread finished", evt_tag_str("driver", self->super.super.id), NULL); return NULL; }
bson * bson_new (void) { return bson_new_sized (0); }