mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-15 08:20:16 +08:00
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 <terry@terrym.com> http://www.terrym.com
This commit is contained in:
parent
e1ebac319d
commit
b7ed6f8512
@ -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 - dave@bensoft.com - 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);
|
||||
|
||||
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)
|
||||
becomeUser(fout, tblinfo[i].usename);
|
||||
|
||||
sprintf(q, "CREATE VIEW %s AS %s\n",
|
||||
fmtId(tblinfo[i].relname),
|
||||
tblinfo[i].viewdef);
|
||||
}
|
||||
else
|
||||
{
|
||||
parentRels = tblinfo[i].parentRels;
|
||||
numParents = tblinfo[i].numParents;
|
||||
|
||||
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++)
|
||||
{
|
||||
|
||||
/* Show lengths on bpchar and varchar */
|
||||
if (!strcmp(tblinfo[i].typnames[j], "bpchar"))
|
||||
if (tblinfo[i].inhAttrs[j] == 0)
|
||||
{
|
||||
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]);
|
||||
/* 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++;
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/* 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");
|
||||
strcat(q, ")");
|
||||
|
||||
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]);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 - dave@bensoft.com - 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 */
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user