/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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"); }
/** * 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."); }
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; }