aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1997-05-21 03:12:23 +0000
committerBruce Momjian <bruce@momjian.us>1997-05-21 03:12:23 +0000
commitfce2c41b6cbf0a1aa6a9bfc3e3f59855ef968a52 (patch)
tree6e2d3eda0b51dd927a84f445e7dcee9dc4a2d574 /src
parentcb8396d9fc6c64c9e90adbbc4548a6e6a5df4a3d (diff)
downloadpostgresql-fce2c41b6cbf0a1aa6a9bfc3e3f59855ef968a52.tar.gz
postgresql-fce2c41b6cbf0a1aa6a9bfc3e3f59855ef968a52.zip
Updated pg_dumpall and psql to preserve database owners.
Diffstat (limited to 'src')
-rw-r--r--src/bin/pg_dump/pg_dumpall39
-rw-r--r--src/bin/psql/psql.c55
-rw-r--r--src/man/psql.14
3 files changed, 74 insertions, 24 deletions
diff --git a/src/bin/pg_dump/pg_dumpall b/src/bin/pg_dump/pg_dumpall
index dc1d0d6d2d7..8c85da98e9e 100644
--- a/src/bin/pg_dump/pg_dumpall
+++ b/src/bin/pg_dump/pg_dumpall
@@ -12,25 +12,27 @@ then
else
BS='\\' # System V
fi
-psql -l -A -q -t| tr '|' ' ' | grep -v '^template1 ' | \
-while read DATABASE USERID USER
-do
- echo "${BS}connect template1"
- echo "create database $DATABASE;"
- echo "${BS}connect $DATABASE"
- pg_dump "$@" $DATABASE
-done
-echo "${BS}connect template1"
-echo "copy pg_user from stdin;"
#
# Dump everyone but the postgres user
# initdb creates him
#
+# get the postgres user id
+#
POSTGRES_SUPER_USER_ID="`psql -A -q -t template1 <<END
-select datdba
+select datdba
from pg_database
where datname = 'template1';
END`"
+echo "${BS}connect template1"
+#
+# delete all users in case they run this twice
+#
+echo "delete from pg_user"
+echo "where usesysid <> $POSTGRES_SUPER_USER_ID;"
+#
+# load all the non-postgres users
+#
+echo "copy pg_user from stdin;"
psql -q template1 <<END
select pg_user.* into table tmp_pg_user
from pg_user
@@ -39,3 +41,18 @@ copy tmp_pg_user to stdout;
drop table tmp_pg_user;
END
echo "${BS}."
+psql -l -A -q -t| tr '|' ' ' | grep -v '^template1 ' | \
+while read DATABASE PGUSERID DATAPATH
+do
+ POSTGRES_USER="`psql -A -q -t template1 <<END
+select usename
+from pg_user
+where usesysid = $PGUSERID;
+END`"
+
+ echo "${BS}connect template1 $POSTGRES_USER"
+ echo "create database $DATABASE;"
+ echo "${BS}connect $DATABASE $POSTGRES_USER"
+ pg_dump "$@" $DATABASE
+done
+# done
diff --git a/src/bin/psql/psql.c b/src/bin/psql/psql.c
index bd4d26dfbaa..4ff3d59cbdf 100644
--- a/src/bin/psql/psql.c
+++ b/src/bin/psql/psql.c
@@ -7,11 +7,12 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.59 1997/04/10 11:54:29 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.60 1997/05/21 03:12:02 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
@@ -155,7 +156,7 @@ slashUsage(PsqlSettings * ps)
fprintf(stderr, " \\? -- help\n");
fprintf(stderr, " \\a -- toggle field-alignment (currenty %s)\n", on(ps->opt.align));
fprintf(stderr, " \\C [<captn>] -- set html3 caption (currently '%s')\n", ps->opt.caption ? ps->opt.caption : "");
- fprintf(stderr, " \\connect <dbname> -- connect to new database (currently '%s')\n", PQdb(ps->db));
+ fprintf(stderr, " \\connect <dbname> <user> -- connect to new database (currently '%s')\n", PQdb(ps->db));
fprintf(stderr, " \\copy table {from | to} <fname>\n");
fprintf(stderr, " \\d [<table>] -- list tables in database or columns in <table>, * for all\n");
fprintf(stderr, " \\e [<fname>] -- edit the current query buffer or <fname>, \\E execute too\n");
@@ -825,19 +826,36 @@ do_copy(const char *args, PsqlSettings * settings)
static void
-do_connect(const char *new_dbname, PsqlSettings * settings)
+do_connect(const char *new_dbname,
+ const char *new_user,
+ PsqlSettings * settings)
{
char *dbname = PQdb(settings->db);
if (!new_dbname)
fprintf(stderr, "\\connect must be followed by a database name\n");
else {
- PGconn *olddb = settings->db;
+ PGconn *olddb = settings->db;
+ char *userenv;
printf("closing connection to database: %s\n", dbname);
+ if (new_user != NULL) {
+ /*
+ PQsetdb() does not allow us to specify the user,
+ so we have to do it via PGUSER
+ */
+ userenv = malloc(strlen("PGUSER=") + strlen(new_user) + 1);
+ sprintf(userenv,"PGUSER=%s",new_user);
+ putenv(userenv);
+ free(userenv);
+ }
settings->db = PQsetdb(PQhost(olddb), PQport(olddb),
NULL, NULL, new_dbname);
- printf("connecting to new database: %s\n", new_dbname);
+ if (!new_user)
+ printf("connecting to new database: %s\n", new_dbname);
+ else
+ printf("connecting to new database: %s as user: %s\n",
+ new_dbname,new_user);
if (PQstatus(settings->db) == CONNECTION_BAD) {
fprintf(stderr, "%s\n", PQerrorMessage(settings->db));
printf("reconnecting to %s\n", dbname);
@@ -1037,12 +1055,19 @@ HandleSlashCmds(PsqlSettings * settings,
* assuming it's not a one-character command. If it's a one-character
* command, this is meaningless.
*/
+ char *optarg3;
+ /*
+ * Pointer inside the second <cmd> string to the argument of the slash command
+ * assuming it's not a one-character command. If it's a one-character
+ * command, this is meaningless.
+ */
char *cmd;
/*
* String: value of the slash command, less the slash and with escape
* sequences decoded.
*/
int blank_loc;
+ int blank_loc2;
/* Offset within <cmd> of first blank */
cmd = malloc(strlen(line)); /* unescaping better not make string grow. */
@@ -1064,12 +1089,20 @@ HandleSlashCmds(PsqlSettings * settings,
optarg = NULL;
blank_loc = strcspn(cmd, " \t");
- if (blank_loc == 0)
+ if (blank_loc == 0) {
optarg2 = NULL;
- else
+ optarg3 = NULL;
+ } else {
optarg2 = cmd + blank_loc + strspn(cmd + blank_loc, " \t");
-
-
+ blank_loc2 = strcspn(optarg2, " \t");
+ if (blank_loc2 == 0 || *(optarg2 + blank_loc2) == '\0')
+ optarg3 = NULL;
+ else {
+ optarg3 = optarg2 + blank_loc2 + strspn(optarg2 + blank_loc2, " \t");
+ *(optarg2 + blank_loc2) = '\0';
+ }
+ }
+
switch (cmd[0]) {
case 'a': /* toggles to align fields on output */
toggle(settings, &settings->opt.align, "field alignment");
@@ -1092,9 +1125,9 @@ HandleSlashCmds(PsqlSettings * settings,
if (strncmp(cmd, "copy ", strlen("copy ")) == 0)
do_copy(optarg2, settings);
else if (strncmp(cmd, "connect ", strlen("connect ")) == 0)
- do_connect(optarg2, settings);
+ do_connect(optarg2, optarg3, settings);
else
- do_connect(optarg, settings);
+ do_connect(optarg, optarg2, settings);
}
break;
case 'd': /* \d describe tables or columns in a table */
diff --git a/src/man/psql.1 b/src/man/psql.1
index 2f66c824b02..f8c43f4d115 100644
--- a/src/man/psql.1
+++ b/src/man/psql.1
@@ -1,6 +1,6 @@
.\" This is -*-nroff-*-
.\" XXX standard disclaimer belongs here....
-.\" $Header: /cvsroot/pgsql/src/man/Attic/psql.1,v 1.7 1997/04/10 11:58:59 scrappy Exp $
+.\" $Header: /cvsroot/pgsql/src/man/Attic/psql.1,v 1.8 1997/05/21 03:12:23 momjian Exp $
.TH PSQL UNIX 1/20/96 PostgreSQL PostgreSQL
.SH NAME
psql \(em run the interactive query front-end
@@ -258,7 +258,7 @@ You should anyway.
Toggle field alignment when printing out table elements.
.IP "\eC \fIcaption\fR"
Set the HTML3.0 table caption.
-.IP "\econnect \fIdbname\fR"
+.IP "\econnect \fIdbname\fR \fIusername\fR"
Establish a connection to a new database. The previous connection is closed.
.IP "\ecopy \fItable\fR {FROM | TO} \fIfilename\fR"
Perform a frontend copy. This is an operation that runs a SQL COPY command,