Ciao,
I had the need to exclude tables from the dump so I made this patch,
I do something like

pg_dump -X \"Test_*\" -X \"Devel*\" test

I'm not a C guru,  but it work, the only thing I was unable to get rid
of is the dump of sequences for that table,

so I have to add -X tablename_id_seq

If you can suggest a way to work around it, I will try to fix it

hope it can be useful to the project

bye

-- 
-------------------------------------------------------
Giuseppe Tanzilli               [EMAIL PROTECTED]
CSF Sistemi srl                 phone ++39 0775 7771
Via del Ciavattino
Anagni FR
Italy



diff -u pg_dump.orig/pg_dump.c pg_dump.exclude/pg_dump.c
--- pg_dump.orig/pg_dump.c      Thu Aug 16 20:36:43 2001
+++ pg_dump.exclude/pg_dump.c   Wed Aug 22 11:20:56 2001
@@ -145,6 +145,7 @@
 
 #include <unistd.h>                            /* for getopt() */
 #include <ctype.h>
+#include <fnmatch.h>
 
 #include "pg_backup.h"
 
@@ -204,6 +205,8 @@
 static PQExpBuffer getPKconstraint(TableInfo *tblInfo, IndInfo *indInfo);
 static const char *getAttrName(int attrnum, TableInfo *tblInfo);
 
+int isTableExcluded(const char *table);
+
 extern char *optarg;
 extern int     optind,
                        opterr;
@@ -228,6 +231,10 @@
 char           g_comment_start[10];
 char           g_comment_end[10];
 
+/* exclude table from dump by patterns */
+#define MAX_EXCLUDE_TABLE_PATTERNS     32
+char      *excludetable[MAX_EXCLUDE_TABLE_PATTERNS];
+
 
 typedef struct _dumpContext
 {
@@ -268,6 +275,7 @@
                 "  -S, --superuser=NAME     specify the superuser user name to use in 
plain\n"
                 "                           text format\n"
          "  -t, --table=TABLE        dump for this table only (* for all)\n"
+         "  -X, --exclude-table=TABLE        exclude  this table from dump (* 
+allowed)\n"
                 "  -u, --password           use password authentication\n"
                 "  -v, --verbose            verbose\n"
                 "  -x, --no-acl             do not dump ACL's (grant/revoke)\n"
@@ -297,6 +305,7 @@
                 "  -S NAME                  specify the superuser user name to use in 
plain\n"
                 "                           text format\n"
          "  -t TABLE                 dump for this table only (* for all)\n"
+         "  -X TABLE                exclude  this table from dump (* allowed)\n"
                 "  -u                       use password authentication\n"
                 "  -v                       verbose\n"
                 "  -x                       do not dump ACL's (grant/revoke)\n"
@@ -666,7 +675,7 @@
                if (tblinfo[i].sequence)/* already dumped */
                        continue;
 
-               if (!onlytable || (strcmp(classname, onlytable) == 0) || 
(strlen(onlytable) == 0))
+               if ( (! isTableExcluded(classname)) && (!onlytable || 
+(strcmp(classname, onlytable) == 0) || (strlen(onlytable) == 0)))
                {
                        if (g_verbose)
                                fprintf(stderr, "%s preparing to dump out the contents 
of Table '%s' %s\n",
@@ -750,6 +759,7 @@
                {"schema-only", no_argument, NULL, 's'},
                {"superuser", required_argument, NULL, 'S'},
                {"table", required_argument, NULL, 't'},
+               {"exclude-table", required_argument, NULL, 'X'},
                {"password", no_argument, NULL, 'u'},
                {"verbose", no_argument, NULL, 'v'},
                {"no-acl", no_argument, NULL, 'x'},
@@ -770,6 +780,13 @@
 
        dataOnly = schemaOnly = dumpData = attrNames = false;
 
+       
+       {
+               int i=0;        
+               for(i=0; i< MAX_EXCLUDE_TABLE_PATTERNS; i++)
+                       excludetable[i] = NULL;
+       }
+       
        if (!strrchr(argv[0], SEP_CHAR))
                progname = argv[0];
        else
@@ -797,9 +814,9 @@
        }
 
 #ifdef HAVE_GETOPT_LONG
-       while ((c = getopt_long(argc, argv, "abcCdDf:F:h:inNoOp:RsS:t:uvxzZ:V?", 
long_options, &optindex)) != -1)
+       while ((c = getopt_long(argc, argv, "abcCdDf:F:h:inNoOp:RsS:t:uvxzZ:X:V?", 
+long_options, &optindex)) != -1)
 #else
-       while ((c = getopt(argc, argv, "abcCdDf:F:h:inNoOp:RsS:t:uvxzZ:V?-")) != -1)
+       while ((c = getopt(argc, argv, "abcCdDf:F:h:inNoOp:RsS:t:uvxzZ:X:V?-")) != -1)
 #endif
 
        {
@@ -918,6 +935,45 @@
                                }
                                break;
 
+                       case 'X':                       /* Exclude this table from 
+dump*/
+                               {
+                                       int                     i;
+                                       char                    *s;
+
+                                       s = strdup(optarg);
+
+       printf("-- Exclude table:%s\n", s);
+                                       /*
+                                        * quoted string? Then strip quotes and 
+preserve
+                                        * case...
+                                        */
+                                       if (s[0] == '"')
+                                       {
+                                               strcpy(s, &s[1]);
+                                               if (*(s + strlen(s) - 1) == '"')
+                                                       *(s + strlen(s) - 1) = '\0';
+                                       }
+                                       /* otherwise, convert table name to 
+lowercase... */
+                                       else
+                                       {
+                                               for (i = 0; s[i]; i++)
+                                                       if (isupper((unsigned char) 
+s[i]))
+                                                               s[i] = 
+tolower((unsigned char) s[i]);
+
+                                       }
+                                       
+                                       // Save the exclude pattern to the exclude 
+array
+                                       i=0;
+                                       while(i < MAX_EXCLUDE_TABLE_PATTERNS) {
+                                               if (!excludetable[i]){
+                                                       excludetable[i] = s;
+                                                       break;
+                                               } else
+                                                       i++;
+                                       }               
+                               }
+                               break;
+
                        case 'u':
                                use_password = true;
                                break;
@@ -4057,8 +4113,8 @@
        {
                if (!(tblinfo[i].sequence))
                        continue;
-               if (!tablename || (!strcmp(tblinfo[i].relname, tablename))
-                       || (serialSeq && !strcmp(tblinfo[i].relname, serialSeq)))
+               if ((!isTableExcluded(tblinfo[i].relname)) && (!tablename || 
+(!strcmp(tblinfo[i].relname, tablename))
+                       || (serialSeq && !strcmp(tblinfo[i].relname, serialSeq))))
                {
                        /* becomeUser(fout, tblinfo[i].usename); */
                        dumpSequence(fout, tblinfo[i], schemaOnly, dataOnly);
@@ -4074,7 +4130,7 @@
                if (tblinfo[i].sequence)/* already dumped */
                        continue;
 
-               if (!tablename || (!strcmp(tblinfo[i].relname, tablename)) || 
(strlen(tablename) == 0))
+               if ( (!isTableExcluded(tblinfo[i].relname)) && (!tablename || 
+(!strcmp(tblinfo[i].relname, tablename)) || (strlen(tablename) == 0)))
                {
 
                        resetPQExpBuffer(delq);
@@ -4472,7 +4528,7 @@
                        }
                }
 
-               if (!tablename || (strcmp(indinfo[i].indrelname, tablename) == 0) || 
(strlen(tablename) == 0))
+               if ( (! isTableExcluded(indinfo[i].indrelname)) && (!tablename || 
+(strcmp(indinfo[i].indrelname, tablename) == 0) || (strlen(tablename) == 0)))
                {
                        resetPQExpBuffer(id1);
                        resetPQExpBuffer(id2);
@@ -4844,7 +4900,7 @@
 
        for (i = 0; i < numTables; i++)
        {
-               if (tablename && (strcmp(tblinfo[i].relname, tablename) != 0) && 
(strlen(tablename) > 0))
+               if ( isTableExcluded(tblinfo[i].relname) ||  (tablename && 
+(strcmp(tblinfo[i].relname, tablename) != 0) && (strlen(tablename) > 0)))
                        continue;
 
                for (j = 0; j < tblinfo[i].ntrig; j++)
@@ -4882,7 +4938,7 @@
         */
        for (t = 0; t < numTables; t++)
        {
-               if (tablename && (strcmp(tblinfo[t].relname, tablename) != 0) && 
(strlen(tablename) > 0))
+               if ( isTableExcluded(tblinfo[t].relname) ||  (tablename && 
+(strcmp(tblinfo[t].relname, tablename) != 0) && (strlen(tablename) > 0)))
                        continue;
 
                /*
@@ -4938,4 +4994,20 @@
 
                PQclear(res);
        }
+}
+
+int isTableExcluded(const char *table) {
+       int check=false;
+       int i=0;
+       
+       while (i < MAX_EXCLUDE_TABLE_PATTERNS && excludetable[i] ) {
+               if (! fnmatch(excludetable[i], table, FNM_PATHNAME)) {
+                       check=1;
+                       break;
+               }
+               i++;
+       }
+
+       return(check);
+
 }


---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly

Reply via email to