gboolean mongo_cursor_count_finish (MongoCursor *cursor, GAsyncResult *result, guint64 *count, GError **error) { GSimpleAsyncResult *simple = (GSimpleAsyncResult *)result; MongoMessageReply *reply; MongoBsonIter iter; gboolean ret = FALSE; GList *list; g_return_val_if_fail(MONGO_IS_CURSOR(cursor), FALSE); g_return_val_if_fail(G_IS_SIMPLE_ASYNC_RESULT(simple), FALSE); g_return_val_if_fail(count, FALSE); if (!(reply = g_simple_async_result_get_op_res_gpointer(simple))) { g_simple_async_result_propagate_error(simple, error); GOTO(failure); } if (!(list = mongo_message_reply_get_documents(reply))) { GOTO(failure); } mongo_bson_iter_init(&iter, list->data); if (!mongo_bson_iter_find(&iter, "n") || (mongo_bson_iter_get_value_type(&iter) != MONGO_BSON_DOUBLE)) { GOTO(failure); } *count = mongo_bson_iter_get_value_double(&iter); ret = TRUE; failure: RETURN(ret); }
/** * 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); }