public inbox for [email protected]
help / color / mirror / Atom feedFrom: Álvaro Herrera <[email protected]>
Subject: [PATCH 2/2] Apply the same technique to PrintNewControlValues too
Date: Sat, 31 Jan 2026 16:01:56 +0100
---
src/bin/pg_resetwal/entries.h | 60 +++++++--------
src/bin/pg_resetwal/pg_resetwal.c | 121 ++++++++++++++++++++----------
2 files changed, 110 insertions(+), 71 deletions(-)
diff --git a/src/bin/pg_resetwal/entries.h b/src/bin/pg_resetwal/entries.h
index 6b7686da83a..25f2c49b3a8 100644
--- a/src/bin/pg_resetwal/entries.h
+++ b/src/bin/pg_resetwal/entries.h
@@ -1,62 +1,62 @@
-CONTROLDATA_LINE("pg_control version number",
+CONTROLDATA_LINE(CD_CONTROL_VERSION, "pg_control version number",
"%u", ControlFile.pg_control_version)
-CONTROLDATA_LINE("Catalog version number",
+CONTROLDATA_LINE(CD_CATALOG_VERSION, "Catalog version number",
"%u", ControlFile.catalog_version_no)
-CONTROLDATA_LINE("Database system identifier",
+CONTROLDATA_LINE(CD_SYSTEM_IDENTIFIER, "Database system identifier",
"%" PRIu64, ControlFile.system_identifier)
-CONTROLDATA_LINE("Latest checkpoint's TimeLineID",
+CONTROLDATA_LINE(CD_CKPT_TIMELINE, "Latest checkpoint's TimeLineID",
"%u", ControlFile.checkPointCopy.ThisTimeLineID)
-CONTROLDATA_LINE("Latest checkpoint's full_page_writes",
+CONTROLDATA_LINE(CD_CKPT_FPW, "Latest checkpoint's full_page_writes",
"%s", (ControlFile.checkPointCopy.fullPageWrites ? _("on") : _("off")))
-CONTROLDATA_LINE("Latest checkpoint's NextXID",
+CONTROLDATA_LINE(CD_CKPT_NEXTXID, "Latest checkpoint's NextXID",
"%u:%u", EpochFromFullTransactionId(ControlFile.checkPointCopy.nextXid), XidFromFullTransactionId(ControlFile.checkPointCopy.nextXid))
-CONTROLDATA_LINE("Latest checkpoint's NextOID",
+CONTROLDATA_LINE(CD_CKPT_NEXTOID, "Latest checkpoint's NextOID",
"%u", ControlFile.checkPointCopy.nextOid)
-CONTROLDATA_LINE("Latest checkpoint's NextMultiXactId",
+CONTROLDATA_LINE(CD_CKPT_NEXTMXID, "Latest checkpoint's NextMultiXactId",
"%u", ControlFile.checkPointCopy.nextMulti)
-CONTROLDATA_LINE("Latest checkpoint's NextMultiOffset",
+CONTROLDATA_LINE(CD_CKPT_NEXTMXOFF, "Latest checkpoint's NextMultiOffset",
"%" PRIu64, ControlFile.checkPointCopy.nextMultiOffset)
-CONTROLDATA_LINE("Latest checkpoint's oldestXID",
+CONTROLDATA_LINE(CD_CKPT_OLDESTXID, "Latest checkpoint's oldestXID",
"%u", ControlFile.checkPointCopy.oldestXid)
-CONTROLDATA_LINE("Latest checkpoint's oldestXID's DB",
+CONTROLDATA_LINE(CD_CKPT_OLDESTXID_DB, "Latest checkpoint's oldestXID's DB",
"%u", ControlFile.checkPointCopy.oldestXidDB)
-CONTROLDATA_LINE("Latest checkpoint's oldestActiveXID",
+CONTROLDATA_LINE(CD_CKPT_OLDEST_ACTIVEXID, "Latest checkpoint's oldestActiveXID",
"%u", ControlFile.checkPointCopy.oldestActiveXid)
-CONTROLDATA_LINE("Latest checkpoint's oldestMultiXid",
+CONTROLDATA_LINE(CD_CKPT_OLDEST_MULTI, "Latest checkpoint's oldestMultiXid",
"%u", ControlFile.checkPointCopy.oldestMulti)
-CONTROLDATA_LINE("Latest checkpoint's oldestMulti's DB",
+CONTROLDATA_LINE(CD_CKPT_OLDEST_MULTI_DB, "Latest checkpoint's oldestMulti's DB",
"%u", ControlFile.checkPointCopy.oldestMultiDB)
-CONTROLDATA_LINE("Latest checkpoint's oldestCommitTsXid",
+CONTROLDATA_LINE(CD_CKPT_OLDEST_COMMITTS_XID, "Latest checkpoint's oldestCommitTsXid",
"%u", ControlFile.checkPointCopy.oldestCommitTsXid)
-CONTROLDATA_LINE("Latest checkpoint's newestCommitTsXid",
+CONTROLDATA_LINE(CD_CKPT_NEWEST_COMMITTS_XID, "Latest checkpoint's newestCommitTsXid",
"%u", ControlFile.checkPointCopy.newestCommitTsXid)
-CONTROLDATA_LINE("Maximum data alignment",
+CONTROLDATA_LINE(CD_MAXALIGN, "Maximum data alignment",
"%u", ControlFile.maxAlign)
-CONTROLDATA_LINE("Database block size",
+CONTROLDATA_LINE(CD_BLCKSZ, "Database block size",
"%u", ControlFile.blcksz)
-CONTROLDATA_LINE("Blocks per segment of large relation",
+CONTROLDATA_LINE(CD_RELSEG_SZ, "Blocks per segment of large relation",
"%u", ControlFile.relseg_size)
-CONTROLDATA_LINE("Pages per SLRU segment",
+CONTROLDATA_LINE(CD_SLRU_PPS, "Pages per SLRU segment",
"%u", ControlFile.slru_pages_per_segment)
-CONTROLDATA_LINE("WAL block size",
+CONTROLDATA_LINE(CD_WAL_BLCKSZ, "WAL block size",
"%u", ControlFile.xlog_blcksz)
-CONTROLDATA_LINE("Bytes per WAL segment",
+CONTROLDATA_LINE(CD_WAL_SEGSIZE, "Bytes per WAL segment",
"%u", ControlFile.xlog_seg_size)
-CONTROLDATA_LINE("Maximum length of identifiers",
+CONTROLDATA_LINE(CD_WAL_NAMEDATALEN, "Maximum length of identifiers",
"%u", ControlFile.nameDataLen)
-CONTROLDATA_LINE("Maximum columns in an index",
+CONTROLDATA_LINE(CD_INDEX_MAX_KEYS, "Maximum columns in an index",
"%u", ControlFile.indexMaxKeys)
-CONTROLDATA_LINE("Maximum size of a TOAST chunk",
+CONTROLDATA_LINE(CD_TOAST_MAXCHUNKSZ, "Maximum size of a TOAST chunk",
"%u", ControlFile.toast_max_chunk_size)
-CONTROLDATA_LINE("Size of a large-object chunk",
+CONTROLDATA_LINE(CD_LO_BLKSZ, "Size of a large-object chunk",
"%u", ControlFile.loblksize)
/* This is no longer configurable, but users may still expect to see it: */
-CONTROLDATA_LINE("Date/time type storage",
+CONTROLDATA_LINE(CD_DATETIME_INT64, "Date/time type storage",
"%s", _("64-bit integers"))
-CONTROLDATA_LINE("Float8 argument passing",
+CONTROLDATA_LINE(CD_FLOAT8_ARGS, "Float8 argument passing",
"%s", ControlFile.float8ByVal ? _("by value") : _("by reference"))
-CONTROLDATA_LINE("Data page checksum version",
+CONTROLDATA_LINE(CD_CHECKSUMS, "Data page checksum version",
"%u", ControlFile.data_checksum_version)
-CONTROLDATA_LINE("Default char data signedness",
+CONTROLDATA_LINE(CD_CHAR_SIGNEDNESS, "Default char data signedness",
"%s", ControlFile.default_char_signedness ? _("signed") : _("unsigned"))
diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c
index fb17b6f80e0..23bf1c62183 100644
--- a/src/bin/pg_resetwal/pg_resetwal.c
+++ b/src/bin/pg_resetwal/pg_resetwal.c
@@ -55,6 +55,7 @@
#include "common/restricted_token.h"
#include "common/string.h"
#include "fe_utils/option_utils.h"
+#include "fe_utils/simple_list.h"
#include "fe_utils/version.h"
#include "getopt_long.h"
#include "mb/pg_wchar.h"
@@ -119,6 +120,14 @@ static int internal_wcswidth(const char *pwcs, size_t len, int encoding);
static uint32 strtouint32_strict(const char *restrict s, char **restrict endptr, int base);
static uint64 strtouint64_strict(const char *restrict s, char **restrict endptr, int base);
+/* Define the string enums */
+#define CONTROLDATA_LINE(symbol, description, fmt, ...) \
+ symbol,
+enum ControldataStrings {
+#include "entries.h"
+};
+#undef CONTROLDATA_LINE
+
int
main(int argc, char *argv[])
@@ -768,7 +777,7 @@ PrintControlValues(bool guessed)
* First, determine the maximum length of the description of all entries,
* some or all of which might be translated.
*/
-#define CONTROLDATA_LINE(description, fmt, ...) \
+#define CONTROLDATA_LINE(symbol, description, fmt, ...) \
thislen = internal_wcswidth(_(description), \
strlen(_(description)), \
encoding); \
@@ -781,7 +790,7 @@ PrintControlValues(bool guessed)
* Print each line: the possibly-translated description, then some padding
* spaces according to its display width, then the value.
*/
-#define CONTROLDATA_LINE(description, fmt, ...) \
+#define CONTROLDATA_LINE(symbol, description, fmt, ...) \
{ \
int thisstrlen; \
\
@@ -807,69 +816,99 @@ static void
PrintNewControlValues(void)
{
char fname[MAXFNAMELEN];
+ int encoding = pg_get_encoding_from_locale(NULL, true);
+ SimpleOidList toprint = {NULL, NULL};
+ int maxlen = 0;
+ int thislen;
/* This will be always printed in order to keep format same. */
printf(_("\n\nValues to be changed:\n\n"));
- XLogFileName(fname, ControlFile.checkPointCopy.ThisTimeLineID,
- newXlogSegNo, WalSegSz);
- printf(_("First log segment after reset: %s\n"), fname);
-
if (mxids_given)
{
- printf(_("NextMultiXactId: %u\n"),
- ControlFile.checkPointCopy.nextMulti);
- printf(_("OldestMultiXid: %u\n"),
- ControlFile.checkPointCopy.oldestMulti);
- printf(_("OldestMulti's DB: %u\n"),
- ControlFile.checkPointCopy.oldestMultiDB);
+ simple_oid_list_append(&toprint, CD_CKPT_NEXTMXID);
+ simple_oid_list_append(&toprint, CD_CKPT_OLDEST_MULTI);
+ simple_oid_list_append(&toprint, CD_CKPT_OLDEST_MULTI_DB);
}
if (next_mxoff_given)
- {
- printf(_("NextMultiOffset: %" PRIu64 "\n"),
- ControlFile.checkPointCopy.nextMultiOffset);
- }
+ simple_oid_list_append(&toprint, CD_CKPT_NEXTMXOFF);
if (next_oid_given)
- {
- printf(_("NextOID: %u\n"),
- ControlFile.checkPointCopy.nextOid);
- }
+ simple_oid_list_append(&toprint, CD_CKPT_NEXTOID);
if (next_xid_given)
- {
- printf(_("NextXID: %u\n"),
- XidFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
- }
+ simple_oid_list_append(&toprint, CD_CKPT_NEXTXID);
if (oldest_xid_given)
{
- printf(_("OldestXID: %u\n"),
- ControlFile.checkPointCopy.oldestXid);
- printf(_("OldestXID's DB: %u\n"),
- ControlFile.checkPointCopy.oldestXidDB);
- }
-
- if (next_xid_epoch_given)
- {
- printf(_("NextXID epoch: %u\n"),
- EpochFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
+ simple_oid_list_append(&toprint, CD_CKPT_OLDESTXID);
+ simple_oid_list_append(&toprint, CD_CKPT_OLDESTXID_DB);
}
if (commit_ts_xids_given)
{
- printf(_("oldestCommitTsXid: %u\n"),
- ControlFile.checkPointCopy.oldestCommitTsXid);
- printf(_("newestCommitTsXid: %u\n"),
- ControlFile.checkPointCopy.newestCommitTsXid);
+ simple_oid_list_append(&toprint, CD_CKPT_OLDEST_COMMITTS_XID);
+ simple_oid_list_append(&toprint, CD_CKPT_NEWEST_COMMITTS_XID);
}
if (wal_segsize_given)
- {
- printf(_("Bytes per WAL segment: %u\n"),
- ControlFile.xlog_seg_size);
+ simple_oid_list_append(&toprint, CD_WAL_SEGSIZE);
+
+#define CONTROLDATA_LINE(symbol, description, fmt, ...) \
+ if (simple_oid_list_member(&toprint, symbol)) \
+ { \
+ thislen = internal_wcswidth(_(description), \
+ strlen(_(description)), \
+ encoding); \
+ if (thislen > maxlen) \
+ maxlen = thislen; \
}
+#include "entries.h"
+#undef CONTROLDATA_LINE
+
+
+ XLogFileName(fname, ControlFile.checkPointCopy.ThisTimeLineID,
+ newXlogSegNo, WalSegSz);
+
+ /* We print this one inconditionally */
+ {
+ char *str = "First log segment after reset";
+ thislen = internal_wcswidth(_(str), strlen(_(str)), encoding);
+ if (thislen > maxlen)
+ maxlen = thislen;
+ printf("%s:%*s%s\n", _(str), maxlen - thislen + 2, " ", fname);
+ }
+
+ /* We print the XID epoch in a degenerate case */
+ if (next_xid_epoch_given)
+ {
+ char *str = "NextXID epoch";
+ thislen = internal_wcswidth(_(str), strlen(_(str)), encoding);
+ if (thislen > maxlen)
+ maxlen = thislen;
+ printf("%s:%*s%u\n", _(str), maxlen - thislen + 2, " ",
+ EpochFromFullTransactionId(ControlFile.checkPointCopy.nextXid));
+
+ }
+
+#define CONTROLDATA_LINE(symbol, description, fmt, ...) \
+ if (simple_oid_list_member(&toprint, symbol)) \
+ { \
+ int thisstrlen; \
+ \
+ thisstrlen = strlen(_(description)); \
+ thislen = internal_wcswidth(_(description), \
+ thisstrlen, \
+ encoding); \
+ printf("%s:%*s" fmt "\n", \
+ _(description), \
+ maxlen - thislen + 2, \
+ " ", \
+ __VA_ARGS__); \
+ }
+#include "entries.h"
+#undef CONTROLDATA_LINE
}
--
2.47.3
--m4rixdodkhrlzpzv--
view thread (2+ messages)
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [PATCH 2/2] Apply the same technique to PrintNewControlValues too
In-Reply-To: <no-message-id-77524@localhost>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox