]> granicus.if.org Git - postgresql/commitdiff
Allow pg_dump to preserve owners of all objects.
authorBruce Momjian <bruce@momjian.us>
Fri, 20 Jun 1997 02:20:26 +0000 (02:20 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 20 Jun 1997 02:20:26 +0000 (02:20 +0000)
src/bin/pg_dump/pg_dump.c
src/bin/psql/psql.c

index 2ebabed51ebed4957047c826cfc8c8873479704a..7163391a4f0da2de1e90a5925a9bd803598efd00 100644 (file)
@@ -21,7 +21,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.32 1997/06/07 05:29:22 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.33 1997/06/20 02:20:17 momjian Exp $
  *
  * Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
  *
@@ -263,7 +263,7 @@ dumpClasses_dumpData(FILE *fout, const char *classname,
     int tuple;
     int field;
 
-    sprintf(query, "select * from %s;\n", classname);
+    sprintf(query, "select * from %s", classname);
     res = PQexec(g_conn, query);
     if (!res ||
         PQresultStatus(res) != PGRES_TUPLES_OK) {
@@ -546,6 +546,7 @@ getTypes(int *numTypes)
     int i_typdefault;
     int i_typrelid;
     int i_typbyval;
+    int i_usename;
 
     res = PQexec(g_conn, "begin");
     if (!res || 
@@ -561,9 +562,10 @@ getTypes(int *numTypes)
    /* we filter out the built-in types when 
       we dump out the types */
 
-    sprintf(query, "SELECT oid, typowner,typname, typlen, typprtlen, "
+    sprintf(query, "SELECT pg_type.oid, typowner,typname, typlen, typprtlen, "
             "typinput, typoutput, typreceive, typsend, typelem, typdelim, "
-            "typdefault, typrelid,typbyval from pg_type");
+            "typdefault, typrelid,typbyval, usename from pg_type, pg_user "
+           "where typowner = usesysid");
     
     res = PQexec(g_conn,query);
     if (!res || 
@@ -590,6 +592,7 @@ getTypes(int *numTypes)
     i_typdefault = PQfnumber(res,"typdefault");
     i_typrelid = PQfnumber(res,"typrelid");
     i_typbyval = PQfnumber(res,"typbyval");
+    i_usename = PQfnumber(res,"usename");
 
     for (i=0;i<ntups;i++) {
         tinfo[i].oid = strdup(PQgetvalue(res,i,i_oid));
@@ -605,6 +608,7 @@ getTypes(int *numTypes)
         tinfo[i].typdelim = strdup(PQgetvalue(res,i,i_typdelim));
         tinfo[i].typdefault = strdup(PQgetvalue(res,i,i_typdefault));
         tinfo[i].typrelid = strdup(PQgetvalue(res,i,i_typrelid));
+        tinfo[i].usename = strdup(PQgetvalue(res,i,i_usename));
 
         if (strcmp(PQgetvalue(res,i,i_typbyval), "f") == 0)
             tinfo[i].passedbyvalue = 0;
@@ -662,6 +666,7 @@ getOperators(int *numOprs)
     int i_oprcanhash;
     int i_oprlsortop;
     int i_oprrsortop;
+    int i_usename;
     
     /* find all operators, including builtin operators,
        filter out system-defined operators at dump-out time */
@@ -673,9 +678,11 @@ getOperators(int *numOprs)
     }
     PQclear(res);
 
-    sprintf(query, "SELECT oid, oprname, oprkind, oprcode, oprleft, "
-            "oprright, oprcom, oprnegate, oprrest, oprjoin, oprcanhash, "
-            "oprlsortop, oprrsortop from pg_operator");
+    sprintf(query, "SELECT pg_operator.oid, oprname, oprkind, oprcode, "
+           "oprleft, oprright, oprcom, oprnegate, oprrest, oprjoin, "
+           "oprcanhash, oprlsortop, oprrsortop, usename "
+           "from pg_operator, pg_user "
+           "where oprowner = usesysid");
 
     res = PQexec(g_conn, query);
     if (!res || 
@@ -702,6 +709,7 @@ getOperators(int *numOprs)
     i_oprcanhash = PQfnumber(res,"oprcanhash");
     i_oprlsortop = PQfnumber(res,"oprlsortop");
     i_oprrsortop = PQfnumber(res,"oprrsortop");
+    i_usename = PQfnumber(res,"usename");
 
     for (i=0;i<ntups;i++) {
         oprinfo[i].oid = strdup(PQgetvalue(res,i,i_oid));
@@ -717,6 +725,7 @@ getOperators(int *numOprs)
         oprinfo[i].oprcanhash = strdup(PQgetvalue(res,i,i_oprcanhash));
         oprinfo[i].oprlsortop = strdup(PQgetvalue(res,i,i_oprlsortop));
         oprinfo[i].oprrsortop = strdup(PQgetvalue(res,i,i_oprrsortop));
+        oprinfo[i].usename = strdup(PQgetvalue(res,i,i_usename));
     }
 
     PQclear(res);
@@ -744,6 +753,7 @@ for(i=0;i<numTypes;++i) {
     if(tp[i].typdelim) free(tp[i].typdelim);
     if(tp[i].typdefault) free(tp[i].typdefault);
     if(tp[i].typrelid) free(tp[i].typrelid);
+    if(tp[i].usename) free(tp[i].usename);
        }
 free(tp);
 }
@@ -756,7 +766,7 @@ if(!fun) return;
 for(i=0;i<numFuncs;++i) {
     if(fun[i].oid) free(fun[i].oid);
     if(fun[i].proname) free(fun[i].proname);
-    if(fun[i].proowner) free(fun[i].proowner);
+    if(fun[i].usename) free(fun[i].usename);
     for(a=0;a<8;++a)
     if(fun[i].argtypes[a]) free(fun[i].argtypes[a]);
     if(fun[i].prorettype) free(fun[i].prorettype);
@@ -783,6 +793,7 @@ for(i=0;i<numTables;++i) {
     if(tblinfo[i].inhAttrs) free((int *)tblinfo[i].inhAttrs);
     if(tblinfo[i].attnames) free (tblinfo[i].attnames);
     if(tblinfo[i].typnames) free (tblinfo[i].typnames);
+    if(tblinfo[i].usename) free (tblinfo[i].usename);
      }
 free(tblinfo);
 }
@@ -816,6 +827,7 @@ for(i=0;i<numOprs;++i) {
      if(opr[i].oprcanhash) free(opr[i].oprcanhash);
      if(opr[i].oprlsortop) free(opr[i].oprlsortop);
      if(opr[i].oprrsortop) free(opr[i].oprrsortop);
+     if(opr[i].usename) free(opr[i].usename);
        }
 free(opr);
 }
@@ -854,6 +866,7 @@ for(i=0;i<numArgs;++i) {
     if(agginfo[i].aggtranstype2) free (agginfo[i].aggtranstype2);
     if(agginfo[i].agginitval1) free (agginfo[i].agginitval1);
     if(agginfo[i].agginitval2) free (agginfo[i].agginitval2);
+    if(agginfo[i].usename) free (agginfo[i].usename);
        }
 free (agginfo);
 }
@@ -886,6 +899,7 @@ getAggregates(int *numAggs)
     int i_aggtranstype2;
     int i_agginitval1;
     int i_agginitval2;
+    int i_usename;
 
     /* find all user-defined aggregates */
 
@@ -898,9 +912,10 @@ getAggregates(int *numAggs)
     PQclear(res);
 
     sprintf(query, 
-            "SELECT oid, aggname, aggtransfn1, aggtransfn2, aggfinalfn, "
-            "aggtranstype1, aggbasetype, aggtranstype2, agginitval1, "
-            "agginitval2 from pg_aggregate;");
+            "SELECT pg_aggregate.oid, aggname, aggtransfn1, aggtransfn2, "
+           "aggfinalfn, aggtranstype1, aggbasetype, aggtranstype2, "
+           "agginitval1, agginitval2, usename from pg_aggregate, pg_user "
+           "where aggowner = usesysid");
 
     res = PQexec(g_conn, query);
     if (!res || 
@@ -924,6 +939,7 @@ getAggregates(int *numAggs)
     i_aggtranstype2 = PQfnumber(res,"aggtranstype2");
     i_agginitval1 = PQfnumber(res,"agginitval1");
     i_agginitval2 = PQfnumber(res,"agginitval2");
+    i_usename = PQfnumber(res,"usename");
 
     for (i=0;i<ntups;i++) {
         agginfo[i].oid = strdup(PQgetvalue(res,i,i_oid));
@@ -936,6 +952,7 @@ getAggregates(int *numAggs)
         agginfo[i].aggtranstype2 = strdup(PQgetvalue(res,i,i_aggtranstype2));
         agginfo[i].agginitval1 = strdup(PQgetvalue(res,i,i_agginitval1));
         agginfo[i].agginitval2 = strdup(PQgetvalue(res,i,i_agginitval2));
+        agginfo[i].usename = strdup(PQgetvalue(res,i,i_usename));
     }
 
     PQclear(res);
@@ -965,7 +982,6 @@ getFuncs(int *numFuncs)
 
     int i_oid;
     int i_proname;
-    int i_proowner;
     int i_prolang;
     int i_pronargs;
     int i_proargtypes;
@@ -973,6 +989,7 @@ getFuncs(int *numFuncs)
     int i_proretset;
     int i_prosrc;
     int i_probin;
+    int i_usename;
 
    /* find all user-defined funcs */
 
@@ -985,9 +1002,10 @@ getFuncs(int *numFuncs)
     PQclear(res);
 
     sprintf(query, 
-            "SELECT oid, proname, proowner, prolang, pronargs, prorettype, "
-            "proretset, proargtypes, prosrc, probin from pg_proc "
-            "where oid > '%d'::oid", 
+            "SELECT pg_proc.oid, proname, prolang, pronargs, prorettype, "
+            "proretset, proargtypes, prosrc, probin, usename "
+           "from pg_proc, pg_user "
+            "where pg_proc.oid > '%d'::oid and proowner = usesysid", 
             g_last_builtin_oid);
 
     res = PQexec(g_conn, query);
@@ -1005,7 +1023,6 @@ getFuncs(int *numFuncs)
 
     i_oid = PQfnumber(res,"oid");
     i_proname = PQfnumber(res,"proname");
-    i_proowner = PQfnumber(res,"proowner");
     i_prolang = PQfnumber(res,"prolang");
     i_pronargs = PQfnumber(res,"pronargs");
     i_proargtypes = PQfnumber(res,"proargtypes");
@@ -1013,11 +1030,11 @@ getFuncs(int *numFuncs)
     i_proretset = PQfnumber(res,"proretset");
     i_prosrc = PQfnumber(res,"prosrc");
     i_probin = PQfnumber(res,"probin");
+    i_usename = PQfnumber(res,"usename");
     
     for (i=0;i<ntups;i++) {
         finfo[i].oid = strdup(PQgetvalue(res,i,i_oid));
         finfo[i].proname = strdup(PQgetvalue(res,i,i_proname));
-        finfo[i].proowner = strdup(PQgetvalue(res,i,i_proowner));
 
         finfo[i].prosrc = checkForQuote(PQgetvalue(res,i,i_prosrc));
         finfo[i].probin = strdup(PQgetvalue(res,i,i_probin));
@@ -1027,6 +1044,8 @@ getFuncs(int *numFuncs)
         finfo[i].nargs = atoi(PQgetvalue(res,i,i_pronargs));
         finfo[i].lang = (atoi(PQgetvalue(res,i,i_prolang)) == C_PROLANG_OID);
 
+        finfo[i].usename = strdup(PQgetvalue(res,i,i_usename));
+
         parseArgTypes(finfo[i].argtypes, PQgetvalue(res,i,i_proargtypes));
 
         finfo[i].dumped = 0;
@@ -1063,6 +1082,7 @@ getTables(int *numTables)
     int i_relarch;
     int i_relkind;
     int i_relacl;
+    int i_usename;
 
     /* find all the user-defined tables (no indices and no catalogs),
      ordering by oid is important so that we always process the parent
@@ -1079,9 +1099,11 @@ getTables(int *numTables)
     PQclear(res);
 
     sprintf(query, 
-            "SELECT oid, relname, relarch, relkind, relacl from pg_class "
-            "where (relkind = 'r' or relkind = 'S') and relname !~ '^pg_' "
-            "and relname !~ '^xin[xv][0-9]+' order by oid;");
+            "SELECT pg_class.oid, relname, relarch, relkind, relacl, usename "
+           "from pg_class, pg_user "
+            "where relowner = usesysid and "
+           "(relkind = 'r' or relkind = 'S') and relname !~ '^pg_' "
+            "and relname !~ '^xin[xv][0-9]+' order by oid");
 
     res = PQexec(g_conn, query);
     if (!res || 
@@ -1101,6 +1123,7 @@ getTables(int *numTables)
     i_relarch = PQfnumber(res,"relarch");
     i_relkind = PQfnumber(res,"relkind");
     i_relacl = PQfnumber(res,"relacl");
+    i_usename = PQfnumber(res,"usename");
 
     for (i=0;i<ntups;i++) {
         tblinfo[i].oid = strdup(PQgetvalue(res,i,i_oid));
@@ -1108,6 +1131,7 @@ getTables(int *numTables)
         tblinfo[i].relarch = strdup(PQgetvalue(res,i,i_relarch));
         tblinfo[i].relacl = strdup(PQgetvalue(res,i,i_relacl));
         tblinfo[i].sequence = (strcmp (PQgetvalue(res,i,i_relkind), "S") == 0);
+        tblinfo[i].usename = strdup(PQgetvalue(res,i,i_usename));
     }
 
     PQclear(res);
@@ -1305,7 +1329,7 @@ getIndices(int *numIndices)
             "from pg_index i, pg_class t1, pg_class t2, pg_am a "
             "where t1.oid = i.indexrelid and t2.oid = i.indrelid "
             "and t1.relam = a.oid and i.indexrelid > '%d'::oid "
-            "and t2.relname !~ '^pg_' and t1.relname !~ '^Xinx' ;",
+            "and t2.relname !~ '^pg_' and t1.relname !~ '^Xinx'",
             g_last_builtin_oid);
 
     res = PQexec(g_conn, query);
@@ -1384,6 +1408,8 @@ dumpTypes(FILE* fout, FuncInfo* finfo, int numFuncs,
         if (funcInd !=  -1) 
             dumpOneFunc(fout,finfo,funcInd,tinfo,numTypes);
 
+       fprintf(fout,"\\connect - %s\n",tinfo[i].usename);
+
         sprintf(q,
                 "CREATE TYPE %s "
                 "( internallength = %s, externallength = %s, input = %s, "
@@ -1448,6 +1474,8 @@ dumpOneFunc(FILE* fout, FuncInfo* finfo, int i,
     else
         finfo[i].dumped = 1;
 
+    fprintf(fout,"\\connect - %s\n",finfo[i].usename);
+        
     sprintf(q,"CREATE FUNCTION %s (",finfo[i].proname);
     for (j=0;j<finfo[i].nargs;j++) {
         char* typname;
@@ -1547,6 +1575,8 @@ dumpOprs(FILE* fout, OprInfo* oprinfo, int numOperators,
                                      oprinfo[i].oprlsortop));
         }
 
+       fprintf(fout,"\\connect - %s\n", oprinfo[i].usename);
+
         sprintf(q,
                 "CREATE OPERATOR %s "
                 "(PROCEDURE = %s %s %s %s %s %s %s %s %s);\n ",
@@ -1627,6 +1657,8 @@ dumpAggs(FILE* fout, AggInfo* agginfo, int numAggs,
         } else
             comma2[0] = '\0';
 
+       fprintf(fout,"\\connect - %s\n", agginfo[i].usename);
+
         sprintf(q,"CREATE AGGREGATE %s ( %s %s %s %s %s );\n",
                 agginfo[i].aggname,
                 sfunc1,
@@ -1677,6 +1709,8 @@ void dumpTables(FILE* fout, TableInfo *tblinfo, int numTables,
             parentRels = tblinfo[i].parentRels;
             numParents = tblinfo[i].numParents;
 
+           fprintf(fout, "\\connect - %s\n", tblinfo[i].usename);
+
             sprintf(q, "CREATE TABLE %s (", tblinfo[i].relname);
             actual_atts = 0;
             for (j=0;j<tblinfo[i].numatts;j++) {
@@ -2006,7 +2040,7 @@ findLastBuiltinOid(void)
     int last_oid;
 
     res = PQexec(g_conn, 
-                 "SELECT oid from pg_database where datname = 'template1';");
+                 "SELECT oid from pg_database where datname = 'template1'");
     if (res == NULL ||
         PQresultStatus(res) != PGRES_TUPLES_OK) {
         fprintf(stderr,"pg_dump error in finding the template1 database\n");
@@ -2066,7 +2100,7 @@ static void dumpSequence (FILE* fout, TableInfo tbinfo)
 
     sprintf (query, 
             "SELECT sequence_name, last_value, increment_by, max_value, "
-            "min_value, cache_value, is_cycled, is_called from %s;",
+            "min_value, cache_value, is_cycled, is_called from %s",
             tbinfo.relname);
 
     res = PQexec (g_conn, query);
index f7abbd5d00719517b1b805731368571698dc395d..7762e8a1cb8d12970221b2cd5a9ca5e3a2852cd9 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.73 1997/06/11 01:03:38 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.74 1997/06/20 02:20:26 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -153,10 +153,12 @@ on(bool f)
 static void
 slashUsage(PsqlSettings * ps)
 {
+    int ch;
+    
     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> <user> -- 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 and indicies in database or columns in <table>, * for all\n");
     fprintf(stderr, " \\di          -- list only indicies in database\n");
@@ -172,6 +174,11 @@ slashUsage(PsqlSettings * ps)
     fprintf(stderr, " \\m           -- toggle monitor-like table display (currently %s)\n", on(ps->opt.standard));
     fprintf(stderr, " \\o [<fname>] [|<cmd>] -- send all query results to stdout, <fname>, or pipe\n");
     fprintf(stderr, " \\p           -- print the current query buffer\n");
+
+    fprintf(stderr, "Press ENTER to continue");
+    /* eat up any extra characters typed before ENTER */
+    while ((ch = fgetc(stdin)) != '\r' && ch != '\n')
+       ;
     fprintf(stderr, " \\q           -- quit\n");
     fprintf(stderr, " \\r           -- reset(clear) the query buffer\n");
     fprintf(stderr, " \\s [<fname>] -- print history or save it in <fname>\n");
@@ -858,18 +865,16 @@ do_copy(const char *args, PsqlSettings * settings)
 static void
 do_connect(const char *new_dbname,
                const char *new_user,
-               PsqlSettings * settings)
+               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;
        static char     *userenv = NULL;
        char            *old_userenv = NULL;
+       const char      *dbparam;
 
-       printf("closing connection to database: %s\n", dbname);
        if (new_user != NULL) {
                /*
                   PQsetdb() does not allow us to specify the user,
@@ -885,23 +890,27 @@ do_connect(const char *new_dbname,
            if (old_userenv != NULL)
                free(old_userenv);
        }
+
+       if (strcmp(new_dbname,"-") != 0)
+               dbparam = new_dbname;
+       else    dbparam = PQdb(olddb);
+
        settings->db = PQsetdb(PQhost(olddb), PQport(olddb),
-                              NULL, NULL, 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);
+                              NULL, NULL, dbparam);
+       if (!settings->quiet) {
+           if (!new_user)
+               printf("connecting to new database: %s\n", dbparam);
+           else if (dbparam != new_dbname)
+               printf("connecting as new user: %s\n", new_user);
+           else
+               printf("connecting to new database: %s as user: %s\n",
+                                               dbparam,new_user);
+       }
+
        if (PQstatus(settings->db) == CONNECTION_BAD) {
            fprintf(stderr, "%s\n", PQerrorMessage(settings->db));
-           printf("reconnecting to %s\n", dbname);
-           settings->db = PQsetdb(PQhost(olddb), PQport(olddb),
-                                  NULL, NULL, dbname);
-           if (PQstatus(settings->db) == CONNECTION_BAD) {
-               fprintf(stderr,
-                       "could not reconnect to %s. exiting\n", dbname);
-               exit(2);
-           }
+           fprintf(stderr,"Could not connect to new database. exiting\n");
+           exit(2);
        } else {
            PQfinish(olddb);
            free(settings->prompt);