From 42097594aa45ed1012e710adcc895b84c4b13407 Mon Sep 17 00:00:00 2001 From: Shigeru Hanada Date: Mon, 4 Apr 2011 19:32:02 +0900 Subject: [PATCH 4/5] Fix pg_dump to dump COMMENT ON USER MAPPING statements. --- src/bin/pg_dump/pg_dump.c | 28 +++++++++++++++++++++++----- 1 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 90cb9ab..925c4c0 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -11197,16 +11197,21 @@ dumpUserMappings(Archive *fout, PQExpBuffer delq; PQExpBuffer query; PQExpBuffer tag; + PQExpBuffer label; PGresult *res; int ntups; + int i_tableoid; + int i_umid; int i_usename; int i_umoptions; int i; + CatalogId catId; q = createPQExpBuffer(); tag = createPQExpBuffer(); delq = createPQExpBuffer(); query = createPQExpBuffer(); + label = createPQExpBuffer(); /* * We read from the publicly accessible view pg_user_mappings, so as not @@ -11218,8 +11223,11 @@ dumpUserMappings(Archive *fout, */ selectSourceSchema("pg_catalog"); + resetPQExpBuffer(query); appendPQExpBuffer(query, - "SELECT usename, " + "SELECT 'pg_catalog.pg_user_mapping'::pg_catalog.regclass::oid AS tableoid, " + "umid, " + "usename, " "array_to_string(ARRAY(SELECT option_name || ' ' || quote_literal(option_value) FROM pg_options_to_table(umoptions)), ', ') AS umoptions\n" "FROM pg_user_mappings " "WHERE srvid = %u", @@ -11229,6 +11237,8 @@ dumpUserMappings(Archive *fout, check_sql_result(res, g_conn, query->data, PGRES_TUPLES_OK); ntups = PQntuples(res); + i_tableoid = PQfnumber(res, "tableoid"); + i_umid = PQfnumber(res, "umid"); i_usename = PQfnumber(res, "usename"); i_umoptions = PQfnumber(res, "umoptions"); @@ -11237,12 +11247,17 @@ dumpUserMappings(Archive *fout, char *usename; char *umoptions; + catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid)); + catId.oid = atooid(PQgetvalue(res, i, i_umid)); usename = PQgetvalue(res, i, i_usename); umoptions = PQgetvalue(res, i, i_umoptions); + resetPQExpBuffer(label); + appendPQExpBuffer(label, "USER MAPPING FOR %s", fmtId(usename)); + appendPQExpBuffer(label, " SERVER %s", fmtId(servername)); + resetPQExpBuffer(q); - appendPQExpBuffer(q, "CREATE USER MAPPING FOR %s", fmtId(usename)); - appendPQExpBuffer(q, " SERVER %s", fmtId(servername)); + appendPQExpBuffer(q, "CREATE %s", label->data); if (umoptions && strlen(umoptions) > 0) appendPQExpBuffer(q, " OPTIONS (%s)", umoptions); @@ -11250,8 +11265,7 @@ dumpUserMappings(Archive *fout, appendPQExpBuffer(q, ";\n"); resetPQExpBuffer(delq); - appendPQExpBuffer(delq, "DROP USER MAPPING FOR %s", fmtId(usename)); - appendPQExpBuffer(delq, " SERVER %s;\n", fmtId(servername)); + appendPQExpBuffer(delq, "DROP %s", label->data); resetPQExpBuffer(tag); appendPQExpBuffer(tag, "USER MAPPING %s SERVER %s", @@ -11266,10 +11280,14 @@ dumpUserMappings(Archive *fout, q->data, delq->data, NULL, &dumpId, 1, NULL, NULL); + + /* Dump User Mapping Comments */ + dumpComment(fout, label->data, NULL, owner, catId, 0, dumpId); } PQclear(res); + destroyPQExpBuffer(label); destroyPQExpBuffer(query); destroyPQExpBuffer(delq); destroyPQExpBuffer(q); -- 1.7.3