Updated pg_dumpall and psql to preserve database owners.
authorBruce Momjian
Wed, 21 May 1997 03:12:23 +0000 (03:12 +0000)
committerBruce Momjian
Wed, 21 May 1997 03:12:23 +0000 (03:12 +0000)
src/bin/pg_dump/pg_dumpall
src/bin/psql/psql.c
src/man/psql.1

index dc1d0d6d2d7a3f051e41e2a3095f957ba4f9da6d..8c85da98e9e4b84f50f1c3bc5a4ccd81aeafc248 100644 (file)
@@ -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 <
-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 <
 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 <
+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
index bd4d26dfbaa7fb1adeeb44130ce4267ca1d5b497..4ff3d59cbdf1ea0b906d9d70ff53783b942ba327 100644 (file)
@@ -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 
+#include 
 #include 
 #include 
 #include 
@@ -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 [] -- set html3 caption (currently '%s')\n", ps->opt.caption ? ps->opt.caption : "");
-    fprintf(stderr, " \\connect   -- connect to new database (currently '%s')\n", PQdb(ps->db));
+    fprintf(stderr, " \\connect   -- connect to new database (currently '%s')\n", PQdb(ps->db));
     fprintf(stderr, " \\copy table {from | to} \n");
     fprintf(stderr, " \\d [] -- list tables in database or columns in 
, * for all\n");
     fprintf(stderr, " \\e [] -- edit the current query buffer or , \\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  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  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 */
index 2f66c824b027890df4c99fcbc209d5c6eec16423..f8c43f4d1155883deb5ab90e08b372a453ef3844 100644 (file)
@@ -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,