diff options
author | Robert Haas <rhaas@postgresql.org> | 2021-10-05 11:50:21 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2021-10-05 11:50:21 -0400 |
commit | 0ba281cb4bf9f5f65529dfa4c8282abb734dd454 (patch) | |
tree | aba158ac397631b53a39ef406927980cbc89f38b /src/bin/pg_basebackup/streamutil.c | |
parent | 68601985e699adeb267636fd19d3d6113554bd1f (diff) | |
download | postgresql-0ba281cb4bf9f5f65529dfa4c8282abb734dd454.tar.gz postgresql-0ba281cb4bf9f5f65529dfa4c8282abb734dd454.zip |
Flexible options for BASE_BACKUP.
Previously, BASE_BACKUP used an entirely hard-coded syntax, but that's
hard to extend. Instead, adopt the same kind of syntax we've used for
SQL commands such as VACUUM, ANALYZE, COPY, and EXPLAIN, where it's
not necessary for all of the option names to be parser keywords.
In the new syntax, most of the options now take an optional Boolean
argument. To match our practice in other in places, the options which
the old syntax called NOWAIT and NOVERIFY_CHECKSUMS options are in the
new syntax called WAIT and VERIFY_CHECKUMS, and the default value is
false. In the new syntax, the FAST option has been replaced by a
CHECKSUM option whose value may be 'fast' or 'spread'.
This commit does not remove support for the old syntax. It just adds
the new one as an additional option, and makes pg_basebackup prefer
the new syntax when the server is new enough to support it.
Patch by me, reviewed and tested by Fabien Coelho, Sergei Kornilov,
Fujii Masao, and Tushar Ahuja.
Discussion: http://postgr.es/m/CA+TgmobAczXDRO_Gr2euo_TxgzaH1JxbNxvFx=HYvBinefNH8Q@mail.gmail.com
Discussion: http://postgr.es/m/CA+TgmoZGwR=ZVWFeecncubEyPdwghnvfkkdBe9BLccLSiqdf9Q@mail.gmail.com
Diffstat (limited to 'src/bin/pg_basebackup/streamutil.c')
-rw-r--r-- | src/bin/pg_basebackup/streamutil.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c index f5b3b476e52..d782b81adc6 100644 --- a/src/bin/pg_basebackup/streamutil.c +++ b/src/bin/pg_basebackup/streamutil.c @@ -603,6 +603,67 @@ DropReplicationSlot(PGconn *conn, const char *slot_name) return true; } +/* + * Append a "plain" option - one with no value - to a server command that + * is being constructed. + * + * In the old syntax, all options were parser keywords, so you could just + * write things like SOME_COMMAND OPTION1 OPTION2 'opt2value' OPTION3 42. The + * new syntax uses a comma-separated list surrounded by parentheses, so the + * equivalent is SOME_COMMAND (OPTION1, OPTION2 'optvalue', OPTION3 42). + */ +void +AppendPlainCommandOption(PQExpBuffer buf, bool use_new_option_syntax, + char *option_name) +{ + if (buf->len > 0 && buf->data[buf->len - 1] != '(') + { + if (use_new_option_syntax) + appendPQExpBufferStr(buf, ", "); + else + appendPQExpBufferChar(buf, ' '); + } + + appendPQExpBuffer(buf, " %s", option_name); +} + +/* + * Append an option with an associated string value to a server command that + * is being constructed. + * + * See comments for AppendPlainCommandOption, above. + */ +void +AppendStringCommandOption(PQExpBuffer buf, bool use_new_option_syntax, + char *option_name, char *option_value) +{ + AppendPlainCommandOption(buf, use_new_option_syntax, option_name); + + if (option_value != NULL) + { + size_t length = strlen(option_value); + char *escaped_value = palloc(1 + 2 * length); + + PQescapeStringConn(conn, escaped_value, option_value, length, NULL); + appendPQExpBuffer(buf, " '%s'", escaped_value); + pfree(escaped_value); + } +} + +/* + * Append an option with an associated integer value to a server command + * is being constructed. + * + * See comments for AppendPlainCommandOption, above. + */ +void +AppendIntegerCommandOption(PQExpBuffer buf, bool use_new_option_syntax, + char *option_name, int32 option_value) +{ + AppendPlainCommandOption(buf, use_new_option_syntax, option_name); + + appendPQExpBuffer(buf, " %d", option_value); +} /* * Frontend version of GetCurrentTimestamp(), since we are not linked with |