コード例 #1
0
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;
}
コード例 #2
0
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);
}
コード例 #3
0
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);
}
コード例 #4
0
ファイル: mongo-bson.c プロジェクト: codebutler/mongo-glib
/**
 * 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;
   }
}
コード例 #5
0
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;
}
コード例 #6
0
ファイル: mongo-bson.c プロジェクト: codebutler/mongo-glib
/**
 * 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);
}
コード例 #7
0
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);
}