From: Bryan Henderson Date: Fri, 27 Dec 1996 23:12:57 +0000 (+0000) Subject: Add messages to assist in problem diagnosis. Eliminate lines > 80 characters. X-Git-Tag: REL6_1~829 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=15526ff0ac7bd0591d3ff7f7538c5141583455ca;p=postgresql Add messages to assist in problem diagnosis. Eliminate lines > 80 characters. --- diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 6f961dcb58..e6301bf73c 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -20,7 +20,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.18 1996/11/26 07:38:19 bryanh Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.19 1996/12/27 23:12:54 bryanh Exp $ * * Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb * @@ -46,9 +46,9 @@ #include /* for getopt() */ #include #include -#include /* for MAXHOSTNAMELEN on most */ +#include /* for MAXHOSTNAMELEN on most */ #ifdef sparc_solaris -#include /* for MAXHOSTNAMELEN on some */ +#include /* for MAXHOSTNAMELEN on some */ #endif #include "postgres.h" @@ -64,7 +64,7 @@ extern char *optarg; extern int optind, opterr; /* global decls */ -int g_verbose; /* verbose flag */ +bool g_verbose; /* User wants verbose narration of our activities. */ int g_last_builtin_oid; /* value of the last builtin oid */ FILE *g_fout; /* the script file */ PGconn *g_conn; /* the database connection */ @@ -81,19 +81,33 @@ char g_comment_end[10]; static void usage(const char* progname) { - fprintf(stderr, "%s - version 1.13.dhb.2\n\n",progname); - fprintf(stderr, "usage: %s [options] [dbname]\n",progname); - fprintf(stderr, "\t -f filename \t\t script output filename\n"); - fprintf(stderr, "\t -H hostname \t\t server host name\n"); - fprintf(stderr, "\t -p port \t\t server port number\n"); - fprintf(stderr, "\t -v \t\t verbose\n"); - fprintf(stderr, "\t -d \t\t dump data as proper insert strings\n"); - fprintf(stderr, "\t -D \t\t dump data as inserts with attribute names\n"); - fprintf(stderr, "\t -S \t\t dump out only the schema, no data\n"); - fprintf(stderr, "\t -a \t\t dump out only the data, no schema\n"); - fprintf(stderr, "\t -t table \t\t dump for this table only\n"); - fprintf(stderr, "\t -o \t\t dump object id's (oids)\n"); - fprintf(stderr, "\nIf dbname is not supplied, then the DATABASE environment name is used.\n"); + fprintf(stderr, + "%s - version 1.13.dhb.2\n\n",progname); + fprintf(stderr, + "usage: %s [options] [dbname]\n",progname); + fprintf(stderr, + "\t -f filename \t\t script output filename\n"); + fprintf(stderr, + "\t -H hostname \t\t server host name\n"); + fprintf(stderr, + "\t -p port \t\t server port number\n"); + fprintf(stderr, + "\t -v \t\t verbose\n"); + fprintf(stderr, + "\t -d \t\t dump data as proper insert strings\n"); + fprintf(stderr, + "\t -D \t\t dump data as inserts with attribute names\n"); + fprintf(stderr, + "\t -S \t\t dump out only the schema, no data\n"); + fprintf(stderr, + "\t -a \t\t dump out only the data, no schema\n"); + fprintf(stderr, + "\t -t table \t\t dump for this table only\n"); + fprintf(stderr, + "\t -o \t\t dump object id's (oids)\n"); + fprintf(stderr, + "\nIf dbname is not supplied, then the DATABASE environment " + "variable value is used.\n"); fprintf(stderr, "\n"); exit(1); @@ -107,6 +121,201 @@ exit_nicely(PGconn* conn) } + +#define COPYBUFSIZ 8192 + + +static void +dumpClasses_nodumpData(FILE *fout, const char *classname, const bool oids) { + + PGresult *res; + char query[255]; + int ret; + bool copydone; + char copybuf[COPYBUFSIZ]; + + if (oids) { + fprintf(fout, "COPY %s WITH OIDS FROM stdin;\n", + classname); + sprintf(query, "COPY %s WITH OIDS TO stdout;\n", + classname); + } else { + fprintf(fout, "COPY %s FROM stdin;\n", classname); + sprintf(query, "COPY %s TO stdout;\n", classname); + } + res = PQexec(g_conn, query); + if (!res) { + fprintf(stderr, "SQL query to dump the contents of Table %s " + "did not execute. Explanation from backend: '%s'.\n" + "The query was: '%s'.\n", + classname, PQerrorMessage(g_conn), query); + exit_nicely(g_conn); + } else { + if (PQresultStatus(res) != PGRES_COPY_OUT) { + fprintf(stderr,"SQL query to dump the contents of Table %s " + "executed abnormally.\n" + "PQexec() returned status %d when %d was expected.\n" + "The query was: '%s'.\n", + classname, PQresultStatus(res), PGRES_COPY_OUT, query); + exit_nicely(g_conn); + } else { + copydone = false; + while (!copydone) { + ret = PQgetline(res->conn, copybuf, COPYBUFSIZ); + + if (copybuf[0] == '\\' && + copybuf[1] == '.' && + copybuf[2] == '\0') { + copydone = true; /* don't print this... */ + } else { + fputs(copybuf, fout); + switch (ret) { + case EOF: + copydone = true; + /*FALLTHROUGH*/ + case 0: + fputc('\n', fout); + break; + case 1: + break; + } + } + } + fprintf(fout, "\\.\n"); + } + PQclear(res); + PQendcopy(res->conn); + } +} + + + +static void +dumpClasses_dumpData(FILE *fout, const char *classname, + const TableInfo tblinfo, bool oids) { + + PGresult *res; + char query[255]; + int actual_atts; /* number of attrs in this a table */ + char expandbuf[COPYBUFSIZ]; + char q[MAXQUERYLEN]; + int tuple; + int field; + + sprintf(query, "select * from %s;\n", classname); + res = PQexec(g_conn, query); + if (!res || + PQresultStatus(res) != PGRES_TUPLES_OK) { + fprintf(stderr,"dumpClasses(): command failed\n"); + exit_nicely(g_conn); + } + tuple=0; + while(tuple < PQntuples(res)) { + fprintf(fout, "insert into %s ", classname); + if (attrNames) { + int j; + actual_atts = 0; + sprintf(q, "("); + for (j=0;j 0) ? "," : "", + tblinfo.attnames[j]); + actual_atts++; + } + } + sprintf(q,"%s%s",q, ") "); + fprintf(fout, q); + } + fprintf(fout, "values ("); + field=0; + do { + if (PQgetisnull(res,tuple,field)) { + fprintf(fout,"NULL"); + } else { + switch(PQftype(res,field)) { + case 21: case 22: case 23: /* int types */ + case 810: case 910: /* oldint types */ + case 1005: case 1006: case 1007: /* _int types */ + case 700: case 701: /* float types */ + case 1021: case 1022: /* _float types */ + fprintf(fout, "%s", + PQgetvalue(res,tuple,field)); + break; + default: { + char *expsrc,*expdest; + + /* Before outputting string value, expand all + single quotes to twin single quotes - + dhb - 6/11/96 */ + expsrc=PQgetvalue(res,tuple,field); + expdest=expandbuf; + while (*expsrc) { + *expdest++=*expsrc; + if (*expsrc == (char)0x27) /*single quote*/ + *expdest++ = *expsrc; + expsrc++; + } + *expdest=*expsrc; /* null term. */ + + fprintf(fout, "'%s'", expandbuf); + } + break; + } + } + field++; + if(field != PQnfields(res)) + fprintf(fout, ","); + } while(field < PQnfields(res)); + fprintf(fout, ");\n"); + tuple++; + } + PQclear(res); +} + + + +/* + * DumpClasses - + * dump the contents of all the classes. + */ +static void +dumpClasses(const TableInfo tblinfo[], const int numTables, FILE *fout, + const char *onlytable, const bool oids) { + + int i; + char *all_only; + + if (onlytable = NULL) all_only = "all"; + else all_only = "one"; + + if (g_verbose) + fprintf(stderr, "%s dumping out the contents of %s of %d tables %s\n", + g_comment_start, all_only, numTables, g_comment_end); + + for(i = 0; i < numTables; i++) { + const char *classname = tblinfo[i].relname; + + if (!onlytable || (!strcmp(classname,onlytable))) { + if (g_verbose) + fprintf(stderr, "%s dumping out the contents of Table %s %s\n", + g_comment_start, classname, g_comment_end); + + /* skip archive names*/ + if (isArchiveName(classname)) + continue; + + if(!dumpData) + dumpClasses_nodumpData(fout, classname, oids); + else + dumpClasses_dumpData(fout, classname, tblinfo[i], oids); + } + } +} + + + int main(int argc, char** argv) { @@ -126,7 +335,7 @@ main(int argc, char** argv) dbname = NULL; filename = NULL; tablename = NULL; - g_verbose = 0; + g_verbose = false; oids = 0; strcpy(g_comment_start,"-- "); @@ -138,22 +347,22 @@ main(int argc, char** argv) progname = *argv; while ((c = getopt(argc, argv,"f:H:p:t:vSDdDao")) != EOF) { - switch(c) { - case 'f': /* output file name */ - filename = optarg; - break; - case 'H' : /* server host */ - pghost = optarg; - break; - case 'p' : /* server port */ - pgport = optarg; - break; - case 'v': /* verbose */ - g_verbose = 1; - break; - case 'S': /* dump schema only */ - schemaOnly = 1; - break; + switch(c) { + case 'f': /* output file name */ + filename = optarg; + break; + case 'H' : /* server host */ + pghost = optarg; + break; + case 'p' : /* server port */ + pgport = optarg; + break; + case 'v': /* verbose */ + g_verbose = true; + break; + case 'S': /* dump schema only */ + schemaOnly = 1; + break; case 'd': /* dump data as proper insert strings */ dumpData = 1; break; @@ -161,46 +370,47 @@ main(int argc, char** argv) dumpData = 1; attrNames = 1; break; - case 't': /* Dump data for this table only */ - tablename = optarg; - break; - case 'a': /* Dump data only */ - dataOnly = 1; - break; - case 'o': /* Dump oids */ - oids = 1; - break; - default: - usage(progname); - break; - } + case 't': /* Dump data for this table only */ + tablename = optarg; + break; + case 'a': /* Dump data only */ + dataOnly = 1; + break; + case 'o': /* Dump oids */ + oids = 1; + break; + default: + usage(progname); + break; + } } /* open the output file */ if (filename == NULL) { - g_fout = stdout; + g_fout = stdout; } else { - g_fout = fopen(filename, "w"); - if (g_fout == NULL) { - fprintf(stderr,"%s: could not open output file named %s for writing\n", - progname, filename); - exit(2); - } + g_fout = fopen(filename, "w"); + if (g_fout == NULL) { + fprintf(stderr, + "%s: could not open output file named %s for writing\n", + progname, filename); + exit(2); + } } /* find database */ if (!(dbname = argv[optind]) && - !(dbname = getenv("DATABASE")) ) { - fprintf(stderr, "%s: no database name specified\n",progname); - exit (2); - } + !(dbname = getenv("DATABASE")) ) { + fprintf(stderr, "%s: no database name specified\n",progname); + exit (2); + } g_conn = PQsetdb(pghost, pgport, NULL, NULL, dbname); /* check to see that the backend connection was successfully made */ if (PQstatus(g_conn) == CONNECTION_BAD) { - fprintf(stderr,"Connection to database '%s' failed.\n", dbname); - fprintf(stderr,"%s",PQerrorMessage(g_conn)); - exit_nicely(g_conn); + fprintf(stderr,"Connection to database '%s' failed.\n", dbname); + fprintf(stderr,"%s\n",PQerrorMessage(g_conn)); + exit_nicely(g_conn); } g_last_builtin_oid = findLastBuiltinOid(); @@ -208,23 +418,20 @@ main(int argc, char** argv) if (oids) setMaxOid(g_fout); if (!dataOnly) { - if (g_verbose) - fprintf(stderr, "%s last builtin oid is %d %s\n", - g_comment_start, g_last_builtin_oid, g_comment_end); - tblinfo = dumpSchema(g_fout, &numTables, tablename); + if (g_verbose) + fprintf(stderr, "%s last builtin oid is %d %s\n", + g_comment_start, g_last_builtin_oid, g_comment_end); + tblinfo = dumpSchema(g_fout, &numTables, tablename); } else tblinfo = dumpSchema(NULL, &numTables, tablename); if (!schemaOnly) { - if (g_verbose) - fprintf(stderr,"%s dumping out the contents of each table %s\n", - g_comment_start, g_comment_end); dumpClasses(tblinfo, numTables, g_fout, tablename, oids); } if (!dataOnly) /* dump indexes at the end for performance */ - dumpSchemaIdx(g_fout, &numTables, tablename, tblinfo, numTables); + dumpSchemaIdx(g_fout, &numTables, tablename, tblinfo, numTables); fflush(g_fout); fclose(g_fout); @@ -268,9 +475,9 @@ getTypes(int *numTypes) res = PQexec(g_conn, "begin"); if (!res || - PQresultStatus(res) != PGRES_COMMAND_OK) { - fprintf(stderr,"BEGIN command failed\n"); - exit_nicely(g_conn); + PQresultStatus(res) != PGRES_COMMAND_OK) { + fprintf(stderr,"BEGIN command failed\n"); + exit_nicely(g_conn); } PQclear(res); @@ -280,13 +487,15 @@ getTypes(int *numTypes) /* we filter out the built-in types when we dump out the types */ - sprintf(query, "SELECT oid, typowner,typname, typlen, typprtlen, typinput, typoutput, typreceive, typsend, typelem, typdelim, typdefault, typrelid,typbyval from pg_type"); + sprintf(query, "SELECT oid, typowner,typname, typlen, typprtlen, " + "typinput, typoutput, typreceive, typsend, typelem, typdelim, " + "typdefault, typrelid,typbyval from pg_type"); res = PQexec(g_conn,query); if (!res || - PQresultStatus(res) != PGRES_TUPLES_OK) { - fprintf(stderr,"getTypes(): SELECT failed"); - exit_nicely(g_conn); + PQresultStatus(res) != PGRES_TUPLES_OK) { + fprintf(stderr,"getTypes(): SELECT failed\n"); + exit_nicely(g_conn); } ntups = PQntuples(res); @@ -309,32 +518,32 @@ getTypes(int *numTypes) i_typbyval = PQfnumber(res,"typbyval"); for (i=0;i '%d'::oid", - g_last_builtin_oid); + "SELECT oid, proname, proowner, prolang, pronargs, prorettype, " + "proretset, proargtypes, prosrc, probin from pg_proc " + "where oid > '%d'::oid", + g_last_builtin_oid); res = PQexec(g_conn, query); if (!res || - PQresultStatus(res) != PGRES_TUPLES_OK) { - fprintf(stderr,"getFuncs(): SELECT failed"); - exit_nicely(g_conn); + PQresultStatus(res) != PGRES_TUPLES_OK) { + fprintf(stderr,"getFuncs(): SELECT failed\n"); + exit_nicely(g_conn); } ntups = PQntuples(res); @@ -595,21 +810,21 @@ getFuncs(int *numFuncs) i_probin = PQfnumber(res,"probin"); for (i=0;i 0 order by attnum",tblinfo[i].oid); - res = PQexec(g_conn, q); - if (!res || - PQresultStatus(res) != PGRES_TUPLES_OK) { - fprintf(stderr,"getTableAttrs(): SELECT failed"); - exit_nicely(g_conn); - } - - ntups = PQntuples(res); - - i_attname = PQfnumber(res,"attname"); - i_typname = PQfnumber(res,"typname"); - i_attlen = PQfnumber(res,"attlen"); - - tblinfo[i].numatts = ntups; - tblinfo[i].attnames = (char**) malloc( ntups * sizeof(char*)); - tblinfo[i].typnames = (char**) malloc( ntups * sizeof(char*)); - tblinfo[i].attlen = (int*) malloc(ntups * sizeof(int)); - tblinfo[i].inhAttrs = (int*) malloc (ntups * sizeof(int)); - tblinfo[i].parentRels = NULL; - tblinfo[i].numParents = 0; - for (j=0;j 0) - tblinfo[i].attlen[j] = tblinfo[i].attlen[j] - 4; - tblinfo[i].inhAttrs[j] = 0; /* this flag is set in flagInhAttrs()*/ - } - PQclear(res); + /* skip archive tables */ + if (isArchiveName(tblinfo[i].relname)) + continue; + + /* find all the user attributes and their types*/ + /* we must read the attribute names in attribute number order! */ + /* because we will use the attnum to index into the attnames array + later */ + if (g_verbose) + fprintf(stderr,"%s finding the attrs and types for table: %s %s\n", + g_comment_start, + tblinfo[i].relname, + g_comment_end); + + sprintf(q,"SELECT a.attnum, a.attname, t.typname, a.attlen " + "from pg_attribute a, pg_type t " + "where a.attrelid = '%s'::oid and a.atttypid = t.oid " + "and a.attnum > 0 order by attnum", + tblinfo[i].oid); + res = PQexec(g_conn, q); + if (!res || + PQresultStatus(res) != PGRES_TUPLES_OK) { + fprintf(stderr,"getTableAttrs(): SELECT failed\n"); + exit_nicely(g_conn); + } + + ntups = PQntuples(res); + + i_attname = PQfnumber(res,"attname"); + i_typname = PQfnumber(res,"typname"); + i_attlen = PQfnumber(res,"attlen"); + + tblinfo[i].numatts = ntups; + tblinfo[i].attnames = (char**) malloc( ntups * sizeof(char*)); + tblinfo[i].typnames = (char**) malloc( ntups * sizeof(char*)); + tblinfo[i].attlen = (int*) malloc(ntups * sizeof(int)); + tblinfo[i].inhAttrs = (int*) malloc (ntups * sizeof(int)); + tblinfo[i].parentRels = NULL; + tblinfo[i].numParents = 0; + for (j=0;j 0) + tblinfo[i].attlen[j] = tblinfo[i].attlen[j] - 4; + tblinfo[i].inhAttrs[j] = 0; /* this flag is set in flagInhAttrs()*/ + } + PQclear(res); } } @@ -856,21 +1077,28 @@ getIndices(int *numIndices) res = PQexec(g_conn, "begin"); if (!res || - PQresultStatus(res) != PGRES_COMMAND_OK) { - fprintf(stderr,"BEGIN command failed\n"); - exit_nicely(g_conn); + PQresultStatus(res) != PGRES_COMMAND_OK) { + fprintf(stderr,"BEGIN command failed\n"); + exit_nicely(g_conn); } PQclear(res); sprintf(query, - "SELECT t1.relname as indexrelname, t2.relname as indrelname, i.indproc, i.indkey[0], o.opcname as indclassname, a.amname as indamname from pg_index i, pg_class t1, pg_class t2, pg_opclass o, pg_am a where t1.oid = i.indexrelid and t2.oid = i.indrelid and o.oid = i.indclass[0] and t1.relam = a.oid and i.indexrelid > '%d'::oid and t2.relname !~ '^pg_' and t1.relname !~ '^Xinx' ;", - g_last_builtin_oid); + "SELECT t1.relname as indexrelname, t2.relname as indrelname, " + "i.indproc, i.indkey[0], o.opcname as indclassname, " + "a.amname as indamname from pg_index i, pg_class t1, " + "pg_class t2, pg_opclass o, pg_am a " + "where t1.oid = i.indexrelid and t2.oid = i.indrelid " + "and o.oid = i.indclass[0] and t1.relam = a.oid and " + "i.indexrelid > '%d'::oid and t2.relname !~ '^pg_' " + "and t1.relname !~ '^Xinx' ;", + g_last_builtin_oid); res = PQexec(g_conn, query); if (!res || - PQresultStatus(res) != PGRES_TUPLES_OK) { - fprintf(stderr,"getIndices(): SELECT failed"); - exit_nicely(g_conn); + PQresultStatus(res) != PGRES_TUPLES_OK) { + fprintf(stderr,"getIndices(): SELECT failed\n"); + exit_nicely(g_conn); } ntups = PQntuples(res); @@ -887,12 +1115,12 @@ getIndices(int *numIndices) i_indclassname = PQfnumber(res,"indclassname"); for (i=0;i 0) ? "," : "", - typname); + char* typname; + typname = findTypeByOid(tinfo, numTypes, finfo[i].argtypes[j]); + sprintf(q, "%s%s%s", + q, + (j > 0) ? "," : "", + typname); } sprintf(q,"%s ) RETURNS %s%s AS '%s' LANGUAGE '%s';\n", - q, - finfo[i].retset ? " SETOF " : "", - findTypeByOid(tinfo, numTypes, finfo[i].prorettype), - (finfo[i].lang) ? finfo[i].probin : finfo[i].prosrc, - (finfo[i].lang) ? "C" : "SQL"); + q, + finfo[i].retset ? " SETOF " : "", + findTypeByOid(tinfo, numTypes, finfo[i].prorettype), + (finfo[i].lang) ? finfo[i].probin : finfo[i].prosrc, + (finfo[i].lang) ? "C" : "SQL"); fputs(q,fout); @@ -1027,7 +1257,7 @@ dumpOneFunc(FILE* fout, FuncInfo* finfo, int i, */ void dumpOprs(FILE* fout, OprInfo* oprinfo, int numOperators, - TypeInfo *tinfo, int numTypes) + TypeInfo *tinfo, int numTypes) { int i; char q[MAXQUERYLEN]; @@ -1041,78 +1271,79 @@ dumpOprs(FILE* fout, OprInfo* oprinfo, int numOperators, for (i=0;i 0) ? ", " : "", - tblinfo[i].attnames[j]); - - /* stored length can be -1 (variable) */ - if (tblinfo[i].attlen[j] > 0) - sprintf(q, "%s(%d)", - q, - tblinfo[i].attlen[j]); - actual_atts++; - } - else if (!strcmp(tblinfo[i].typnames[j],"varchar")) { - sprintf(q, "%s%s%s %s", - q, - (actual_atts > 0) ? ", " : "", - tblinfo[i].attnames[j], - tblinfo[i].typnames[j]); - - /* stored length can be -1 (variable) */ - if (tblinfo[i].attlen[j] > 0) - sprintf(q, "%s(%d)", - q, - tblinfo[i].attlen[j]); - actual_atts++; - } - else { - sprintf(q, "%s%s%s %s", - q, - (actual_atts > 0) ? ", " : "", - tblinfo[i].attnames[j], - tblinfo[i].typnames[j]); - actual_atts++; - } - } - } - - strcat(q,")"); - - if (numParents > 0) { - sprintf(q, "%s inherits ( ",q); - for (k=0;k0) ? ", " : "", - parentRels[k]); - } - strcat(q,")"); - } - - switch(tblinfo[i].relarch[0]) { - case 'n': - archiveMode = "none"; - break; - case 'h': - archiveMode = "heavy"; - break; - case 'l': - archiveMode = "light"; - break; - default: - fprintf(stderr, "unknown archive mode\n"); - archiveMode = "none"; - break; - } - - sprintf(q, "%s archive = %s;\n", - q, - archiveMode); - fputs(q,fout); + /* skip archive names*/ + if (isArchiveName(tblinfo[i].relname)) + continue; + + parentRels = tblinfo[i].parentRels; + numParents = tblinfo[i].numParents; + + sprintf(q, "CREATE TABLE %s (", tblinfo[i].relname); + actual_atts = 0; + for (j=0;j 0) ? ", " : "", + tblinfo[i].attnames[j]); + + /* stored length can be -1 (variable) */ + if (tblinfo[i].attlen[j] > 0) + sprintf(q, "%s(%d)", + q, + tblinfo[i].attlen[j]); + actual_atts++; + } + else if (!strcmp(tblinfo[i].typnames[j],"varchar")) { + sprintf(q, "%s%s%s %s", + q, + (actual_atts > 0) ? ", " : "", + tblinfo[i].attnames[j], + tblinfo[i].typnames[j]); + + /* stored length can be -1 (variable) */ + if (tblinfo[i].attlen[j] > 0) + sprintf(q, "%s(%d)", + q, + tblinfo[i].attlen[j]); + actual_atts++; + } + else { + sprintf(q, "%s%s%s %s", + q, + (actual_atts > 0) ? ", " : "", + tblinfo[i].attnames[j], + tblinfo[i].typnames[j]); + actual_atts++; + } + } + } + + strcat(q,")"); + + if (numParents > 0) { + sprintf(q, "%s inherits ( ",q); + for (k=0;k0) ? ", " : "", + parentRels[k]); + } + strcat(q,")"); + } + + switch(tblinfo[i].relarch[0]) { + case 'n': + archiveMode = "none"; + break; + case 'h': + archiveMode = "heavy"; + break; + case 'l': + archiveMode = "light"; + break; + default: + fprintf(stderr, "unknown archive mode\n"); + archiveMode = "none"; + break; + } + + sprintf(q, "%s archive = %s;\n", + q, + archiveMode); + fputs(q,fout); } } } @@ -1304,7 +1535,7 @@ void dumpTables(FILE* fout, TableInfo *tblinfo, int numTables, */ void dumpIndices(FILE* fout, IndInfo* indinfo, int numIndices, - TableInfo* tblinfo, int numTables, const char *tablename) + TableInfo* tblinfo, int numTables, const char *tablename) { int i; int tableInd; @@ -1316,193 +1547,50 @@ dumpIndices(FILE* fout, IndInfo* indinfo, int numIndices, PGresult *res; for (i=0;iconn, copybuf, COPYBUFSIZ); - - if (copybuf[0] == '\\' && - copybuf[1] == '.' && - copybuf[2] == '\0') { - copydone = true; /* don't print this... */ - } else { - fputs(copybuf, fout); - switch (ret) { - case EOF: - copydone = true; - /*FALLTHROUGH*/ - case 0: - fputc('\n', fout); - break; - case 1: - break; - } - } - } - fprintf(fout, "\\.\n"); - PQclear(res); - PQendcopy(res->conn); - } else { - sprintf(query, "select * from %s;\n", classname); - res = PQexec(g_conn, query); - if (!res || - PQresultStatus(res) != PGRES_TUPLES_OK) { - fprintf(stderr,"dumpClasses(): command failed"); - exit_nicely(g_conn); - } - tuple=0; - while(tuple < PQntuples(res)) { - fprintf(fout, "insert into %s ", classname); - if (attrNames) { - actual_atts = 0; - sprintf(q, "("); - for (j=0;j 0) ? "," : "", - tblinfo[i].attnames[j]); - actual_atts++; - } - } - sprintf(q,"%s%s",q, ") "); - fprintf(fout, q); - } - fprintf(fout, "values ("); - field=0; - do { - if (PQgetisnull(res,tuple,field)) { - fprintf(fout,"NULL"); - } - else { - switch(PQftype(res,field)) { - case 21: case 22: case 23: /* int types */ - case 810: case 910: /* oldint types */ - case 1005: case 1006: case 1007: /* _int types */ - case 700: case 701: /* float types */ - case 1021: case 1022: /* _float types */ - fprintf(fout, "%s", PQgetvalue(res,tuple,field)); - break; - default: - - /* Before outputing string value, expand all - single quotes to twin single quotes - - dhb - 6/11/96 */ - expsrc=PQgetvalue(res,tuple,field); - expdest=expandbuf; - while (*expsrc) { - *expdest++=*expsrc; - if (*expsrc == (char)0x27) /*sing. quote*/ - *expdest++ = *expsrc; - expsrc++; - } - *expdest=*expsrc; /* null term. */ - - fprintf(fout, "'%s'", expandbuf); - break; - } - } - field++; - if(field != PQnfields(res)) - fprintf(fout, ","); - } while(field < PQnfields(res)); - fprintf(fout, ");\n"); - tuple++; - } - PQclear(res); - } - } - } -} - /* * dumpTuples -- * prints out the tuples in ASCII representation. The output is a valid @@ -1526,35 +1614,35 @@ dumpTuples(PGresult *res, FILE *fout, int* attrmap) m = PQnfields(res); if ( m > 0 ) { - /* - * Print out the tuples but only print tuples with at least - * 1 field. - */ - outVals = (char**)malloc(m * sizeof(char*)); - - for (j = 0; j < n; j++) { - for (k = 0; k < m; k++) { - outVals[attrmap[k]] = PQgetvalue(res, j, k); - } - for (k = 0; k < m; k++) { - char *pval = outVals[k]; - - if (k!=0) - fputc('\t', fout); /* delimiter for attribute */ - - if (pval) { - while (*pval != '\0') { - /* escape tabs, newlines and backslashes */ - if (*pval=='\t' || *pval=='\n' || *pval=='\\') - fputc('\\', fout); - fputc(*pval, fout); - pval++; - } - } - } - fputc('\n', fout); /* delimiter for a tuple */ - } - free (outVals); + /* + * Print out the tuples but only print tuples with at least + * 1 field. + */ + outVals = (char**)malloc(m * sizeof(char*)); + + for (j = 0; j < n; j++) { + for (k = 0; k < m; k++) { + outVals[attrmap[k]] = PQgetvalue(res, j, k); + } + for (k = 0; k < m; k++) { + char *pval = outVals[k]; + + if (k!=0) + fputc('\t', fout); /* delimiter for attribute */ + + if (pval) { + while (*pval != '\0') { + /* escape tabs, newlines and backslashes */ + if (*pval=='\t' || *pval=='\n' || *pval=='\\') + fputc('\\', fout); + fputc(*pval, fout); + pval++; + } + } + } + fputc('\n', fout); /* delimiter for a tuple */ + } + free (outVals); } } @@ -1597,13 +1685,13 @@ setMaxOid(FILE *fout) PQclear(res); if (g_verbose) fprintf(stderr, "%s maximum system oid is %d %s\n", - g_comment_start, max_oid, g_comment_end); + g_comment_start, max_oid, g_comment_end); fprintf(fout, "CREATE TABLE pgdump_oid (dummy int4);\n"); fprintf(fout, "COPY pgdump_oid WITH OIDS FROM stdin;\n"); fprintf(fout, "%-d\t0\n", max_oid); fprintf(fout, "\\.\n"); fprintf(fout, "DROP TABLE pgdump_oid;\n"); -} +} /* * findLastBuiltInOid - @@ -1615,25 +1703,26 @@ setMaxOid(FILE *fout) int findLastBuiltinOid(void) { - PGresult* res; - int ntups; - int last_oid; - - res = PQexec(g_conn, - "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"); - exit_nicely(g_conn); - } - ntups = PQntuples(res); - if (ntups != 1) { - fprintf(stderr,"pg_dump: couldn't find the template1 database. You are really hosed\nGiving up\n"); - exit_nicely(g_conn); - } - last_oid = atoi(PQgetvalue(res, 0, PQfnumber(res, "oid"))); - PQclear(res); - return last_oid; + PGresult* res; + int ntups; + int last_oid; + + res = PQexec(g_conn, + "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"); + exit_nicely(g_conn); + } + ntups = PQntuples(res); + if (ntups != 1) { + fprintf(stderr,"pg_dump: couldn't find the template1 database. " + "You are really hosed.\nGiving up.\n"); + exit_nicely(g_conn); + } + last_oid = atoi(PQgetvalue(res, 0, PQfnumber(res, "oid"))); + PQclear(res); + return last_oid; } @@ -1654,11 +1743,11 @@ checkForQuote(const char* s) while ( (c = *s) != '\0') { - if (c == '\'') { - r[j++] = '\''; /* quote the single quotes */ - } - r[j++] = c; - s++; + if (c == '\'') { + r[j++] = '\''; /* quote the single quotes */ + } + r[j++] = c; + s++; } r[j] = '\0'; diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index d6d5c301eb..e7c0b8eb6c 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -5,7 +5,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: pg_dump.h,v 1.8 1996/11/26 03:19:49 bryanh Exp $ + * $Id: pg_dump.h,v 1.9 1996/12/27 23:12:57 bryanh Exp $ * * Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2 * @@ -122,7 +122,7 @@ typedef struct _oprInfo { /* global decls */ -extern int g_verbose; /* verbose flag */ +extern bool g_verbose; /* verbose flag */ extern int g_last_builtin_oid; /* value of the last builtin oid */ extern FILE *g_fout; /* the script file */ @@ -189,8 +189,6 @@ extern void dumpTables(FILE* fout, TableInfo* tbinfo, int numTables, extern void dumpIndices(FILE* fout, IndInfo* indinfo, int numIndices, TableInfo* tbinfo, int numTables, const char *tablename); -extern void dumpClasses(TableInfo *tbinfo, int numTables, FILE *fout, - const char *tablename, int oids); extern void dumpTuples(PGresult *res, FILE *fout, int *attrmap); extern void setMaxOid(FILE *fout); extern char* checkForQuote(const char* s);