diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 2ebabed51ebed4957047c826cfc8c8873479704a..7163391a4f0da2de1e90a5925a9bd803598efd00 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -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); diff --git a/src/bin/psql/psql.c b/src/bin/psql/psql.c index f7abbd5d00719517b1b805731368571698dc395d..7762e8a1cb8d12970221b2cd5a9ca5e3a2852cd9 100644 --- a/src/bin/psql/psql.c +++ b/src/bin/psql/psql.c @@ -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);