mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-02 21:46:54 +02:00
This takes care of TODO item
* pg_dump should preserve primary key information Also a couple of warnings removed. -- Peter Eisentraut Sernanders väg 10:115
This commit is contained in:
parent
3c75d64f40
commit
e639a1a6a8
@ -21,7 +21,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.124 1999/11/22 17:56:36 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.125 1999/12/11 00:31:05 momjian Exp $
|
||||||
*
|
*
|
||||||
* Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
|
* Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
|
||||||
*
|
*
|
||||||
@ -299,14 +299,13 @@ dumpClasses_nodumpData(FILE *fout, const char *classname, const bool oids)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dumpClasses_dumpData(FILE *fout, const char *classname,
|
dumpClasses_dumpData(FILE *fout, const char *classname)
|
||||||
const TableInfo tblinfo, bool oids)
|
|
||||||
{
|
{
|
||||||
PGresult *res;
|
PGresult *res;
|
||||||
char q[MAX_QUERY_SIZE];
|
char q[MAX_QUERY_SIZE];
|
||||||
int tuple;
|
int tuple;
|
||||||
int field;
|
int field;
|
||||||
char *expsrc;
|
const char *expsrc;
|
||||||
|
|
||||||
sprintf(q, "SELECT * FROM %s", fmtId(classname, force_quotes));
|
sprintf(q, "SELECT * FROM %s", fmtId(classname, force_quotes));
|
||||||
res = PQexec(g_conn, q);
|
res = PQexec(g_conn, q);
|
||||||
@ -456,7 +455,7 @@ dumpClasses(const TableInfo *tblinfo, const int numTables, FILE *fout,
|
|||||||
if (!dumpData)
|
if (!dumpData)
|
||||||
dumpClasses_nodumpData(fout, classname, oids);
|
dumpClasses_nodumpData(fout, classname, oids);
|
||||||
else
|
else
|
||||||
dumpClasses_dumpData(fout, classname, tblinfo[i], oids);
|
dumpClasses_dumpData(fout, classname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1082,7 +1081,8 @@ clearTableInfo(TableInfo *tblinfo, int numTables)
|
|||||||
free(tblinfo[i].typnames);
|
free(tblinfo[i].typnames);
|
||||||
if (tblinfo[i].notnull)
|
if (tblinfo[i].notnull)
|
||||||
free(tblinfo[i].notnull);
|
free(tblinfo[i].notnull);
|
||||||
|
if (tblinfo[i].primary_key)
|
||||||
|
free(tblinfo[i].primary_key);
|
||||||
}
|
}
|
||||||
free(tblinfo);
|
free(tblinfo);
|
||||||
}
|
}
|
||||||
@ -1408,6 +1408,7 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
|
|||||||
int i_usename;
|
int i_usename;
|
||||||
int i_relchecks;
|
int i_relchecks;
|
||||||
int i_reltriggers;
|
int i_reltriggers;
|
||||||
|
int i_relhasindex;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* find all the user-defined tables (no indices and no catalogs),
|
* find all the user-defined tables (no indices and no catalogs),
|
||||||
@ -1421,7 +1422,7 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
|
|||||||
|
|
||||||
sprintf(query,
|
sprintf(query,
|
||||||
"SELECT pg_class.oid, relname, relkind, relacl, usename, "
|
"SELECT pg_class.oid, relname, relkind, relacl, usename, "
|
||||||
"relchecks, reltriggers "
|
"relchecks, reltriggers, relhasindex "
|
||||||
"from pg_class, pg_user "
|
"from pg_class, pg_user "
|
||||||
"where relowner = usesysid and "
|
"where relowner = usesysid and "
|
||||||
"(relkind = 'r' or relkind = 'S') and relname !~ '^pg_' "
|
"(relkind = 'r' or relkind = 'S') and relname !~ '^pg_' "
|
||||||
@ -1448,6 +1449,7 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
|
|||||||
i_usename = PQfnumber(res, "usename");
|
i_usename = PQfnumber(res, "usename");
|
||||||
i_relchecks = PQfnumber(res, "relchecks");
|
i_relchecks = PQfnumber(res, "relchecks");
|
||||||
i_reltriggers = PQfnumber(res, "reltriggers");
|
i_reltriggers = PQfnumber(res, "reltriggers");
|
||||||
|
i_relhasindex = PQfnumber(res, "relhasindex");
|
||||||
|
|
||||||
for (i = 0; i < ntups; i++)
|
for (i = 0; i < ntups; i++)
|
||||||
{
|
{
|
||||||
@ -1547,8 +1549,8 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
|
|||||||
tblinfo[i].check_expr = (char **) malloc(ntups2 * sizeof(char *));
|
tblinfo[i].check_expr = (char **) malloc(ntups2 * sizeof(char *));
|
||||||
for (i2 = 0; i2 < ntups2; i2++)
|
for (i2 = 0; i2 < ntups2; i2++)
|
||||||
{
|
{
|
||||||
char *name = PQgetvalue(res2, i2, i_rcname);
|
const char *name = PQgetvalue(res2, i2, i_rcname);
|
||||||
char *expr = PQgetvalue(res2, i2, i_rcsrc);
|
const char *expr = PQgetvalue(res2, i2, i_rcsrc);
|
||||||
|
|
||||||
query[0] = '\0';
|
query[0] = '\0';
|
||||||
if (name[0] != '$')
|
if (name[0] != '$')
|
||||||
@ -1561,6 +1563,48 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
|
|||||||
else
|
else
|
||||||
tblinfo[i].check_expr = NULL;
|
tblinfo[i].check_expr = NULL;
|
||||||
|
|
||||||
|
/* Get primary key */
|
||||||
|
if (strcmp(PQgetvalue(res, i, i_relhasindex), "t")==0)
|
||||||
|
{
|
||||||
|
PGresult * res2;
|
||||||
|
char str[INDEX_MAX_KEYS * NAMEDATALEN + 3] = "";
|
||||||
|
int j;
|
||||||
|
|
||||||
|
sprintf(query,
|
||||||
|
"SELECT a.attname "
|
||||||
|
"FROM pg_index i, pg_class c, pg_attribute a "
|
||||||
|
"WHERE i.indisprimary AND i.indrelid = %s "
|
||||||
|
" AND i.indexrelid = c.oid AND a.attnum > 0 AND a.attrelid = c.oid "
|
||||||
|
"ORDER BY a.attnum ",
|
||||||
|
tblinfo[i].oid);
|
||||||
|
res2 = PQexec(g_conn, query);
|
||||||
|
if (!res2 || PQresultStatus(res2) != PGRES_TUPLES_OK)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "getTables(): SELECT (for PRIMARY KEY) failed. Explanation from backend: %s",
|
||||||
|
PQerrorMessage(g_conn));
|
||||||
|
exit_nicely(g_conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < PQntuples(res2); j++)
|
||||||
|
{
|
||||||
|
if (strlen(str)>0)
|
||||||
|
strcat(str, ", ");
|
||||||
|
strcat(str, fmtId(PQgetvalue(res2, j, 0), force_quotes));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen(str)>0) {
|
||||||
|
tblinfo[i].primary_key = strdup(str);
|
||||||
|
if (tblinfo[i].primary_key == NULL) {
|
||||||
|
perror("strdup");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
tblinfo[i].primary_key = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
tblinfo[i].primary_key = NULL;
|
||||||
|
|
||||||
/* Get Triggers */
|
/* Get Triggers */
|
||||||
if (tblinfo[i].ntrig > 0)
|
if (tblinfo[i].ntrig > 0)
|
||||||
{
|
{
|
||||||
@ -1605,11 +1649,11 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
|
|||||||
tblinfo[i].triggers = (char **) malloc(ntups2 * sizeof(char *));
|
tblinfo[i].triggers = (char **) malloc(ntups2 * sizeof(char *));
|
||||||
for (i2 = 0, query[0] = 0; i2 < ntups2; i2++)
|
for (i2 = 0, query[0] = 0; i2 < ntups2; i2++)
|
||||||
{
|
{
|
||||||
char *tgfunc = PQgetvalue(res2, i2, i_tgfoid);
|
const char *tgfunc = PQgetvalue(res2, i2, i_tgfoid);
|
||||||
int2 tgtype = atoi(PQgetvalue(res2, i2, i_tgtype));
|
int2 tgtype = atoi(PQgetvalue(res2, i2, i_tgtype));
|
||||||
int tgnargs = atoi(PQgetvalue(res2, i2, i_tgnargs));
|
int tgnargs = atoi(PQgetvalue(res2, i2, i_tgnargs));
|
||||||
char *tgargs = PQgetvalue(res2, i2, i_tgargs);
|
const char *tgargs = PQgetvalue(res2, i2, i_tgargs);
|
||||||
char *p;
|
const char *p;
|
||||||
char farg[MAX_QUERY_SIZE];
|
char farg[MAX_QUERY_SIZE];
|
||||||
int findx;
|
int findx;
|
||||||
|
|
||||||
@ -1670,8 +1714,8 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
|
|||||||
query, fmtId(tblinfo[i].relname, force_quotes), tgfunc);
|
query, fmtId(tblinfo[i].relname, force_quotes), tgfunc);
|
||||||
for (findx = 0; findx < tgnargs; findx++)
|
for (findx = 0; findx < tgnargs; findx++)
|
||||||
{
|
{
|
||||||
char *s,
|
const char *s;
|
||||||
*d;
|
char *d;
|
||||||
|
|
||||||
for (p = tgargs;;)
|
for (p = tgargs;;)
|
||||||
{
|
{
|
||||||
@ -1925,9 +1969,9 @@ getIndices(int *numIndices)
|
|||||||
"i.indproc, i.indkey, i.indclass, "
|
"i.indproc, i.indkey, i.indclass, "
|
||||||
"a.amname as indamname, i.indisunique "
|
"a.amname as indamname, i.indisunique "
|
||||||
"from pg_index i, pg_class t1, pg_class t2, pg_am a "
|
"from pg_index i, pg_class t1, pg_class t2, pg_am a "
|
||||||
"where t1.oid = i.indexrelid and t2.oid = i.indrelid "
|
"WHERE t1.oid = i.indexrelid and t2.oid = i.indrelid "
|
||||||
"and t1.relam = a.oid and i.indexrelid > '%u'::oid "
|
"and t1.relam = a.oid and i.indexrelid > '%u'::oid "
|
||||||
"and t2.relname !~ '^pg_' and t2.relkind != 'l'",
|
"and t2.relname !~ '^pg_' and t2.relkind != 'l' and not i.indisprimary",
|
||||||
g_last_builtin_oid);
|
g_last_builtin_oid);
|
||||||
|
|
||||||
res = PQexec(g_conn, query);
|
res = PQexec(g_conn, query);
|
||||||
@ -2066,7 +2110,7 @@ dumpProcLangs(FILE *fout, FuncInfo *finfo, int numFuncs,
|
|||||||
int i_lancompiler;
|
int i_lancompiler;
|
||||||
char *lanname;
|
char *lanname;
|
||||||
char *lancompiler;
|
char *lancompiler;
|
||||||
char *lanplcallfoid;
|
const char *lanplcallfoid;
|
||||||
int i,
|
int i,
|
||||||
fidx;
|
fidx;
|
||||||
|
|
||||||
@ -2747,7 +2791,14 @@ dumpTables(FILE *fout, TableInfo *tblinfo, int numTables,
|
|||||||
tblinfo[i].check_expr[k]);
|
tblinfo[i].check_expr[k]);
|
||||||
}
|
}
|
||||||
|
|
||||||
strcat(q, ")");
|
/* PRIMARY KEY */
|
||||||
|
if (tblinfo[i].primary_key) {
|
||||||
|
if (actual_atts + tblinfo[i].ncheck > 0)
|
||||||
|
strcat(q, ",\n\t");
|
||||||
|
sprintf(q + strlen(q), "PRIMARY KEY (%s)", tblinfo[i].primary_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
strcat(q, "\n)");
|
||||||
|
|
||||||
if (numParents > 0)
|
if (numParents > 0)
|
||||||
{
|
{
|
||||||
@ -3134,8 +3185,8 @@ dumpSequence(FILE *fout, TableInfo tbinfo)
|
|||||||
minv,
|
minv,
|
||||||
cache;
|
cache;
|
||||||
char cycled,
|
char cycled,
|
||||||
called,
|
called;
|
||||||
*t;
|
const char *t;
|
||||||
char query[MAX_QUERY_SIZE];
|
char query[MAX_QUERY_SIZE];
|
||||||
|
|
||||||
sprintf(query,
|
sprintf(query,
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $Id: pg_dump.h,v 1.41 1999/11/22 17:56:36 momjian Exp $
|
* $Id: pg_dump.h,v 1.42 1999/12/11 00:31:05 momjian Exp $
|
||||||
*
|
*
|
||||||
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
|
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
|
||||||
*
|
*
|
||||||
@ -101,6 +101,7 @@ typedef struct _tableInfo
|
|||||||
char **check_expr; /* [CONSTRAINT name] CHECK expressions */
|
char **check_expr; /* [CONSTRAINT name] CHECK expressions */
|
||||||
int ntrig; /* # of triggers */
|
int ntrig; /* # of triggers */
|
||||||
char **triggers; /* CREATE TRIGGER ... */
|
char **triggers; /* CREATE TRIGGER ... */
|
||||||
|
char *primary_key; /* PRIMARY KEY of the table, if any */
|
||||||
} TableInfo;
|
} TableInfo;
|
||||||
|
|
||||||
typedef struct _inhInfo
|
typedef struct _inhInfo
|
||||||
|
Loading…
Reference in New Issue
Block a user