From b66c5b341fff463c03312f0317e2b828e9a2d8dd Mon Sep 17 00:00:00 2001 From: jian he Date: Thu, 23 Jan 2025 15:11:55 +0800 Subject: [PATCH v11 1/4] move expand_dbname_patterns to common_dumpall_restore.c --- src/bin/pg_dump/common_dumpall_restore.c | 54 ++++++++++++++++++++++++ src/bin/pg_dump/common_dumpall_restore.h | 3 ++ src/bin/pg_dump/pg_dump.c | 2 +- src/bin/pg_dump/pg_dumpall.c | 54 ------------------------ 4 files changed, 58 insertions(+), 55 deletions(-) diff --git a/src/bin/pg_dump/common_dumpall_restore.c b/src/bin/pg_dump/common_dumpall_restore.c index ace5077085..4503a98f25 100644 --- a/src/bin/pg_dump/common_dumpall_restore.c +++ b/src/bin/pg_dump/common_dumpall_restore.c @@ -312,3 +312,57 @@ parseDumpFormat(const char *format) return archDumpFormat; } + +/* + * Find a list of database names that match the given patterns. + * See also expand_table_name_patterns() in pg_dump.c + */ +void +expand_dbname_patterns(PGconn *conn, + SimpleStringList *patterns, + SimpleStringList *names) +{ + PQExpBuffer query; + PGresult *res; + + if (patterns->head == NULL) + return; /* nothing to do */ + + query = createPQExpBuffer(); + + /* + * The loop below runs multiple SELECTs, which might sometimes result in + * duplicate entries in the name list, but we don't care, since all we're + * going to do is test membership of the list. + */ + + for (SimpleStringListCell *cell = patterns->head; cell; cell = cell->next) + { + int dotcnt; + + appendPQExpBufferStr(query, + "SELECT datname FROM pg_catalog.pg_database n\n"); + processSQLNamePattern(conn, query, cell->val, false, + false, NULL, "datname", NULL, NULL, NULL, + &dotcnt); + + if (dotcnt > 0) + { + pg_log_error("improper qualified name (too many dotted names): %s", + cell->val); + PQfinish(conn); + exit_nicely(1); + } + + res = executeQuery(conn, query->data); + for (int i = 0; i < PQntuples(res); i++) + { + simple_string_list_append(names, PQgetvalue(res, i, 0)); + } + + PQclear(res); + resetPQExpBuffer(query); + } + + destroyPQExpBuffer(query); +} diff --git a/src/bin/pg_dump/common_dumpall_restore.h b/src/bin/pg_dump/common_dumpall_restore.h index a27c3e9fb8..2476449fa7 100644 --- a/src/bin/pg_dump/common_dumpall_restore.h +++ b/src/bin/pg_dump/common_dumpall_restore.h @@ -23,4 +23,7 @@ extern PGconn *connectDatabase(const char *dbname, const char *progname, const char **connstr, int *server_version); extern PGresult *executeQuery(PGconn *conn, const char *query); extern ArchiveFormat parseDumpFormat(const char *format); +extern void expand_dbname_patterns(PGconn *conn, + SimpleStringList *patterns, + SimpleStringList *names); #endif /* COMMON_DUMPALL_RESTORE_H */ diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index eae626f621..72d9cefd81 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -1653,7 +1653,7 @@ expand_foreign_server_name_patterns(Archive *fout, /* * Find the OIDs of all tables matching the given list of patterns, * and append them to the given OID list. See also expand_dbname_patterns() - * in pg_dumpall.c + * in common_dumpall_restore.c */ static void expand_table_name_patterns(Archive *fout, diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 5915b1b051..244bf72986 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -77,8 +77,6 @@ static void buildShSecLabels(PGconn *conn, const char *objtype, const char *objname, PQExpBuffer buffer); static void executeCommand(PGconn *conn, const char *query); -static void expand_dbname_patterns(PGconn *conn, SimpleStringList *patterns, - SimpleStringList *names); static void read_dumpall_filters(const char *filename, SimpleStringList *pattern); static void create_or_open_dir(const char *dirname); @@ -1466,59 +1464,7 @@ dumpUserConfig(PGconn *conn, const char *username) destroyPQExpBuffer(buf); } -/* - * Find a list of database names that match the given patterns. - * See also expand_table_name_patterns() in pg_dump.c - */ -static void -expand_dbname_patterns(PGconn *conn, - SimpleStringList *patterns, - SimpleStringList *names) -{ - PQExpBuffer query; - PGresult *res; - if (patterns->head == NULL) - return; /* nothing to do */ - - query = createPQExpBuffer(); - - /* - * The loop below runs multiple SELECTs, which might sometimes result in - * duplicate entries in the name list, but we don't care, since all we're - * going to do is test membership of the list. - */ - - for (SimpleStringListCell *cell = patterns->head; cell; cell = cell->next) - { - int dotcnt; - - appendPQExpBufferStr(query, - "SELECT datname FROM pg_catalog.pg_database n\n"); - processSQLNamePattern(conn, query, cell->val, false, - false, NULL, "datname", NULL, NULL, NULL, - &dotcnt); - - if (dotcnt > 0) - { - pg_log_error("improper qualified name (too many dotted names): %s", - cell->val); - PQfinish(conn); - exit_nicely(1); - } - - res = executeQuery(conn, query->data); - for (int i = 0; i < PQntuples(res); i++) - { - simple_string_list_append(names, PQgetvalue(res, i, 0)); - } - - PQclear(res); - resetPQExpBuffer(query); - } - - destroyPQExpBuffer(query); -} /* * Dump contents of databases. -- 2.34.1