static gboolean afmongodb_vp_process_value(const gchar *name, const gchar *prefix, TypeHint type, const gchar *value, gsize value_len, 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, value_len); 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, value_len); 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, value_len); else return r; } break; } case TYPE_HINT_DOUBLE: { gdouble d; if (type_cast_to_double (value, &d, NULL)) bson_append_double (o, name, d); else { gboolean r = type_cast_drop_helper(self->template_options.on_error, value, "double"); if (fallback) bson_append_string(o, name, value, value_len); 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, value_len); else return r; } break; } case TYPE_HINT_STRING: case TYPE_HINT_LITERAL: bson_append_string (o, name, value, value_len); break; default: return TRUE; } return FALSE; }
static gboolean tf_json_value(const gchar *name, const gchar *prefix, TypeHint type, const gchar *value, gsize value_len, gpointer *prefix_data, gpointer user_data) { json_state_t *state = (json_state_t *)user_data; gint on_error = state->template_options->on_error; switch (type) { case TYPE_HINT_STRING: case TYPE_HINT_DATETIME: default: tf_json_append_value(name, value, value_len, state, TRUE); break; case TYPE_HINT_LITERAL: tf_json_append_value(name, value, value_len, state, FALSE); break; case TYPE_HINT_INT32: case TYPE_HINT_INT64: case TYPE_HINT_DOUBLE: case TYPE_HINT_BOOLEAN: { gint32 i32; gint64 i64; gdouble d; gboolean b; gboolean r = FALSE, fail = FALSE; const gchar *v = value; gsize v_len = value_len; if (type == TYPE_HINT_INT32 && (fail = !type_cast_to_int32(value, &i32 , NULL)) == TRUE) r = type_cast_drop_helper(on_error, value, "int32"); else if (type == TYPE_HINT_INT64 && (fail = !type_cast_to_int64(value, &i64 , NULL)) == TRUE) r = type_cast_drop_helper(on_error, value, "int64"); else if (type == TYPE_HINT_DOUBLE && (fail = !type_cast_to_double(value, &d, NULL)) == TRUE) r = type_cast_drop_helper(on_error, value, "double"); else if (type == TYPE_HINT_BOOLEAN) { if ((fail = !type_cast_to_boolean(value, &b, NULL)) == TRUE) { r = type_cast_drop_helper(on_error, value, "boolean"); } else { v = b ? "true" : "false"; v_len = -1; } } if (fail && !(on_error & ON_ERROR_FALLBACK_TO_STRING)) return r; tf_json_append_value(name, v, v_len, state, fail); break; } } state->need_comma = TRUE; return FALSE; }