From b259e454e7d2d27c94c57951e4db65eba727a10f Mon Sep 17 00:00:00 2001 From: "Vadim B. Mikheev" <vadim4o@yahoo.com> Date: Wed, 2 Apr 1997 04:17:27 +0000 Subject: [PATCH] Dumping sequence relations as 'CREATE SEQUENCE ...'. --- src/bin/pg_dump/pg_dump.c | 107 +++++++++++++++++++++++++++++++++++--- src/bin/pg_dump/pg_dump.h | 3 +- 2 files changed, 103 insertions(+), 7 deletions(-) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 1e5f40162a9..afc64657f17 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.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 * @@ -61,6 +61,8 @@ #include "pg_dump.h" +static void dumpSequence (FILE* fout, TableInfo tbinfo); + extern char *optarg; extern int optind, opterr; @@ -71,6 +73,8 @@ FILE *g_fout; /* the script file */ PGconn *g_conn; /* the database connection */ int dumpData; /* dump data using proper insert strings */ int attrNames; /* put attr names into insert strings */ +int schemaOnly; +int dataOnly; char g_opaque_type[10]; /* name for the opaque type */ @@ -346,7 +350,23 @@ dumpClasses(const TableInfo tblinfo[], const int numTables, FILE *fout, if (isViewRule(tblinfo[i].relname)) 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) fprintf(stderr, "%s dumping out the contents of Table %s %s\n", g_comment_start, classname, g_comment_end); @@ -372,8 +392,6 @@ main(int argc, char** argv) const char* progname; const char* filename; const char* dbname; - int schemaOnly; - int dataOnly; const char *pghost = NULL; const char *pgport = NULL; const char *tablename; @@ -905,6 +923,7 @@ getTables(int *numTables) int i_oid; int i_relname; int i_relarch; + int i_relkind; /* find all the user-defined tables (no indices and no catalogs), ordering by oid is important so that we always process the parent @@ -921,8 +940,8 @@ getTables(int *numTables) PQclear(res); sprintf(query, - "SELECT oid, relname, relarch from pg_class " - "where relkind = 'r' and relname !~ '^pg_' " + "SELECT oid, relname, relarch, relkind from pg_class " + "where (relkind = 'r' or relkind = 'S') and relname !~ '^pg_' " "and relname !~ '^Xinv' order by oid;"); res = PQexec(g_conn, query); @@ -941,11 +960,13 @@ getTables(int *numTables) i_oid = PQfnumber(res,"oid"); i_relname = PQfnumber(res,"relname"); i_relarch = PQfnumber(res,"relarch"); + i_relkind = PQfnumber(res,"relkind"); for (i=0;i<ntups;i++) { tblinfo[i].oid = strdup(PQgetvalue(res,i,i_oid)); tblinfo[i].relname = strdup(PQgetvalue(res,i,i_relname)); tblinfo[i].relarch = strdup(PQgetvalue(res,i,i_relarch)); + tblinfo[i].sequence = (strcmp (PQgetvalue(res,i,i_relkind), "S") == 0); } PQclear(res); @@ -1041,6 +1062,9 @@ getTableAttrs(TableInfo* tblinfo, int numTables) /* skip archive tables */ if (isArchiveName(tblinfo[i].relname)) continue; + + if ( tblinfo[i].sequence ) + continue; /* find all the user attributes and their types*/ /* we must read the attribute names in attribute number order! */ @@ -1500,6 +1524,12 @@ void dumpTables(FILE* fout, TableInfo *tblinfo, int numTables, /* skip archive names*/ if (isArchiveName(tblinfo[i].relname)) continue; + + if ( tblinfo[i].sequence ) + { + dumpSequence (fout, tblinfo[i]); + continue; + } parentRels = tblinfo[i].parentRels; numParents = tblinfo[i].numParents; @@ -1814,3 +1844,68 @@ checkForQuote(const char* s) 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); + +} + diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 1a79b2475be..775c05612dd 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.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 * @@ -55,6 +55,7 @@ typedef struct _tableInfo { char *oid; char *relname; char *relarch; + bool sequence; int numatts; /* number of attributes */ int *inhAttrs; /* an array of flags, one for each attribute if the value is 1, then this attribute is -- GitLab