static void json_key_to_bson_key (bson *b, void *val, const gchar *key) { switch (json_object_get_type (val)) { case json_type_boolean: bson_append_boolean (b, key, json_object_get_boolean (val)); break; case json_type_double: bson_append_double (b, key, json_object_get_double (val)); break; case json_type_int: bson_append_int32 (b, key, json_object_get_int (val)); break; case json_type_string: bson_append_string (b, key, json_object_get_string (val), -1); break; case json_type_object: { bson *sub; sub = json_to_bson (val); bson_append_document (b, key, sub); bson_free (sub); break; } case json_type_array: { gint pos; bson *sub; sub = bson_new (); for (pos = 0; pos < json_object_array_length (val); pos++) { gchar *nk = g_strdup_printf ("%d", pos); json_key_to_bson_key (sub, json_object_array_get_idx (val, pos), nk); g_free (nk); } bson_finish (sub); bson_append_array (b, key, sub); bson_free (sub); break; } default: break; } }
static void json_append_to_bson(bson* b, char *key, struct json_object *val) { if (!b || !key || !val) return; struct array_list *list; enum json_type type; bson *sub; char tok[64]; type = json_object_get_type(val); switch (type) { case json_type_boolean: bson_append_boolean(b, key, json_object_get_boolean(val)); break; case json_type_int: bson_append_int32(b, key, json_object_get_int(val)); break; case json_type_double: bson_append_double(b, key, json_object_get_double(val)); break; case json_type_string: bson_append_string(b, key, json_object_get_string(val), -1); break; case json_type_array: sub = bson_new(); list = json_object_get_array(val); for (int pos = 0; pos < list->length; pos++) { sprintf(tok, "%d", pos); json_append_to_bson(sub, tok, (struct json_object*)list->array[pos]); } bson_finish(sub); bson_append_array(b, key, sub); bson_free(sub); break; case json_type_object: sub = mbson_new_from_jsonobj(val, true, false); bson_append_document(b, key, sub); bson_free(sub); break; default: break; } }
bson * test_bson_generate_full (void) { bson *b, *d, *a, *scope; guint8 oid[] = "1234567890ab"; a = bson_new (); bson_append_int32 (a, "0", 32); bson_append_int64 (a, "1", (gint64)-42); bson_finish (a); d = bson_new (); bson_append_string (d, "name", "sub-document", -1); bson_append_int32 (d, "answer", 42); bson_finish (d); scope = bson_new (); bson_append_string (scope, "v", "hello world", -1); bson_finish (scope); b = bson_new (); bson_append_double (b, "double", 3.14); bson_append_string (b, "str", "hello world", -1); bson_append_document (b, "doc", d); bson_append_array (b, "array", a); bson_append_binary (b, "binary0", BSON_BINARY_SUBTYPE_GENERIC, (guint8 *)"foo\0bar", 7); bson_append_oid (b, "_id", oid); bson_append_boolean (b, "TRUE", FALSE); bson_append_utc_datetime (b, "date", 1294860709000); bson_append_timestamp (b, "ts", 1294860709000); bson_append_null (b, "null"); bson_append_regex (b, "foobar", "s/foo.*bar/", "i"); bson_append_javascript (b, "alert", "alert (\"hello world!\");", -1); bson_append_symbol (b, "sex", "Marilyn Monroe", -1); bson_append_javascript_w_scope (b, "print", "alert (v);", -1, scope); bson_append_int32 (b, "int32", 32); bson_append_int64 (b, "int64", (gint64)-42); bson_finish (b); bson_free (d); bson_free (a); bson_free (scope); return b; }
static gboolean afmongodb_vp_process_value(const gchar *name, const gchar *prefix, TypeHint type, const gchar *value, gpointer *prefix_data, gpointer user_data) { bson *o; MongoDBDestDriver *self = (MongoDBDestDriver *)user_data; gboolean fallback = self->template_options.on_error & ON_ERROR_FALLBACK_TO_STRING; if (prefix_data) o = (bson *)*prefix_data; else o = self->bson; switch (type) { case TYPE_HINT_BOOLEAN: { gboolean b; if (type_cast_to_boolean (value, &b, NULL)) bson_append_boolean (o, name, b); else { gboolean r = type_cast_drop_helper(self->template_options.on_error, value, "boolean"); if (fallback) bson_append_string (o, name, value, -1); else return r; } break; } case TYPE_HINT_INT32: { gint32 i; if (type_cast_to_int32 (value, &i, NULL)) bson_append_int32 (o, name, i); else { gboolean r = type_cast_drop_helper(self->template_options.on_error, value, "int32"); if (fallback) bson_append_string (o, name, value, -1); else return r; } break; } case TYPE_HINT_INT64: { gint64 i; if (type_cast_to_int64 (value, &i, NULL)) bson_append_int64 (o, name, i); else { gboolean r = type_cast_drop_helper(self->template_options.on_error, value, "int64"); if (fallback) bson_append_string(o, name, value, -1); else return r; } break; } case TYPE_HINT_DATETIME: { guint64 i; if (type_cast_to_datetime_int (value, &i, NULL)) bson_append_utc_datetime (o, name, (gint64)i); else { gboolean r = type_cast_drop_helper(self->template_options.on_error, value, "datetime"); if (fallback) bson_append_string(o, name, value, -1); else return r; } break; } case TYPE_HINT_STRING: case TYPE_HINT_LITERAL: bson_append_string (o, name, value, -1); break; default: return TRUE; } return FALSE; }