static void mongo_cursor_finalize (GObject *object) { MongoCursorPrivate *priv; ENTRY; priv = MONGO_CURSOR(object)->priv; if (priv->connection) { g_object_remove_weak_pointer(G_OBJECT(priv->connection), (gpointer *)&priv->connection); priv->connection = NULL; } g_free(priv->collection); priv->collection = NULL; if (priv->fields) { mongo_bson_unref(priv->fields); priv->fields = NULL; } if (priv->query) { mongo_bson_unref(priv->query); priv->query = NULL; } G_OBJECT_CLASS(mongo_cursor_parent_class)->finalize(object); EXIT; }
static void test1 (void) { MongoCollection *col; MongoDatabase *db; MongoBson *bson = NULL; gboolean success = FALSE; gConnection = mongo_connection_new(); db = mongo_connection_get_database(gConnection, "dbtest1"); g_assert(db); col = mongo_database_get_collection(db, "dbcollection1"); g_assert(col); bson = mongo_bson_new(); mongo_collection_insert_async(col, &bson, 1, MONGO_INSERT_NONE, NULL, test1_insert_cb, &success); mongo_bson_unref(bson); g_main_loop_run(gMainLoop); g_assert_cmpint(success, ==, TRUE); }
static void test2 (void) { MongoCollection *col; MongoDatabase *db; MongoBson *doc; gboolean success = FALSE; gConnection = mongo_connection_new(); db = mongo_connection_get_database(gConnection, "dbtest1"); g_assert(db); col = mongo_database_get_collection(db, "dbcollection1"); g_assert(col); doc = mongo_bson_new(); mongo_bson_append_int(doc, "test-key", 54321); mongo_collection_insert_async(col, &doc, 1, MONGO_INSERT_NONE, NULL, test2_insert_cb, &success); mongo_bson_unref(doc); g_main_loop_run(gMainLoop); g_assert_cmpint(success, ==, TRUE); }
/** * mongo_clear_bson: * @bson: (inout) (allow-none): A pointer to a #MongoBson or %NULL. * * If @bson is a pointer to a #MongoBson, it will be freed and zeroed. */ void mongo_clear_bson (MongoBson **bson) { if (bson && *bson) { mongo_bson_unref(*bson); *bson = NULL; } }
void mongo_cursor_count_async (MongoCursor *cursor, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { MongoCursorPrivate *priv; GSimpleAsyncResult *simple; MongoBson *command; ENTRY; g_return_if_fail(MONGO_IS_CURSOR(cursor)); g_return_if_fail(!cancellable || G_IS_CANCELLABLE(cancellable)); g_return_if_fail(callback); priv = cursor->priv; if (!priv->connection) { g_simple_async_report_error_in_idle(G_OBJECT(cursor), callback, user_data, MONGO_CONNECTION_ERROR, MONGO_CONNECTION_ERROR_NOT_CONNECTED, _("Cursor is missing MongoConnection.")); EXIT; } simple = g_simple_async_result_new(G_OBJECT(cursor), callback, user_data, mongo_cursor_count_async); g_simple_async_result_set_check_cancellable(simple, cancellable); command = mongo_bson_new_empty(); mongo_bson_append_string(command, "count", priv->collection); if (priv->query) { mongo_bson_append_bson(command, "query", priv->query); } mongo_connection_command_async(priv->connection, priv->database, command, cancellable, mongo_cursor_count_cb, simple); mongo_bson_unref(command); EXIT; }
/** * mongo_bson_to_string: * @bson: (in): A #MongoBson. * * Build a string representing the BSON document. * * Returns: (transfer full): A string representing the BSON document. */ gchar * mongo_bson_to_string (MongoBson *bson, gboolean is_array) { MongoBsonIter iter; MongoBsonType type; GString *str; gchar *esc; g_return_val_if_fail(bson, NULL); str = g_string_new(is_array ? "[" : "{"); mongo_bson_iter_init(&iter, bson); if (mongo_bson_iter_next(&iter)) { again: if (!is_array) { esc = g_strescape(mongo_bson_iter_get_key(&iter), NULL); g_string_append_printf(str, "\"%s\": ", esc); g_free(esc); } type = mongo_bson_iter_get_value_type(&iter); switch (type) { case MONGO_BSON_DOUBLE: g_string_append_printf(str, "%f", mongo_bson_iter_get_value_double(&iter)); break; case MONGO_BSON_DATE_TIME: { GTimeVal tv = { 0 }; gchar *dstr; mongo_bson_iter_get_value_timeval(&iter, &tv); dstr = g_time_val_to_iso8601(&tv); g_string_append_printf(str, "ISODate(\"%s\")", dstr); g_free(dstr); } break; case MONGO_BSON_INT32: g_string_append_printf(str, "NumberLong(%d)", mongo_bson_iter_get_value_int(&iter)); break; case MONGO_BSON_INT64: g_string_append_printf(str, "NumberLong(%"G_GINT64_FORMAT")", mongo_bson_iter_get_value_int64(&iter)); break; case MONGO_BSON_UTF8: esc = g_strescape(mongo_bson_iter_get_value_string(&iter, NULL), NULL); g_string_append_printf(str, "\"%s\"", esc); g_free(esc); break; case MONGO_BSON_ARRAY: { MongoBson *child; gchar *childstr; if ((child = mongo_bson_iter_get_value_array(&iter))) { childstr = mongo_bson_to_string(child, TRUE); g_string_append(str, childstr); mongo_bson_unref(child); g_free(childstr); } } break; case MONGO_BSON_DOCUMENT: { MongoBson *child; gchar *childstr; if ((child = mongo_bson_iter_get_value_bson(&iter))) { childstr = mongo_bson_to_string(child, FALSE); g_string_append(str, childstr); mongo_bson_unref(child); g_free(childstr); } } break; case MONGO_BSON_BOOLEAN: g_string_append_printf(str, mongo_bson_iter_get_value_boolean(&iter) ? "true" : "false"); break; case MONGO_BSON_OBJECT_ID: { MongoObjectId *id; gchar *idstr; id = mongo_bson_iter_get_value_object_id(&iter); idstr = mongo_object_id_to_string(id); g_string_append_printf(str, "ObjectId(\"%s\")", idstr); mongo_object_id_free(id); g_free(idstr); } break; case MONGO_BSON_NULL: g_string_append(str, "null"); break; case MONGO_BSON_REGEX: /* TODO: */ g_assert_not_reached(); break; case MONGO_BSON_UNDEFINED: g_string_append(str, "undefined"); break; default: g_assert_not_reached(); } if (mongo_bson_iter_next(&iter)) { g_string_append(str, ", "); goto again; } } g_string_append(str, is_array ? "]" : "}"); return g_string_free(str, FALSE); }
static gboolean mongo_message_update_load_from_data (MongoMessage *message, const guint8 *data, gsize length) { MongoMessageUpdate *update = (MongoMessageUpdate *)message; const gchar *name; MongoBson *bson; guint32 v32; ENTRY; g_assert(MONGO_IS_MESSAGE_UPDATE(update)); g_assert(data); g_assert(length); if (length >= 4) { /* First 4 bytes are ZERO, reserved for future. */ length -= 4; data += 4; if (length >= 1) { /* Walk through collection name */ for (name = (gchar *)data; length && *data; length--, data++) { } if (length) { mongo_message_update_set_collection(update, name); length--; data++; /* Update flags */ if (length >= 4) { memcpy(&v32, data, sizeof v32); mongo_message_update_set_flags(update, GUINT32_FROM_LE(v32)); length -= 4; data += 4; /* Query BSON */ if (length >= 4) { memcpy(&v32, data, sizeof v32); v32 = GUINT32_FROM_LE(v32); if (v32 <= length) { if ((bson = mongo_bson_new_from_data(data, v32))) { mongo_message_update_set_query(update, bson); mongo_bson_unref(bson); length -= v32; data += v32; /* Update BSON */ if (length >= 4) { memcpy(&v32, data, sizeof v32); v32 = GUINT32_FROM_LE(v32); if (v32 <= length) { if ((bson = mongo_bson_new_from_data(data, v32))) { mongo_message_update_set_update(update, bson); mongo_bson_unref(bson); length -= v32; data += v32; RETURN(length == 0); } } } } } } } } } } RETURN(FALSE); }