static gboolean tf_json_value(const gchar *name, const gchar *prefix, TypeHint type, const gchar *value, 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, state, TRUE); break; case TYPE_HINT_LITERAL: tf_json_append_value(name, value, state, FALSE); break; case TYPE_HINT_INT32: case TYPE_HINT_INT64: case TYPE_HINT_BOOLEAN: { gint32 i32; gint64 i64; gboolean b; gboolean r = FALSE, fail = FALSE; const gchar *v = value; 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_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"; } if (fail && !(on_error & ON_ERROR_FALLBACK_TO_STRING)) return r; tf_json_append_value(name, v, state, fail); break; } } state->need_comma = TRUE; return FALSE; }
static gboolean perl_worker_vp_add_one(const gchar *name, TypeHint type, const gchar *value, gpointer user_data) { PerlInterpreter *my_perl = (PerlInterpreter *)((gpointer *)user_data)[0]; HV *kvmap = (HV *)((gpointer *)user_data)[1]; PerlDestDriver *self = (PerlDestDriver *)((gpointer *)user_data)[2]; gboolean need_drop = FALSE; gboolean fallback = self->template_options.on_error & ON_ERROR_FALLBACK_TO_STRING; switch (type) { case TYPE_HINT_INT32: { gint32 i; if (type_cast_to_int32(value, &i, NULL)) hv_store(kvmap, name, strlen(name), newSViv(i), 0); else { need_drop = type_cast_drop_helper(self->template_options.on_error, value, "int"); if (fallback) hv_store(kvmap, name, strlen(name), newSVpv(value, 0), 0); } break; } case TYPE_HINT_STRING: hv_store(kvmap, name, strlen(name), newSVpv(value, 0), 0); break; default: need_drop = type_cast_drop_helper(self->template_options.on_error, value, "<unknown>"); break; } return need_drop; }
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; }
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_literal(name, value, value_len, state); break; case TYPE_HINT_LIST: tf_json_append_list(name, value, value_len, state); break; case TYPE_HINT_INT32: { gint32 i32; const gchar *v = value; gsize v_len = value_len; if (!type_cast_to_int32(value, &i32, NULL)) { if ((on_error & ON_ERROR_FALLBACK_TO_STRING)) tf_json_append_value(name, v, v_len, state, TRUE); else return type_cast_drop_helper(on_error, value, "int32"); } else { tf_json_append_value(name, v, v_len, state, FALSE); } break; } case TYPE_HINT_INT64: { gint64 i64; const gchar *v = value; gsize v_len = value_len; if (!type_cast_to_int64(value, &i64, NULL)) { if ((on_error & ON_ERROR_FALLBACK_TO_STRING)) tf_json_append_value(name, v, v_len, state, TRUE); else return type_cast_drop_helper(on_error, value, "int64"); } else { tf_json_append_value(name, v, v_len, state, FALSE); } break; } case TYPE_HINT_DOUBLE: { gdouble d; const gchar *v = value; gsize v_len = value_len; if (!type_cast_to_double(value, &d, NULL)) { if ((on_error & ON_ERROR_FALLBACK_TO_STRING)) tf_json_append_value(name, v, v_len, state, TRUE); else return type_cast_drop_helper(on_error, value, "double"); } else { tf_json_append_value(name, v, v_len, state, FALSE); } break; } case TYPE_HINT_BOOLEAN: { gboolean b; const gchar *v = value; gsize v_len = value_len; if (!type_cast_to_boolean(value, &b, NULL)) { if (!(on_error & ON_ERROR_FALLBACK_TO_STRING)) return type_cast_drop_helper(on_error, value, "boolean"); tf_json_append_value(name, v, v_len, state, TRUE); } else { v = b ? "true" : "false"; v_len = -1; tf_json_append_value(name, v, v_len, state, FALSE); } break; } } state->need_comma = TRUE; return FALSE; }