Beispiel #1
0
/**
 * mongo_bson_iter_get_value_string:
 * @iter: (in): A #MongoBsonIter.
 * @length: (out) (allow-none): The length of the resulting string.
 *
 * Fetches the current value pointed to by @iter if it is a
 * %MONGO_BSON_UTF8. If @length is not %NULL, then the length of the
 * string will be stored in the location pointed to by @length.
 *
 * Returns: A string which should not be modified or freed.
 */
const gchar *
mongo_bson_iter_get_value_string (MongoBsonIter *iter,
                                  gsize         *length)
{
   gint32 real_length;

   g_return_val_if_fail(iter != NULL, NULL);
   g_return_val_if_fail(iter->user_data6 != NULL, NULL);
   g_return_val_if_fail(iter->user_data7 != NULL, NULL);

   if (ITER_IS_TYPE(iter, MONGO_BSON_UTF8)) {
      if (length) {
         memcpy(&real_length, iter->user_data6, sizeof real_length);
         if ((iter->flags & ITER_INVALID_UTF8)) {
            *length = strlen(iter->user_data7) + 1;
         } else {
            *length = GINT_FROM_LE(real_length);
         }

      }
      return iter->user_data7;
   }

   g_warning("Current value is not a String");

   return NULL;
}
Beispiel #2
0
/**
 * mongo_bson_iter_get_value_array:
 * @iter: (in): A #MongoBsonIter.
 *
 * Fetches the current value pointed to by the iterator, expecting it to
 * be a boolean.
 *
 * Returns: The current value.
 */
gboolean
mongo_bson_iter_get_value_boolean (MongoBsonIter *iter)
{
   guint8 b;

   g_return_val_if_fail(iter != NULL, 0);
   g_return_val_if_fail(iter->user_data6 != NULL, 0);

   if (ITER_IS_TYPE(iter, MONGO_BSON_BOOLEAN)) {
      memcpy(&b, iter->user_data6, sizeof b);
      return !!b;
   } else if (ITER_IS_TYPE(iter, MONGO_BSON_INT32)) {
      return !!mongo_bson_iter_get_value_int(iter);
   } else if (ITER_IS_TYPE(iter, MONGO_BSON_INT64)) {
      return !!mongo_bson_iter_get_value_int64(iter);
   } else if (ITER_IS_TYPE(iter, MONGO_BSON_DOUBLE)) {
      return (mongo_bson_iter_get_value_double(iter) == 1.0);
   }

   g_warning("Current key cannot be coerced to boolean.");

   return FALSE;
}
Beispiel #3
0
/**
 * mongo_bson_iter_get_value_object_id:
 * @iter: (in): A #MongoBsonIter.
 *
 * Fetches the current value pointed to by @iter if it is a
 * %MONGO_BSON_OBJECT_ID. The resulting #MongoObjectId should be freed
 * with mongo_object_id_free().
 *
 * Returns: (transfer full): A #MongoObjectId.
 */
MongoObjectId *
mongo_bson_iter_get_value_object_id (MongoBsonIter *iter)
{
   g_return_val_if_fail(iter != NULL, NULL);
   g_return_val_if_fail(iter->user_data6 != NULL, NULL);

   if (ITER_IS_TYPE(iter, MONGO_BSON_OBJECT_ID)) {
      return mongo_object_id_new_from_data(iter->user_data6);
   }

   g_warning("Current value is not an ObjectId.");

   return NULL;
}
Beispiel #4
0
/**
 * mongo_bson_iter_recurse:
 * @iter: (in): A #MongoBsonIter.
 * @child: (out): A #MongoBsonIter.
 *
 * Recurses into the child BSON document found at the key currently observed
 * by the #MongoBsonIter. The @child #MongoBsonIter is initialized.
 *
 * Returns: %TRUE if @child is initialized; otherwise %FALSE.
 */
gboolean
mongo_bson_iter_recurse (MongoBsonIter *iter,
                         MongoBsonIter *child)
{
   gint32 buflen;

   g_return_val_if_fail(iter != NULL, FALSE);
   g_return_val_if_fail(iter != NULL, FALSE);
   g_return_val_if_fail(child != NULL, FALSE);

   if (ITER_IS_TYPE(iter, MONGO_BSON_ARRAY) ||
       ITER_IS_TYPE(iter, MONGO_BSON_DOCUMENT)) {
      memset(child, 0, sizeof *child);
      memcpy(&buflen, iter->user_data6, sizeof buflen);
      child->user_data1 = iter->user_data6;
      child->user_data2 = GINT_TO_POINTER(GINT_FROM_LE(buflen));
      child->user_data3 = GINT_TO_POINTER(3); /* End of size buffer */
      return TRUE;
   }

   g_warning("Current value is not a BSON document or array.");

   return FALSE;
}
Beispiel #5
0
/**
 * mongo_bson_iter_get_value_int64:
 * @iter: (in): A #MongoBsonIter.
 *
 * Fetches the current value pointed to by @iter if it is a
 * %MONGO_BSON_INT64.
 *
 * Returns: A #gint64.
 */
gint64
mongo_bson_iter_get_value_int64 (MongoBsonIter *iter)
{
   gint64 value;

   g_return_val_if_fail(iter != NULL, 0L);
   g_return_val_if_fail(iter->user_data6 != NULL, 0L);

   if (ITER_IS_TYPE(iter, MONGO_BSON_INT64)) {
      memcpy(&value, iter->user_data6, sizeof value);
      return GINT64_FROM_LE(value);
   }

   g_warning("Current value is not an int64.");

   return 0L;
}
Beispiel #6
0
/**
 * mongo_bson_iter_get_value_double:
 * @iter: (in): A #MongoBsonIter.
 *
 * Fetches the current value pointed to by @iter if it is a
 * %MONGO_BSON_DOUBLE.
 *
 * Returns: A #gdouble.
 */
gdouble
mongo_bson_iter_get_value_double (MongoBsonIter *iter)
{
   gdouble value;

   g_return_val_if_fail(iter != NULL, 0);
   g_return_val_if_fail(iter->user_data6 != NULL, 0);

   if (ITER_IS_TYPE(iter, MONGO_BSON_DOUBLE)) {
      memcpy(&value, iter->user_data6, sizeof value);
      return value;
   }

   g_warning("Current value is not a double.");

   return 0.0;
}
Beispiel #7
0
/**
 * mongo_bson_iter_get_value_array:
 * @iter: (in): A #MongoBsonIter.
 *
 * Fetches the current value pointed to by the iterator, expecting it to
 * be a boolean.
 *
 * Returns: The current value.
 */
gboolean
mongo_bson_iter_get_value_boolean (MongoBsonIter *iter)
{
   guint8 b;

   g_return_val_if_fail(iter != NULL, 0);
   g_return_val_if_fail(iter->user_data6 != NULL, 0);

   if (ITER_IS_TYPE(iter, MONGO_BSON_BOOLEAN)) {
      memcpy(&b, iter->user_data6, sizeof b);
      return !!b;
   }

   g_warning("Current key is not a boolean.");

   return FALSE;
}
Beispiel #8
0
/**
 * mongo_bson_iter_get_value_timeval:
 * @iter: (in): A #MongoBsonIter.
 * @value: (out): A location for a #GTimeVal.
 *
 * Fetches the current value pointed to by @iter as a #GTimeVal if the type
 * is a %MONGO_BSON_DATE_TIME.
 */
void
mongo_bson_iter_get_value_timeval (MongoBsonIter *iter,
                                   GTimeVal      *value)
{
   gint64 v_int64;

   g_return_if_fail(iter != NULL);
   g_return_if_fail(value != NULL);

   if (ITER_IS_TYPE(iter, MONGO_BSON_DATE_TIME)) {
      memcpy(&v_int64, iter->user_data6, sizeof v_int64);
      v_int64 = GINT64_FROM_LE(v_int64);
      value->tv_sec = v_int64 / 1000;
      value->tv_usec = v_int64 % 1000;
      return;
   }

   g_warning("Current value is not a DateTime");
}
Beispiel #9
0
/**
 * mongo_bson_iter_get_value_regex:
 * @iter: (in): A #MongoBsonIter.
 * @regex: (out) (allow-none) (transfer none): A location for a string containing the regex.
 * @options: (out) (allow-none) (transfer none): A location for a string containing the options.
 *
 * Fetches the current value pointed to by @iter if it is a regex. The values
 * MUST NOT be modified or freed.
 */
void
mongo_bson_iter_get_value_regex (MongoBsonIter  *iter,
                                 const gchar   **regex,
                                 const gchar   **options)
{
   g_return_if_fail(iter != NULL);

   if (ITER_IS_TYPE(iter, MONGO_BSON_REGEX)) {
      if (regex) {
         *regex = iter->user_data6;
      }
      if (options) {
         *options = iter->user_data7;
      }
      return;
   }

   g_warning("Current value is not a Regex.");
}
Beispiel #10
0
static MongoBson *
mongo_bson_iter_get_value_document (MongoBsonIter *iter,
                                    MongoBsonType  type)
{
   const guint8 *buffer;
   gpointer endbuf;
   guint32 array_len;

   g_return_val_if_fail(iter != NULL, NULL);
   g_return_val_if_fail(iter->user_data1 != NULL, NULL);
   g_return_val_if_fail(iter->user_data2 != NULL, NULL);
   g_return_val_if_fail(iter->user_data6 != NULL, NULL);
   g_return_val_if_fail((type == MONGO_BSON_ARRAY) ||
                        (type == MONGO_BSON_DOCUMENT), NULL);

   if (G_LIKELY(ITER_IS_TYPE(iter, type))) {
      endbuf = GSIZE_TO_POINTER(GPOINTER_TO_SIZE(iter->user_data1) +
                                GPOINTER_TO_SIZE(iter->user_data2));
      if ((iter->user_data6 + 5) > endbuf) {
         return NULL;
      }
      memcpy(&array_len, iter->user_data6, sizeof array_len);
      array_len = GINT_FROM_LE(array_len);
      if ((iter->user_data6 + array_len) > endbuf) {
         return NULL;
      }
      buffer = iter->user_data6;
      return mongo_bson_new_from_data(buffer, array_len);
   }

   if (type == MONGO_BSON_ARRAY) {
      g_warning("Current key is not an array.");
   } else if (type == MONGO_BSON_DOCUMENT) {
      g_warning("Current key is not a document.");
   } else {
      g_assert_not_reached();
   }

   return NULL;
}