static int report_json_context(JsonLexContext *lex);
/* semantic action functions for json_object_keys */
-static void okeys_object_field_start(void *state, char *fname, bool isnull);
-static void okeys_array_start(void *state);
-static void okeys_scalar(void *state, char *token, JsonTokenType tokentype);
+static JsonParseErrorType okeys_object_field_start(void *state, char *fname, bool isnull);
+static JsonParseErrorType okeys_array_start(void *state);
+static JsonParseErrorType okeys_scalar(void *state, char *token, JsonTokenType tokentype);
/* semantic action functions for json_get* functions */
-static void get_object_start(void *state);
-static void get_object_end(void *state);
-static void get_object_field_start(void *state, char *fname, bool isnull);
-static void get_object_field_end(void *state, char *fname, bool isnull);
-static void get_array_start(void *state);
-static void get_array_end(void *state);
-static void get_array_element_start(void *state, bool isnull);
-static void get_array_element_end(void *state, bool isnull);
-static void get_scalar(void *state, char *token, JsonTokenType tokentype);
+static JsonParseErrorType get_object_start(void *state);
+static JsonParseErrorType get_object_end(void *state);
+static JsonParseErrorType get_object_field_start(void *state, char *fname, bool isnull);
+static JsonParseErrorType get_object_field_end(void *state, char *fname, bool isnull);
+static JsonParseErrorType get_array_start(void *state);
+static JsonParseErrorType get_array_end(void *state);
+static JsonParseErrorType get_array_element_start(void *state, bool isnull);
+static JsonParseErrorType get_array_element_end(void *state, bool isnull);
+static JsonParseErrorType get_scalar(void *state, char *token, JsonTokenType tokentype);
/* common worker function for json getter functions */
static Datum get_path_all(FunctionCallInfo fcinfo, bool as_text);
static text *JsonbValueAsText(JsonbValue *v);
/* semantic action functions for json_array_length */
-static void alen_object_start(void *state);
-static void alen_scalar(void *state, char *token, JsonTokenType tokentype);
-static void alen_array_element_start(void *state, bool isnull);
+static JsonParseErrorType alen_object_start(void *state);
+static JsonParseErrorType alen_scalar(void *state, char *token, JsonTokenType tokentype);
+static JsonParseErrorType alen_array_element_start(void *state, bool isnull);
/* common workers for json{b}_each* functions */
static Datum each_worker(FunctionCallInfo fcinfo, bool as_text);
bool as_text);
/* semantic action functions for json_each */
-static void each_object_field_start(void *state, char *fname, bool isnull);
-static void each_object_field_end(void *state, char *fname, bool isnull);
-static void each_array_start(void *state);
-static void each_scalar(void *state, char *token, JsonTokenType tokentype);
+static JsonParseErrorType each_object_field_start(void *state, char *fname, bool isnull);
+static JsonParseErrorType each_object_field_end(void *state, char *fname, bool isnull);
+static JsonParseErrorType each_array_start(void *state);
+static JsonParseErrorType each_scalar(void *state, char *token, JsonTokenType tokentype);
/* common workers for json{b}_array_elements_* functions */
static Datum elements_worker(FunctionCallInfo fcinfo, const char *funcname,
bool as_text);
/* semantic action functions for json_array_elements */
-static void elements_object_start(void *state);
-static void elements_array_element_start(void *state, bool isnull);
-static void elements_array_element_end(void *state, bool isnull);
-static void elements_scalar(void *state, char *token, JsonTokenType tokentype);
+static JsonParseErrorType elements_object_start(void *state);
+static JsonParseErrorType elements_array_element_start(void *state, bool isnull);
+static JsonParseErrorType elements_array_element_end(void *state, bool isnull);
+static JsonParseErrorType elements_scalar(void *state, char *token, JsonTokenType tokentype);
/* turn a json object into a hash table */
static HTAB *get_json_object_as_hash(char *json, int len, const char *funcname);
/* semantic actions for populate_array_json */
-static void populate_array_object_start(void *_state);
-static void populate_array_array_end(void *_state);
-static void populate_array_element_start(void *_state, bool isnull);
-static void populate_array_element_end(void *_state, bool isnull);
-static void populate_array_scalar(void *_state, char *token, JsonTokenType tokentype);
+static JsonParseErrorType populate_array_object_start(void *_state);
+static JsonParseErrorType populate_array_array_end(void *_state);
+static JsonParseErrorType populate_array_element_start(void *_state, bool isnull);
+static JsonParseErrorType populate_array_element_end(void *_state, bool isnull);
+static JsonParseErrorType populate_array_scalar(void *_state, char *token, JsonTokenType tokentype);
/* semantic action functions for get_json_object_as_hash */
-static void hash_object_field_start(void *state, char *fname, bool isnull);
-static void hash_object_field_end(void *state, char *fname, bool isnull);
-static void hash_array_start(void *state);
-static void hash_scalar(void *state, char *token, JsonTokenType tokentype);
+static JsonParseErrorType hash_object_field_start(void *state, char *fname, bool isnull);
+static JsonParseErrorType hash_object_field_end(void *state, char *fname, bool isnull);
+static JsonParseErrorType hash_array_start(void *state);
+static JsonParseErrorType hash_scalar(void *state, char *token, JsonTokenType tokentype);
/* semantic action functions for populate_recordset */
-static void populate_recordset_object_field_start(void *state, char *fname, bool isnull);
-static void populate_recordset_object_field_end(void *state, char *fname, bool isnull);
-static void populate_recordset_scalar(void *state, char *token, JsonTokenType tokentype);
-static void populate_recordset_object_start(void *state);
-static void populate_recordset_object_end(void *state);
-static void populate_recordset_array_start(void *state);
-static void populate_recordset_array_element_start(void *state, bool isnull);
+static JsonParseErrorType populate_recordset_object_field_start(void *state, char *fname, bool isnull);
+static JsonParseErrorType populate_recordset_object_field_end(void *state, char *fname, bool isnull);
+static JsonParseErrorType populate_recordset_scalar(void *state, char *token, JsonTokenType tokentype);
+static JsonParseErrorType populate_recordset_object_start(void *state);
+static JsonParseErrorType populate_recordset_object_end(void *state);
+static JsonParseErrorType populate_recordset_array_start(void *state);
+static JsonParseErrorType populate_recordset_array_element_start(void *state, bool isnull);
/* semantic action functions for json_strip_nulls */
-static void sn_object_start(void *state);
-static void sn_object_end(void *state);
-static void sn_array_start(void *state);
-static void sn_array_end(void *state);
-static void sn_object_field_start(void *state, char *fname, bool isnull);
-static void sn_array_element_start(void *state, bool isnull);
-static void sn_scalar(void *state, char *token, JsonTokenType tokentype);
+static JsonParseErrorType sn_object_start(void *state);
+static JsonParseErrorType sn_object_end(void *state);
+static JsonParseErrorType sn_array_start(void *state);
+static JsonParseErrorType sn_array_end(void *state);
+static JsonParseErrorType sn_object_field_start(void *state, char *fname, bool isnull);
+static JsonParseErrorType sn_array_element_start(void *state, bool isnull);
+static JsonParseErrorType sn_scalar(void *state, char *token, JsonTokenType tokentype);
/* worker functions for populate_record, to_record, populate_recordset and to_recordset */
static Datum populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname,
JsonbValue *newval, uint32 nelems, int op_type);
/* function supporting iterate_json_values */
-static void iterate_values_scalar(void *state, char *token, JsonTokenType tokentype);
-static void iterate_values_object_field_start(void *state, char *fname, bool isnull);
+static JsonParseErrorType iterate_values_scalar(void *state, char *token, JsonTokenType tokentype);
+static JsonParseErrorType iterate_values_object_field_start(void *state, char *fname, bool isnull);
/* functions supporting transform_json_string_values */
-static void transform_string_values_object_start(void *state);
-static void transform_string_values_object_end(void *state);
-static void transform_string_values_array_start(void *state);
-static void transform_string_values_array_end(void *state);
-static void transform_string_values_object_field_start(void *state, char *fname, bool isnull);
-static void transform_string_values_array_element_start(void *state, bool isnull);
-static void transform_string_values_scalar(void *state, char *token, JsonTokenType tokentype);
+static JsonParseErrorType transform_string_values_object_start(void *state);
+static JsonParseErrorType transform_string_values_object_end(void *state);
+static JsonParseErrorType transform_string_values_array_start(void *state);
+static JsonParseErrorType transform_string_values_array_end(void *state);
+static JsonParseErrorType transform_string_values_object_field_start(void *state, char *fname, bool isnull);
+static JsonParseErrorType transform_string_values_array_element_start(void *state, bool isnull);
+static JsonParseErrorType transform_string_values_scalar(void *state, char *token, JsonTokenType tokentype);
/*
* pg_parse_json_or_ereport
SRF_RETURN_DONE(funcctx);
}
-static void
+static JsonParseErrorType
okeys_object_field_start(void *state, char *fname, bool isnull)
{
OkeysState *_state = (OkeysState *) state;
/* only collecting keys for the top level object */
if (_state->lex->lex_level != 1)
- return;
+ return JSON_SUCCESS;
/* enlarge result array if necessary */
if (_state->result_count >= _state->result_size)
/* save a copy of the field name */
_state->result[_state->result_count++] = pstrdup(fname);
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
okeys_array_start(void *state)
{
OkeysState *_state = (OkeysState *) state;
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("cannot call %s on an array",
"json_object_keys")));
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
okeys_scalar(void *state, char *token, JsonTokenType tokentype)
{
OkeysState *_state = (OkeysState *) state;
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("cannot call %s on a scalar",
"json_object_keys")));
+
+ return JSON_SUCCESS;
}
/*
return state->tresult;
}
-static void
+static JsonParseErrorType
get_object_start(void *state)
{
GetState *_state = (GetState *) state;
*/
_state->result_start = _state->lex->token_start;
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
get_object_end(void *state)
{
GetState *_state = (GetState *) state;
_state->tresult = cstring_to_text_with_len(start, len);
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
get_object_field_start(void *state, char *fname, bool isnull)
{
GetState *_state = (GetState *) state;
_state->result_start = _state->lex->token_start;
}
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
get_object_field_end(void *state, char *fname, bool isnull)
{
GetState *_state = (GetState *) state;
/* this should be unnecessary but let's do it for cleanliness: */
_state->result_start = NULL;
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
get_array_start(void *state)
{
GetState *_state = (GetState *) state;
*/
_state->result_start = _state->lex->token_start;
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
get_array_end(void *state)
{
GetState *_state = (GetState *) state;
_state->tresult = cstring_to_text_with_len(start, len);
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
get_array_element_start(void *state, bool isnull)
{
GetState *_state = (GetState *) state;
_state->result_start = _state->lex->token_start;
}
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
get_array_element_end(void *state, bool isnull)
{
GetState *_state = (GetState *) state;
_state->result_start = NULL;
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
get_scalar(void *state, char *token, JsonTokenType tokentype)
{
GetState *_state = (GetState *) state;
/* make sure the next call to get_scalar doesn't overwrite it */
_state->next_scalar = false;
}
+
+ return JSON_SUCCESS;
}
Datum
* a scalar or an object).
*/
-static void
+static JsonParseErrorType
alen_object_start(void *state)
{
AlenState *_state = (AlenState *) state;
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("cannot get array length of a non-array")));
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
alen_scalar(void *state, char *token, JsonTokenType tokentype)
{
AlenState *_state = (AlenState *) state;
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("cannot get array length of a scalar")));
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
alen_array_element_start(void *state, bool isnull)
{
AlenState *_state = (AlenState *) state;
/* just count up all the level 1 elements */
if (_state->lex->lex_level == 1)
_state->count++;
+
+ return JSON_SUCCESS;
}
/*
}
-static void
+static JsonParseErrorType
each_object_field_start(void *state, char *fname, bool isnull)
{
EachState *_state = (EachState *) state;
else
_state->result_start = _state->lex->token_start;
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
each_object_field_end(void *state, char *fname, bool isnull)
{
EachState *_state = (EachState *) state;
/* skip over nested objects */
if (_state->lex->lex_level != 1)
- return;
+ return JSON_SUCCESS;
/* use the tmp context so we can clean up after each tuple is done */
old_cxt = MemoryContextSwitchTo(_state->tmp_cxt);
/* clean up and switch back */
MemoryContextSwitchTo(old_cxt);
MemoryContextReset(_state->tmp_cxt);
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
each_array_start(void *state)
{
EachState *_state = (EachState *) state;
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("cannot deconstruct an array as an object")));
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
each_scalar(void *state, char *token, JsonTokenType tokentype)
{
EachState *_state = (EachState *) state;
/* supply de-escaped value if required */
if (_state->next_scalar)
_state->normalized_scalar = token;
+
+ return JSON_SUCCESS;
}
/*
PG_RETURN_NULL();
}
-static void
+static JsonParseErrorType
elements_array_element_start(void *state, bool isnull)
{
ElementsState *_state = (ElementsState *) state;
else
_state->result_start = _state->lex->token_start;
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
elements_array_element_end(void *state, bool isnull)
{
ElementsState *_state = (ElementsState *) state;
/* skip over nested objects */
if (_state->lex->lex_level != 1)
- return;
+ return JSON_SUCCESS;
/* use the tmp context so we can clean up after each tuple is done */
old_cxt = MemoryContextSwitchTo(_state->tmp_cxt);
/* clean up and switch back */
MemoryContextSwitchTo(old_cxt);
MemoryContextReset(_state->tmp_cxt);
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
elements_object_start(void *state)
{
ElementsState *_state = (ElementsState *) state;
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("cannot call %s on a non-array",
_state->function_name)));
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
elements_scalar(void *state, char *token, JsonTokenType tokentype)
{
ElementsState *_state = (ElementsState *) state;
/* supply de-escaped value if required */
if (_state->next_scalar)
_state->normalized_scalar = token;
+
+ return JSON_SUCCESS;
}
/*
}
/* json object start handler for populate_array_json() */
-static void
+static JsonParseErrorType
populate_array_object_start(void *_state)
{
PopulateArrayState *state = (PopulateArrayState *) _state;
populate_array_assign_ndims(state->ctx, ndim);
else if (ndim < state->ctx->ndims)
populate_array_report_expected_array(state->ctx, ndim);
+
+ return JSON_SUCCESS;
}
/* json array end handler for populate_array_json() */
-static void
+static JsonParseErrorType
populate_array_array_end(void *_state)
{
PopulateArrayState *state = (PopulateArrayState *) _state;
if (ndim < ctx->ndims)
populate_array_check_dimension(ctx, ndim);
+
+ return JSON_SUCCESS;
}
/* json array element start handler for populate_array_json() */
-static void
+static JsonParseErrorType
populate_array_element_start(void *_state, bool isnull)
{
PopulateArrayState *state = (PopulateArrayState *) _state;
state->element_type = state->lex->token_type;
state->element_scalar = NULL;
}
+
+ return JSON_SUCCESS;
}
/* json array element end handler for populate_array_json() */
-static void
+static JsonParseErrorType
populate_array_element_end(void *_state, bool isnull)
{
PopulateArrayState *state = (PopulateArrayState *) _state;
populate_array_element(ctx, ndim, &jsv);
}
+
+ return JSON_SUCCESS;
}
/* json scalar handler for populate_array_json() */
-static void
+static JsonParseErrorType
populate_array_scalar(void *_state, char *token, JsonTokenType tokentype)
{
PopulateArrayState *state = (PopulateArrayState *) _state;
/* element_type must already be set in populate_array_element_start() */
Assert(state->element_type == tokentype);
}
+
+ return JSON_SUCCESS;
}
/* parse a json array and populate array */
return tab;
}
-static void
+static JsonParseErrorType
hash_object_field_start(void *state, char *fname, bool isnull)
{
JHashState *_state = (JHashState *) state;
if (_state->lex->lex_level > 1)
- return;
+ return JSON_SUCCESS;
/* remember token type */
_state->saved_token_type = _state->lex->token_type;
/* must be a scalar */
_state->save_json_start = NULL;
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
hash_object_field_end(void *state, char *fname, bool isnull)
{
JHashState *_state = (JHashState *) state;
* Ignore nested fields.
*/
if (_state->lex->lex_level > 1)
- return;
+ return JSON_SUCCESS;
/*
* Ignore field names >= NAMEDATALEN - they can't match a record field.
* has previously insisted on exact equality, so we keep this behavior.)
*/
if (strlen(fname) >= NAMEDATALEN)
- return;
+ return JSON_SUCCESS;
hashentry = hash_search(_state->hash, fname, HASH_ENTER, &found);
/* must have had a scalar instead */
hashentry->val = _state->saved_scalar;
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
hash_array_start(void *state)
{
JHashState *_state = (JHashState *) state;
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("cannot call %s on an array", _state->function_name)));
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
hash_scalar(void *state, char *token, JsonTokenType tokentype)
{
JHashState *_state = (JHashState *) state;
/* saved_token_type must already be set in hash_object_field_start() */
Assert(_state->saved_token_type == tokentype);
}
+
+ return JSON_SUCCESS;
}
PG_RETURN_NULL();
}
-static void
+static JsonParseErrorType
populate_recordset_object_start(void *state)
{
PopulateRecordsetState *_state = (PopulateRecordsetState *) state;
/* Nested objects require no special processing */
if (lex_level > 1)
- return;
+ return JSON_SUCCESS;
/* Object at level 1: set up a new hash table for this object */
ctl.keysize = NAMEDATALEN;
100,
&ctl,
HASH_ELEM | HASH_STRINGS | HASH_CONTEXT);
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
populate_recordset_object_end(void *state)
{
PopulateRecordsetState *_state = (PopulateRecordsetState *) state;
/* Nested objects require no special processing */
if (_state->lex->lex_level > 1)
- return;
+ return JSON_SUCCESS;
obj.is_json = true;
obj.val.json_hash = _state->json_hash;
/* Done with hash for this object */
hash_destroy(_state->json_hash);
_state->json_hash = NULL;
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
populate_recordset_array_element_start(void *state, bool isnull)
{
PopulateRecordsetState *_state = (PopulateRecordsetState *) state;
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("argument of %s must be an array of objects",
_state->function_name)));
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
populate_recordset_array_start(void *state)
{
/* nothing to do */
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
populate_recordset_scalar(void *state, char *token, JsonTokenType tokentype)
{
PopulateRecordsetState *_state = (PopulateRecordsetState *) state;
if (_state->lex->lex_level == 2)
_state->saved_scalar = token;
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
populate_recordset_object_field_start(void *state, char *fname, bool isnull)
{
PopulateRecordsetState *_state = (PopulateRecordsetState *) state;
if (_state->lex->lex_level > 2)
- return;
+ return JSON_SUCCESS;
_state->saved_token_type = _state->lex->token_type;
{
_state->save_json_start = NULL;
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
populate_recordset_object_field_end(void *state, char *fname, bool isnull)
{
PopulateRecordsetState *_state = (PopulateRecordsetState *) state;
* Ignore nested fields.
*/
if (_state->lex->lex_level > 2)
- return;
+ return JSON_SUCCESS;
/*
* Ignore field names >= NAMEDATALEN - they can't match a record field.
* has previously insisted on exact equality, so we keep this behavior.)
*/
if (strlen(fname) >= NAMEDATALEN)
- return;
+ return JSON_SUCCESS;
hashentry = hash_search(_state->json_hash, fname, HASH_ENTER, &found);
/* must have had a scalar instead */
hashentry->val = _state->saved_scalar;
}
+
+ return JSON_SUCCESS;
}
/*
* is called.
*/
-static void
+static JsonParseErrorType
sn_object_start(void *state)
{
StripnullState *_state = (StripnullState *) state;
appendStringInfoCharMacro(_state->strval, '{');
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
sn_object_end(void *state)
{
StripnullState *_state = (StripnullState *) state;
appendStringInfoCharMacro(_state->strval, '}');
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
sn_array_start(void *state)
{
StripnullState *_state = (StripnullState *) state;
appendStringInfoCharMacro(_state->strval, '[');
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
sn_array_end(void *state)
{
StripnullState *_state = (StripnullState *) state;
appendStringInfoCharMacro(_state->strval, ']');
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
sn_object_field_start(void *state, char *fname, bool isnull)
{
StripnullState *_state = (StripnullState *) state;
* object or array. The flag will be reset in the scalar action.
*/
_state->skip_next_null = true;
- return;
+ return JSON_SUCCESS;
}
if (_state->strval->data[_state->strval->len - 1] != '{')
escape_json(_state->strval, fname);
appendStringInfoCharMacro(_state->strval, ':');
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
sn_array_element_start(void *state, bool isnull)
{
StripnullState *_state = (StripnullState *) state;
if (_state->strval->data[_state->strval->len - 1] != '[')
appendStringInfoCharMacro(_state->strval, ',');
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
sn_scalar(void *state, char *token, JsonTokenType tokentype)
{
StripnullState *_state = (StripnullState *) state;
{
Assert(tokentype == JSON_TOKEN_NULL);
_state->skip_next_null = false;
- return;
+ return JSON_SUCCESS;
}
if (tokentype == JSON_TOKEN_STRING)
escape_json(_state->strval, token);
else
appendStringInfoString(_state->strval, token);
+
+ return JSON_SUCCESS;
}
/*
* An auxiliary function for iterate_json_values to invoke a specified
* JsonIterateStringValuesAction for specified values.
*/
-static void
+static JsonParseErrorType
iterate_values_scalar(void *state, char *token, JsonTokenType tokentype)
{
IterateJsonStringValuesState *_state = (IterateJsonStringValuesState *) state;
/* do not call callback for any other token */
break;
}
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
iterate_values_object_field_start(void *state, char *fname, bool isnull)
{
IterateJsonStringValuesState *_state = (IterateJsonStringValuesState *) state;
_state->action(_state->action_state, val, strlen(val));
}
+
+ return JSON_SUCCESS;
}
/*
state->action_state = action_state;
sem->semstate = (void *) state;
- sem->scalar = transform_string_values_scalar;
sem->object_start = transform_string_values_object_start;
sem->object_end = transform_string_values_object_end;
sem->array_start = transform_string_values_array_start;
* specified JsonTransformStringValuesAction for all values and left everything
* else untouched.
*/
-static void
+static JsonParseErrorType
transform_string_values_object_start(void *state)
{
TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
appendStringInfoCharMacro(_state->strval, '{');
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
transform_string_values_object_end(void *state)
{
TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
appendStringInfoCharMacro(_state->strval, '}');
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
transform_string_values_array_start(void *state)
{
TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
appendStringInfoCharMacro(_state->strval, '[');
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
transform_string_values_array_end(void *state)
{
TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
appendStringInfoCharMacro(_state->strval, ']');
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
transform_string_values_object_field_start(void *state, char *fname, bool isnull)
{
TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
*/
escape_json(_state->strval, fname);
appendStringInfoCharMacro(_state->strval, ':');
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
transform_string_values_array_element_start(void *state, bool isnull)
{
TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
if (_state->strval->data[_state->strval->len - 1] != '[')
appendStringInfoCharMacro(_state->strval, ',');
+
+ return JSON_SUCCESS;
}
-static void
+static JsonParseErrorType
transform_string_values_scalar(void *state, char *token, JsonTokenType tokentype)
{
TransformJsonStringValuesState *_state = (TransformJsonStringValuesState *) state;
}
else
appendStringInfoString(_state->strval, token);
+
+ return JSON_SUCCESS;
}