Commit b259e454 authored by Vadim B. Mikheev's avatar Vadim B. Mikheev

Dumping sequence relations as 'CREATE SEQUENCE ...'.

parent a15158bb
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.25 1997/03/01 15:24:51 momjian Exp $ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.26 1997/04/02 04:17:21 vadim Exp $
* *
* Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb * Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
* *
...@@ -61,6 +61,8 @@ ...@@ -61,6 +61,8 @@
#include "pg_dump.h" #include "pg_dump.h"
static void dumpSequence (FILE* fout, TableInfo tbinfo);
extern char *optarg; extern char *optarg;
extern int optind, opterr; extern int optind, opterr;
...@@ -71,6 +73,8 @@ FILE *g_fout; /* the script file */ ...@@ -71,6 +73,8 @@ FILE *g_fout; /* the script file */
PGconn *g_conn; /* the database connection */ PGconn *g_conn; /* the database connection */
int dumpData; /* dump data using proper insert strings */ int dumpData; /* dump data using proper insert strings */
int attrNames; /* put attr names into insert strings */ int attrNames; /* put attr names into insert strings */
int schemaOnly;
int dataOnly;
char g_opaque_type[10]; /* name for the opaque type */ char g_opaque_type[10]; /* name for the opaque type */
...@@ -346,7 +350,23 @@ dumpClasses(const TableInfo tblinfo[], const int numTables, FILE *fout, ...@@ -346,7 +350,23 @@ dumpClasses(const TableInfo tblinfo[], const int numTables, FILE *fout,
if (isViewRule(tblinfo[i].relname)) if (isViewRule(tblinfo[i].relname))
continue; continue;
if (!onlytable || (!strcmp(classname,onlytable))) { if (!onlytable || (!strcmp(classname,onlytable)))
{
if ( tblinfo[i].sequence )
{
if ( dataOnly ) /* i.e. SCHEMA didn't dumped */
{
if ( g_verbose )
fprintf (stderr, "%s dumping out schema of sequence %s %s\n",
g_comment_start, classname, g_comment_end);
dumpSequence (fout, tblinfo[i]);
}
else if ( g_verbose )
fprintf (stderr, "%s contents of sequence '%s' dumped in schema %s\n",
g_comment_start, classname, g_comment_end);
continue;
}
if (g_verbose) if (g_verbose)
fprintf(stderr, "%s dumping out the contents of Table %s %s\n", fprintf(stderr, "%s dumping out the contents of Table %s %s\n",
g_comment_start, classname, g_comment_end); g_comment_start, classname, g_comment_end);
...@@ -372,8 +392,6 @@ main(int argc, char** argv) ...@@ -372,8 +392,6 @@ main(int argc, char** argv)
const char* progname; const char* progname;
const char* filename; const char* filename;
const char* dbname; const char* dbname;
int schemaOnly;
int dataOnly;
const char *pghost = NULL; const char *pghost = NULL;
const char *pgport = NULL; const char *pgport = NULL;
const char *tablename; const char *tablename;
...@@ -905,6 +923,7 @@ getTables(int *numTables) ...@@ -905,6 +923,7 @@ getTables(int *numTables)
int i_oid; int i_oid;
int i_relname; int i_relname;
int i_relarch; int i_relarch;
int i_relkind;
/* find all the user-defined tables (no indices and no catalogs), /* find all the user-defined tables (no indices and no catalogs),
ordering by oid is important so that we always process the parent ordering by oid is important so that we always process the parent
...@@ -921,8 +940,8 @@ getTables(int *numTables) ...@@ -921,8 +940,8 @@ getTables(int *numTables)
PQclear(res); PQclear(res);
sprintf(query, sprintf(query,
"SELECT oid, relname, relarch from pg_class " "SELECT oid, relname, relarch, relkind from pg_class "
"where relkind = 'r' and relname !~ '^pg_' " "where (relkind = 'r' or relkind = 'S') and relname !~ '^pg_' "
"and relname !~ '^Xinv' order by oid;"); "and relname !~ '^Xinv' order by oid;");
res = PQexec(g_conn, query); res = PQexec(g_conn, query);
...@@ -941,11 +960,13 @@ getTables(int *numTables) ...@@ -941,11 +960,13 @@ getTables(int *numTables)
i_oid = PQfnumber(res,"oid"); i_oid = PQfnumber(res,"oid");
i_relname = PQfnumber(res,"relname"); i_relname = PQfnumber(res,"relname");
i_relarch = PQfnumber(res,"relarch"); i_relarch = PQfnumber(res,"relarch");
i_relkind = PQfnumber(res,"relkind");
for (i=0;i<ntups;i++) { for (i=0;i<ntups;i++) {
tblinfo[i].oid = strdup(PQgetvalue(res,i,i_oid)); tblinfo[i].oid = strdup(PQgetvalue(res,i,i_oid));
tblinfo[i].relname = strdup(PQgetvalue(res,i,i_relname)); tblinfo[i].relname = strdup(PQgetvalue(res,i,i_relname));
tblinfo[i].relarch = strdup(PQgetvalue(res,i,i_relarch)); tblinfo[i].relarch = strdup(PQgetvalue(res,i,i_relarch));
tblinfo[i].sequence = (strcmp (PQgetvalue(res,i,i_relkind), "S") == 0);
} }
PQclear(res); PQclear(res);
...@@ -1041,6 +1062,9 @@ getTableAttrs(TableInfo* tblinfo, int numTables) ...@@ -1041,6 +1062,9 @@ getTableAttrs(TableInfo* tblinfo, int numTables)
/* skip archive tables */ /* skip archive tables */
if (isArchiveName(tblinfo[i].relname)) if (isArchiveName(tblinfo[i].relname))
continue; continue;
if ( tblinfo[i].sequence )
continue;
/* find all the user attributes and their types*/ /* find all the user attributes and their types*/
/* we must read the attribute names in attribute number order! */ /* we must read the attribute names in attribute number order! */
...@@ -1500,6 +1524,12 @@ void dumpTables(FILE* fout, TableInfo *tblinfo, int numTables, ...@@ -1500,6 +1524,12 @@ void dumpTables(FILE* fout, TableInfo *tblinfo, int numTables,
/* skip archive names*/ /* skip archive names*/
if (isArchiveName(tblinfo[i].relname)) if (isArchiveName(tblinfo[i].relname))
continue; continue;
if ( tblinfo[i].sequence )
{
dumpSequence (fout, tblinfo[i]);
continue;
}
parentRels = tblinfo[i].parentRels; parentRels = tblinfo[i].parentRels;
numParents = tblinfo[i].numParents; numParents = tblinfo[i].numParents;
...@@ -1814,3 +1844,68 @@ checkForQuote(const char* s) ...@@ -1814,3 +1844,68 @@ checkForQuote(const char* s)
return result; return result;
} }
static void dumpSequence (FILE* fout, TableInfo tbinfo)
{
PGresult *res;
int4 last, incby, maxv, minv, cache;
char cycled, called, *t;
char query[MAXQUERYLEN];
sprintf (query,
"SELECT sequence_name, last_value, increment_by, max_value, "
"min_value, cache_value, is_cycled, is_called from %s;",
tbinfo.relname);
res = PQexec (g_conn, query);
if ( !res || PQresultStatus(res) != PGRES_TUPLES_OK )
{
fprintf (stderr,"dumpSequence(%s): SELECT failed\n", tbinfo.relname);
exit_nicely (g_conn);
}
if ( PQntuples (res) != 1 )
{
fprintf (stderr,"dumpSequence(%s): %d (!= 1) tuples returned by SELECT\n",
tbinfo.relname, PQntuples(res));
exit_nicely (g_conn);
}
if ( strcmp (PQgetvalue (res,0,0), tbinfo.relname) != 0 )
{
fprintf (stderr, "dumpSequence(%s): different sequence name "
"returned by SELECT: %s\n",
tbinfo.relname, PQgetvalue (res,0,0));
exit_nicely (g_conn);
}
last = atoi (PQgetvalue (res,0,1));
incby = atoi (PQgetvalue (res,0,2));
maxv = atoi (PQgetvalue (res,0,3));
minv = atoi (PQgetvalue (res,0,4));
cache = atoi (PQgetvalue (res,0,5));
t = PQgetvalue (res,0,6);
cycled = *t;
t = PQgetvalue (res,0,7);
called = *t;
PQclear (res);
sprintf (query,
"CREATE SEQUENCE %s start %d increment %d maxvalue %d "
"minvalue %d cache %d %s;\n",
tbinfo.relname, last, incby, maxv, minv, cache,
(cycled == 't') ? "cycle" : "");
fputs (query, fout);
if ( called == 'f' )
return; /* nothing to do more */
sprintf (query, "SELECT nextval ('%s');\n", tbinfo.relname);
fputs (query, fout);
}
...@@ -5,7 +5,7 @@ ...@@ -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.10 1997/01/07 00:04:19 scrappy Exp $ * $Id: pg_dump.h,v 1.11 1997/04/02 04:17:27 vadim 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
* *
...@@ -55,6 +55,7 @@ typedef struct _tableInfo { ...@@ -55,6 +55,7 @@ typedef struct _tableInfo {
char *oid; char *oid;
char *relname; char *relname;
char *relarch; char *relarch;
bool sequence;
int numatts; /* number of attributes */ int numatts; /* number of attributes */
int *inhAttrs; /* an array of flags, one for each attribute int *inhAttrs; /* an array of flags, one for each attribute
if the value is 1, then this attribute is if the value is 1, then this attribute is
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment