diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2022-12-11 10:39:05 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2022-12-11 10:39:05 -0500 |
commit | 50428a301d5ad46316cac2192f2ca8d91898aa3c (patch) | |
tree | af6ebd0e69eed53dfdd8f87eb7d36e228d274d5f /src/bin/pg_verifybackup/parse_manifest.c | |
parent | d02ef65bce6575e10ac0b4e7b8552ff67687c944 (diff) | |
download | postgresql-50428a301d5ad46316cac2192f2ca8d91898aa3c.tar.gz postgresql-50428a301d5ad46316cac2192f2ca8d91898aa3c.zip |
Change JsonSemAction to allow non-throw error reporting.
Formerly, semantic action functions for the JSON parser returned void,
so that there was no way for them to affect the parser's behavior.
That means in particular that they can't force an error exit except by
longjmp'ing. That won't do in the context of our project to make input
functions return errors softly. Hence, change them to return the same
JsonParseErrorType enum value as the parser itself uses. If an action
function returns anything besides JSON_SUCCESS, the parse is abandoned
and that error code is returned.
Action functions can thus easily return the same error conditions that
the parser already knows about. As an escape hatch for expansion, also
invent a code JSON_SEM_ACTION_FAILED that the core parser does not know
the exact meaning of. When returning this code, an action function
must use some out-of-band mechanism for reporting the error details.
This commit simply makes the API change and causes all the existing
action functions to return JSON_SUCCESS, so that there is no actual
change in behavior here. This is long enough and boring enough that
it seemed best to commit it separately from the changes that make
real use of the new mechanism.
In passing, remove a duplicate assignment of
transform_string_values_scalar.
Discussion: https://postgr.es/m/1436686.1670701118@sss.pgh.pa.us
Diffstat (limited to 'src/bin/pg_verifybackup/parse_manifest.c')
-rw-r--r-- | src/bin/pg_verifybackup/parse_manifest.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/src/bin/pg_verifybackup/parse_manifest.c b/src/bin/pg_verifybackup/parse_manifest.c index 6364b012821..beff018e183 100644 --- a/src/bin/pg_verifybackup/parse_manifest.c +++ b/src/bin/pg_verifybackup/parse_manifest.c @@ -88,14 +88,14 @@ typedef struct char *manifest_checksum; } JsonManifestParseState; -static void json_manifest_object_start(void *state); -static void json_manifest_object_end(void *state); -static void json_manifest_array_start(void *state); -static void json_manifest_array_end(void *state); -static void json_manifest_object_field_start(void *state, char *fname, - bool isnull); -static void json_manifest_scalar(void *state, char *token, - JsonTokenType tokentype); +static JsonParseErrorType json_manifest_object_start(void *state); +static JsonParseErrorType json_manifest_object_end(void *state); +static JsonParseErrorType json_manifest_array_start(void *state); +static JsonParseErrorType json_manifest_array_end(void *state); +static JsonParseErrorType json_manifest_object_field_start(void *state, char *fname, + bool isnull); +static JsonParseErrorType json_manifest_scalar(void *state, char *token, + JsonTokenType tokentype); static void json_manifest_finalize_file(JsonManifestParseState *parse); static void json_manifest_finalize_wal_range(JsonManifestParseState *parse); static void verify_manifest_checksum(JsonManifestParseState *parse, @@ -162,7 +162,7 @@ json_parse_manifest(JsonManifestParseContext *context, char *buffer, * WAL range is also expected to be an object. If we're anywhere else in the * document, it's an error. */ -static void +static JsonParseErrorType json_manifest_object_start(void *state) { JsonManifestParseState *parse = state; @@ -191,6 +191,8 @@ json_manifest_object_start(void *state) "unexpected object start"); break; } + + return JSON_SUCCESS; } /* @@ -201,7 +203,7 @@ json_manifest_object_start(void *state) * reach the end of an object representing a particular file or WAL range, * we must call json_manifest_finalize_file() to save the associated details. */ -static void +static JsonParseErrorType json_manifest_object_end(void *state) { JsonManifestParseState *parse = state; @@ -224,6 +226,8 @@ json_manifest_object_end(void *state) "unexpected object end"); break; } + + return JSON_SUCCESS; } /* @@ -233,7 +237,7 @@ json_manifest_object_end(void *state) * should be an array. Similarly for the "WAL-Ranges" key. No other arrays * are expected. */ -static void +static JsonParseErrorType json_manifest_array_start(void *state) { JsonManifestParseState *parse = state; @@ -251,6 +255,8 @@ json_manifest_array_start(void *state) "unexpected array start"); break; } + + return JSON_SUCCESS; } /* @@ -258,7 +264,7 @@ json_manifest_array_start(void *state) * * The cases here are analogous to those in json_manifest_array_start. */ -static void +static JsonParseErrorType json_manifest_array_end(void *state) { JsonManifestParseState *parse = state; @@ -274,12 +280,14 @@ json_manifest_array_end(void *state) "unexpected array end"); break; } + + return JSON_SUCCESS; } /* * Invoked at the start of each object field in the JSON document. */ -static void +static JsonParseErrorType json_manifest_object_field_start(void *state, char *fname, bool isnull) { JsonManifestParseState *parse = state; @@ -367,6 +375,8 @@ json_manifest_object_field_start(void *state, char *fname, bool isnull) "unexpected object field"); break; } + + return JSON_SUCCESS; } /* @@ -384,7 +394,7 @@ json_manifest_object_field_start(void *state, char *fname, bool isnull) * reach either the end of the object representing this file, or the end * of the manifest, as the case may be. */ -static void +static JsonParseErrorType json_manifest_scalar(void *state, char *token, JsonTokenType tokentype) { JsonManifestParseState *parse = state; @@ -448,6 +458,8 @@ json_manifest_scalar(void *state, char *token, JsonTokenType tokentype) json_manifest_parse_failure(parse->context, "unexpected scalar"); break; } + + return JSON_SUCCESS; } /* |