summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian1998-10-06 03:09:02 +0000
committerBruce Momjian1998-10-06 03:09:02 +0000
commitb7ed6f8512b40ce7b82de0cb084452ca11277b84 (patch)
tree5b36c1eb9494657e90ef6a6e156767bd39228a0a
parente1ebac319d1491e54dd8e3e457d48aa766771366 (diff)
Hi all
Is it too late to add a feature to pg_dump for 6.4?? I just spent most of the day learning pg_dump and modifing it so it would dump views also. This is the first time I have ever contributed any code changes, so I'm not sure of how to submit it. The diff's and a readme as a tgz file are attached. Thanks Terry Mackintosh <[email protected]> http://www.terrym.com
-rw-r--r--src/bin/pg_dump/pg_dump.c188
-rw-r--r--src/bin/pg_dump/pg_dump.h3
-rw-r--r--src/man/pg_dump.110
3 files changed, 122 insertions, 79 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index ee944f6acc..8e4e32896e 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.88 1998/10/02 16:43:40 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.89 1998/10/06 03:08:59 momjian Exp $
*
* Modifications - 6/10/96 - [email protected] - version 1.13.dhb
*
@@ -1383,7 +1383,7 @@ getFuncs(int *numFuncs)
TableInfo *
getTables(int *numTables, FuncInfo *finfo, int numFuncs)
{
- PGresult *res;
+ PGresult *res, *viewres;
int ntups;
int i;
char query[MAXQUERYLEN];
@@ -1414,6 +1414,8 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
}
PQclear(res);
+/* NOTE, when outer joins are here, change this query to get the
+view definition all in one go. */
sprintf(query,
"SELECT pg_class.oid, relname, relkind, relacl, usename, "
"relchecks, reltriggers "
@@ -1454,6 +1456,39 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
tblinfo[i].ncheck = atoi(PQgetvalue(res, i, i_relchecks));
tblinfo[i].ntrig = atoi(PQgetvalue(res, i, i_reltriggers));
+ /* NOTE that at such time as left outer joins become avaliable,
+ then this will no longer be needed, and can be done in the
+ above query. */
+
+ sprintf(query,
+ "select definition from pg_views where viewname = '%s';",
+ tblinfo[i].relname);
+
+ viewres = PQexec(g_conn, query);
+ if (!viewres ||
+ PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ fprintf(stderr, "getTables(): SELECT for views failed\n");
+ exit_nicely(g_conn);
+ }
+
+ /* NOTE: Tryed to use isViewRule here, but it does it's own
+ BEGIN and END so messed things up.
+ This also needs redone should we ever get outer joins.
+ */
+ if ( PQntuples(viewres) > 0 )
+ {
+ if ( PQntuples(viewres) != 1 )
+ {
+ fprintf(stderr, "getTables(): failed to get view definition.\n");
+ exit_nicely(g_conn);
+ }
+
+ tblinfo[i].viewdef = strdup(PQgetvalue(viewres, 0, 0));
+ }
+
+ PQclear(viewres);
+
/* Get CHECK constraints */
if (tblinfo[i].ncheck > 0)
{
@@ -2468,95 +2503,102 @@ dumpTables(FILE *fout, TableInfo *tblinfo, int numTables,
if (!tablename || (!strcmp(tblinfo[i].relname, tablename)))
{
- /* Skip VIEW relations */
+ /* Dump VIEW relations also !-) */
if (isViewRule(tblinfo[i].relname))
- continue;
-
- parentRels = tblinfo[i].parentRels;
- numParents = tblinfo[i].numParents;
-
- becomeUser(fout, tblinfo[i].usename);
+ {
+ becomeUser(fout, tblinfo[i].usename);
- sprintf(q, "CREATE TABLE %s (", fmtId(tblinfo[i].relname));
- actual_atts = 0;
- for (j = 0; j < tblinfo[i].numatts; j++)
+ sprintf(q, "CREATE VIEW %s AS %s\n",
+ fmtId(tblinfo[i].relname),
+ tblinfo[i].viewdef);
+ }
+ else
{
- if (tblinfo[i].inhAttrs[j] == 0)
- {
+ parentRels = tblinfo[i].parentRels;
+ numParents = tblinfo[i].numParents;
- /* Show lengths on bpchar and varchar */
- if (!strcmp(tblinfo[i].typnames[j], "bpchar"))
- {
- sprintf(q, "%s%s%s char",
- q,
- (actual_atts > 0) ? ", " : "",
- fmtId(tblinfo[i].attnames[j]));
+ becomeUser(fout, tblinfo[i].usename);
- sprintf(q, "%s(%d)",
- q,
- tblinfo[i].atttypmod[j] - VARHDRSZ);
- actual_atts++;
- }
- else if (!strcmp(tblinfo[i].typnames[j], "varchar"))
+ sprintf(q, "CREATE TABLE %s (", fmtId(tblinfo[i].relname));
+ actual_atts = 0;
+ for (j = 0; j < tblinfo[i].numatts; j++)
+ {
+ if (tblinfo[i].inhAttrs[j] == 0)
{
- sprintf(q, "%s%s%s %s",
- q,
- (actual_atts > 0) ? ", " : "",
- fmtId(tblinfo[i].attnames[j]),
- tblinfo[i].typnames[j]);
- sprintf(q, "%s(%d)",
- q,
- tblinfo[i].atttypmod[j] - VARHDRSZ);
- actual_atts++;
- }
- else
- {
- strcpy(id1, fmtId(tblinfo[i].attnames[j]));
- strcpy(id2, fmtId(tblinfo[i].typnames[j]));
- sprintf(q, "%s%s%s %s",
- q,
- (actual_atts > 0) ? ", " : "",
- id1,
- id2);
- actual_atts++;
+ /* Show lengths on bpchar and varchar */
+ if (!strcmp(tblinfo[i].typnames[j], "bpchar"))
+ {
+ sprintf(q, "%s%s%s char",
+ q,
+ (actual_atts > 0) ? ", " : "",
+ fmtId(tblinfo[i].attnames[j]));
+
+ sprintf(q, "%s(%d)",
+ q,
+ tblinfo[i].atttypmod[j] - VARHDRSZ);
+ actual_atts++;
+ }
+ else if (!strcmp(tblinfo[i].typnames[j], "varchar"))
+ {
+ sprintf(q, "%s%s%s %s",
+ q,
+ (actual_atts > 0) ? ", " : "",
+ fmtId(tblinfo[i].attnames[j]),
+ tblinfo[i].typnames[j]);
+
+ sprintf(q, "%s(%d)",
+ q,
+ tblinfo[i].atttypmod[j] - VARHDRSZ);
+ actual_atts++;
+ }
+ else
+ {
+ strcpy(id1, fmtId(tblinfo[i].attnames[j]));
+ strcpy(id2, fmtId(tblinfo[i].typnames[j]));
+ sprintf(q, "%s%s%s %s",
+ q,
+ (actual_atts > 0) ? ", " : "",
+ id1,
+ id2);
+ actual_atts++;
+ }
+ if (tblinfo[i].adef_expr[j] != NULL)
+ sprintf(q, "%s DEFAULT %s", q, tblinfo[i].adef_expr[j]);
+ if (tblinfo[i].notnull[j])
+ sprintf(q, "%s NOT NULL", q);
}
- if (tblinfo[i].adef_expr[j] != NULL)
- sprintf(q, "%s DEFAULT %s", q, tblinfo[i].adef_expr[j]);
- if (tblinfo[i].notnull[j])
- sprintf(q, "%s NOT NULL", q);
}
- }
- /* put the CONSTRAINTS inside the table def */
- for (k = 0; k < tblinfo[i].ncheck; k++)
- {
- sprintf(q, "%s%s %s",
- q,
- (actual_atts + k > 0) ? ", " : "",
- tblinfo[i].check_expr[k]);
- }
-
- strcat(q, ")");
-
- if (numParents > 0)
- {
- sprintf(q, "%s inherits ( ", q);
- for (k = 0; k < numParents; k++)
+ /* put the CONSTRAINTS inside the table def */
+ for (k = 0; k < tblinfo[i].ncheck; k++)
{
- sprintf(q, "%s%s%s",
+ sprintf(q, "%s%s %s",
q,
- (k > 0) ? ", " : "",
- fmtId(parentRels[k]));
+ (actual_atts + k > 0) ? ", " : "",
+ tblinfo[i].check_expr[k]);
}
+
strcat(q, ")");
- }
- strcat(q, ";\n");
+ if (numParents > 0)
+ {
+ sprintf(q, "%s inherits ( ", q);
+ for (k = 0; k < numParents; k++)
+ {
+ sprintf(q, "%s%s%s",
+ q,
+ (k > 0) ? ", " : "",
+ fmtId(parentRels[k]));
+ }
+ strcat(q, ")");
+ }
+ strcat(q, ";\n");
+ } /* end of if view ... else .... */
+
fputs(q, fout);
if (acls)
dumpACL(fout, tblinfo[i]);
-
}
}
}
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
index 0a87093561..3192898b46 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.33 1998/10/02 16:43:41 thomas Exp $
+ * $Id: pg_dump.h,v 1.34 1998/10/06 03:09:01 momjian Exp $
*
* Modifications - 6/12/96 - [email protected] - version 1.13.dhb.2
*
@@ -66,6 +66,7 @@ typedef struct _tableInfo
{
char *oid;
char *relname;
+ char *viewdef;
char *relacl;
bool sequence;
int numatts; /* number of attributes */
diff --git a/src/man/pg_dump.1 b/src/man/pg_dump.1
index 67f04e67c0..ebe2a9f6d0 100644
--- a/src/man/pg_dump.1
+++ b/src/man/pg_dump.1
@@ -1,6 +1,6 @@
.\" This is -*-nroff-*-
.\" XXX standard disclaimer belongs here....
-.\" $Header: /cvsroot/pgsql/src/man/Attic/pg_dump.1,v 1.12 1998/07/19 05:24:51 momjian Exp $
+.\" $Header: /cvsroot/pgsql/src/man/Attic/pg_dump.1,v 1.13 1998/10/06 03:09:02 momjian Exp $
.TH PG_DUMP UNIX 7/15/98 PostgreSQL PostgreSQL
.SH NAME
pg_dump - dumps out a Postgres database into a script file
@@ -112,10 +112,10 @@ The limitations mostly stem from
difficulty in extracting certain meta-information from the system
catalogs.
.TP
-.BR "rules and views"
-pg_dump does not understand user-defined rules and views and
-will fail to dump them properly. (This is due to the fact that
-rules are stored as plans in the catalogs and not textually)
+.BR "rules"
+pg_dump does not understand user-defined rules and will fail
+to dump them properly. (This is due to the fact that
+rules are stored as plans in the catalogs and not textually.)
.TP
.BR "partial indices"
pg_dump does not understand partial indices. (The reason is