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