diff options
Diffstat (limited to 'src/bin/pg_dump/common.c')
-rw-r--r-- | src/bin/pg_dump/common.c | 589 |
1 files changed, 322 insertions, 267 deletions
diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c index 15729fe7b3a..c8d3c755b6f 100644 --- a/src/bin/pg_dump/common.c +++ b/src/bin/pg_dump/common.c @@ -1,19 +1,19 @@ /*------------------------------------------------------------------------- * * common.c-- - * common routines between pg_dump and pg4_dump + * common routines between pg_dump and pg4_dump * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.13 1997/08/19 21:36:25 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.14 1997/09/07 04:54:28 momjian Exp $ * * Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2 * - * - Fixed dumpTable output to output lengths for char and varchar types! - * - Added single. quote to twin single quote expansion for 'insert' string - * mode. + * - Fixed dumpTable output to output lengths for char and varchar types! + * - Added single. quote to twin single quote expansion for 'insert' string + * mode. * *------------------------------------------------------------------------- */ @@ -22,9 +22,9 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> -#include <sys/param.h> /* for MAXHOSTNAMELEN on most */ +#include <sys/param.h> /* for MAXHOSTNAMELEN on most */ #ifdef sparc_solaris -#include <netdb.h> /* for MAXHOSTNAMELEN on some */ +#include <netdb.h> /* for MAXHOSTNAMELEN on some */ #endif #include "postgres.h" @@ -35,391 +35,446 @@ #include "pg_dump.h" -static char** findParentsByOid(TableInfo* tbinfo, int numTables, - InhInfo* inhinfo, int numInherits, - const char *oid, - int *numParents); -static int findTableByOid(TableInfo *tbinfo, int numTables, const char *oid); -static void flagInhAttrs(TableInfo* tbinfo, int numTables, - InhInfo* inhinfo, int numInherits); -static int strInArray(const char* pattern, char** arr, int arr_size); +static char ** +findParentsByOid(TableInfo * tbinfo, int numTables, + InhInfo * inhinfo, int numInherits, + const char *oid, + int *numParents); +static int findTableByOid(TableInfo * tbinfo, int numTables, const char *oid); +static void +flagInhAttrs(TableInfo * tbinfo, int numTables, + InhInfo * inhinfo, int numInherits); +static int strInArray(const char *pattern, char **arr, int arr_size); /* - * findTypeByOid - * given an oid of a type, return its typename + * findTypeByOid + * given an oid of a type, return its typename * * if oid is "0", return "opaque" -- this is a special case * * NOTE: should hash this, but just do linear search for now */ -char* -findTypeByOid(TypeInfo* tinfo, int numTypes, const char* oid) +char * +findTypeByOid(TypeInfo * tinfo, int numTypes, const char *oid) { - int i; + int i; - if (strcmp(oid, "0") == 0) return g_opaque_type; + if (strcmp(oid, "0") == 0) + return g_opaque_type; - for (i=0;i<numTypes;i++) { - if (strcmp(tinfo[i].oid, oid) == 0) - return tinfo[i].typname; - } + for (i = 0; i < numTypes; i++) + { + if (strcmp(tinfo[i].oid, oid) == 0) + return tinfo[i].typname; + } - /* should never get here */ - fprintf(stderr,"failed sanity check, type with oid %s was not found\n", - oid); - exit(2); + /* should never get here */ + fprintf(stderr, "failed sanity check, type with oid %s was not found\n", + oid); + exit(2); } /* * findOprByOid - * given the oid of an operator, return the name of the operator + * given the oid of an operator, return the name of the operator * * * NOTE: should hash this, but just do linear search for now - * + * */ -char* -findOprByOid(OprInfo *oprinfo, int numOprs, const char *oid) +char * +findOprByOid(OprInfo * oprinfo, int numOprs, const char *oid) { - int i; - for (i=0;i<numOprs;i++) { - if (strcmp(oprinfo[i].oid, oid) == 0) - return oprinfo[i].oprname; - } - - /* should never get here */ - fprintf(stderr,"failed sanity check, opr with oid %s was not found\n", - oid); - exit(2); + int i; + + for (i = 0; i < numOprs; i++) + { + if (strcmp(oprinfo[i].oid, oid) == 0) + return oprinfo[i].oprname; + } + + /* should never get here */ + fprintf(stderr, "failed sanity check, opr with oid %s was not found\n", + oid); + exit(2); } /* * findParentsByOid -- - * given the oid of a class, return the names of its parent classes + * given the oid of a class, return the names of its parent classes * and assign the number of parents to the last argument. * * * returns NULL if none */ -static char** -findParentsByOid(TableInfo* tblinfo, int numTables, - InhInfo* inhinfo, int numInherits, const char *oid, - int *numParentsPtr) +static char ** +findParentsByOid(TableInfo * tblinfo, int numTables, + InhInfo * inhinfo, int numInherits, const char *oid, + int *numParentsPtr) { - int i,j; - int parentInd; - char** result; - int numParents; - - numParents = 0; - for (i=0;i<numInherits;i++) { - if ( strcmp(inhinfo[i].inhrel, oid) == 0) { - numParents++; + int i, + j; + int parentInd; + char **result; + int numParents; + + numParents = 0; + for (i = 0; i < numInherits; i++) + { + if (strcmp(inhinfo[i].inhrel, oid) == 0) + { + numParents++; + } } - } - - *numParentsPtr = numParents; - if (numParents > 0) { - result = (char**)malloc(sizeof(char*) * numParents); - j = 0; - for (i=0;i<numInherits;i++) { - if ( strcmp(inhinfo[i].inhrel, oid) == 0) { - parentInd = findTableByOid(tblinfo, numTables, - inhinfo[i].inhparent); - result[j++] = tblinfo[parentInd].relname; - } + *numParentsPtr = numParents; + + if (numParents > 0) + { + result = (char **) malloc(sizeof(char *) * numParents); + j = 0; + for (i = 0; i < numInherits; i++) + { + if (strcmp(inhinfo[i].inhrel, oid) == 0) + { + parentInd = findTableByOid(tblinfo, numTables, + inhinfo[i].inhparent); + result[j++] = tblinfo[parentInd].relname; + } + } + return result; } - return result; - } - else - return NULL; + else + return NULL; } /* * parseArgTypes - * parse a string of eight numbers delimited by spaces + * parse a string of eight numbers delimited by spaces * into a character array */ -void -parseArgTypes(char **argtypes, const char* str) +void +parseArgTypes(char **argtypes, const char *str) { - int j, argNum; - char temp[100]; - char s; - - argNum = 0; - j = 0; - while ( (s = *str) != '\0') { - if (s == ' ') { - temp[j] = '\0'; - argtypes[argNum] = strdup(temp); - argNum++; - j = 0; - } else { - temp[j] = s; - j++; + int j, + argNum; + char temp[100]; + char s; + + argNum = 0; + j = 0; + while ((s = *str) != '\0') + { + if (s == ' ') + { + temp[j] = '\0'; + argtypes[argNum] = strdup(temp); + argNum++; + j = 0; + } + else + { + temp[j] = s; + j++; + } + str++; + } + if (j != 0) + { + temp[j] = '\0'; + argtypes[argNum] = strdup(temp); } - str++; - } - if (j != 0) { - temp[j] = '\0'; - argtypes[argNum] = strdup(temp); - } - + } /* * strInArray: - * takes in a string and a string array and the number of elements in the - * string array. - * returns the index if the string is somewhere in the array, -1 otherwise + * takes in a string and a string array and the number of elements in the + * string array. + * returns the index if the string is somewhere in the array, -1 otherwise * */ -static int -strInArray(const char* pattern, char** arr, int arr_size) +static int +strInArray(const char *pattern, char **arr, int arr_size) { - int i; - for (i=0;i<arr_size;i++) { - if (strcmp(pattern, arr[i]) == 0) - return i; - } - return -1; + int i; + + for (i = 0; i < arr_size; i++) + { + if (strcmp(pattern, arr[i]) == 0) + return i; + } + return -1; } /* * dumpSchema: - * we have a valid connection, we are now going to dump the schema + * we have a valid connection, we are now going to dump the schema * into the file * */ -TableInfo * -dumpSchema(FILE *fout, - int *numTablesPtr, - const char *tablename, - const bool acls) +TableInfo * +dumpSchema(FILE * fout, + int *numTablesPtr, + const char *tablename, + const bool acls) { - int numTypes; - int numFuncs; - int numTables; - int numInherits; - int numAggregates; - int numOperators; - TypeInfo *tinfo=NULL; - FuncInfo *finfo=NULL; - AggInfo *agginfo=NULL; - TableInfo *tblinfo=NULL; - InhInfo *inhinfo=NULL; - OprInfo *oprinfo=NULL; - -if (g_verbose) fprintf(stderr,"%s reading user-defined types %s\n", - g_comment_start, g_comment_end); - tinfo = getTypes(&numTypes); - -if (g_verbose) fprintf(stderr,"%s reading user-defined functions %s\n", - g_comment_start, g_comment_end); - finfo = getFuncs(&numFuncs); - -if (g_verbose) fprintf(stderr,"%s reading user-defined aggregates %s\n", - g_comment_start, g_comment_end); - agginfo = getAggregates(&numAggregates); - -if (g_verbose) fprintf(stderr,"%s reading user-defined operators %s\n", - g_comment_start, g_comment_end); - oprinfo = getOperators(&numOperators); - -if (g_verbose) fprintf(stderr,"%s reading user-defined tables %s\n", - g_comment_start, g_comment_end); - tblinfo = getTables(&numTables); - -if (g_verbose) fprintf(stderr,"%s reading table inheritance information %s\n", - g_comment_start, g_comment_end); - inhinfo = getInherits(&numInherits); - -if (g_verbose) fprintf(stderr, "%s finding the attribute names and types for each table %s\n", - g_comment_start, g_comment_end); - getTableAttrs(tblinfo, numTables); - -if (g_verbose) fprintf(stderr, "%s flagging inherited attributes in subtables %s\n", - g_comment_start, g_comment_end); - flagInhAttrs(tblinfo, numTables, inhinfo, numInherits); - -if (!tablename && fout) { - if (g_verbose) fprintf(stderr,"%s dumping out user-defined types %s\n", - g_comment_start, g_comment_end); - dumpTypes(fout, finfo, numFuncs, tinfo, numTypes); -} - -if (fout) { - if (g_verbose) fprintf(stderr,"%s dumping out tables %s\n", - g_comment_start, g_comment_end); - dumpTables(fout, tblinfo, numTables, inhinfo, numInherits, - tinfo, numTypes, tablename, acls); -} - -if (!tablename && fout) { - if (g_verbose) fprintf(stderr,"%s dumping out user-defined functions %s\n", - g_comment_start, g_comment_end); - dumpFuncs(fout, finfo, numFuncs, tinfo, numTypes); -} + int numTypes; + int numFuncs; + int numTables; + int numInherits; + int numAggregates; + int numOperators; + TypeInfo *tinfo = NULL; + FuncInfo *finfo = NULL; + AggInfo *agginfo = NULL; + TableInfo *tblinfo = NULL; + InhInfo *inhinfo = NULL; + OprInfo *oprinfo = NULL; + + if (g_verbose) + fprintf(stderr, "%s reading user-defined types %s\n", + g_comment_start, g_comment_end); + tinfo = getTypes(&numTypes); + + if (g_verbose) + fprintf(stderr, "%s reading user-defined functions %s\n", + g_comment_start, g_comment_end); + finfo = getFuncs(&numFuncs); + + if (g_verbose) + fprintf(stderr, "%s reading user-defined aggregates %s\n", + g_comment_start, g_comment_end); + agginfo = getAggregates(&numAggregates); + + if (g_verbose) + fprintf(stderr, "%s reading user-defined operators %s\n", + g_comment_start, g_comment_end); + oprinfo = getOperators(&numOperators); + + if (g_verbose) + fprintf(stderr, "%s reading user-defined tables %s\n", + g_comment_start, g_comment_end); + tblinfo = getTables(&numTables); + + if (g_verbose) + fprintf(stderr, "%s reading table inheritance information %s\n", + g_comment_start, g_comment_end); + inhinfo = getInherits(&numInherits); + + if (g_verbose) + fprintf(stderr, "%s finding the attribute names and types for each table %s\n", + g_comment_start, g_comment_end); + getTableAttrs(tblinfo, numTables); + + if (g_verbose) + fprintf(stderr, "%s flagging inherited attributes in subtables %s\n", + g_comment_start, g_comment_end); + flagInhAttrs(tblinfo, numTables, inhinfo, numInherits); + + if (!tablename && fout) + { + if (g_verbose) + fprintf(stderr, "%s dumping out user-defined types %s\n", + g_comment_start, g_comment_end); + dumpTypes(fout, finfo, numFuncs, tinfo, numTypes); + } -if (!tablename && fout) { - if (g_verbose) fprintf(stderr,"%s dumping out user-defined functions %s\n", - g_comment_start, g_comment_end); - dumpAggs(fout, agginfo, numAggregates, tinfo, numTypes); -} + if (fout) + { + if (g_verbose) + fprintf(stderr, "%s dumping out tables %s\n", + g_comment_start, g_comment_end); + dumpTables(fout, tblinfo, numTables, inhinfo, numInherits, + tinfo, numTypes, tablename, acls); + } -if (!tablename && fout) { - if (g_verbose) fprintf(stderr,"%s dumping out user-defined operators %s\n", - g_comment_start, g_comment_end); - dumpOprs(fout, oprinfo, numOperators, tinfo, numTypes); -} + if (!tablename && fout) + { + if (g_verbose) + fprintf(stderr, "%s dumping out user-defined functions %s\n", + g_comment_start, g_comment_end); + dumpFuncs(fout, finfo, numFuncs, tinfo, numTypes); + } + + if (!tablename && fout) + { + if (g_verbose) + fprintf(stderr, "%s dumping out user-defined functions %s\n", + g_comment_start, g_comment_end); + dumpAggs(fout, agginfo, numAggregates, tinfo, numTypes); + } + + if (!tablename && fout) + { + if (g_verbose) + fprintf(stderr, "%s dumping out user-defined operators %s\n", + g_comment_start, g_comment_end); + dumpOprs(fout, oprinfo, numOperators, tinfo, numTypes); + } - *numTablesPtr = numTables; - clearAggInfo(agginfo,numAggregates); - clearOprInfo(oprinfo,numOperators); - clearTypeInfo(tinfo, numTypes); - clearFuncInfo(finfo,numFuncs); - clearInhInfo(inhinfo,numInherits); - return tblinfo; + *numTablesPtr = numTables; + clearAggInfo(agginfo, numAggregates); + clearOprInfo(oprinfo, numOperators); + clearTypeInfo(tinfo, numTypes); + clearFuncInfo(finfo, numFuncs); + clearInhInfo(inhinfo, numInherits); + return tblinfo; } /* * dumpSchemaIdx: - * dump indexes at the end for performance + * dump indexes at the end for performance * */ extern void -dumpSchemaIdx(FILE *fout, int *numTablesPtr, const char *tablename, - TableInfo* tblinfo, int numTables) +dumpSchemaIdx(FILE * fout, int *numTablesPtr, const char *tablename, + TableInfo * tblinfo, int numTables) { - int numIndices; - IndInfo *indinfo; - - if (g_verbose) fprintf(stderr,"%s reading indices information %s\n", - g_comment_start, g_comment_end); - indinfo = getIndices(&numIndices); - - if (fout) { - if (g_verbose) fprintf(stderr,"%s dumping out indices %s\n", - g_comment_start, g_comment_end); - dumpIndices(fout, indinfo, numIndices, tblinfo, numTables, tablename); - } - clearIndInfo(indinfo,numIndices); + int numIndices; + IndInfo *indinfo; + + if (g_verbose) + fprintf(stderr, "%s reading indices information %s\n", + g_comment_start, g_comment_end); + indinfo = getIndices(&numIndices); + + if (fout) + { + if (g_verbose) + fprintf(stderr, "%s dumping out indices %s\n", + g_comment_start, g_comment_end); + dumpIndices(fout, indinfo, numIndices, tblinfo, numTables, tablename); + } + clearIndInfo(indinfo, numIndices); } /* flagInhAttrs - - * for each table in tblinfo, flag its inherited attributes + * for each table in tblinfo, flag its inherited attributes * so when we dump the table out, we don't dump out the inherited attributes - * + * * initializes the parentRels field of each table * * modifies tblinfo * */ static void -flagInhAttrs(TableInfo* tblinfo, int numTables, - InhInfo* inhinfo, int numInherits) +flagInhAttrs(TableInfo * tblinfo, int numTables, + InhInfo * inhinfo, int numInherits) { - int i,j,k; - int parentInd; - - /* we go backwards because the tables in tblinfo are in OID - order, meaning the subtables are after the parent tables - we flag inherited attributes from child tables first */ - for (i = numTables-1; i >= 0; i--) { - tblinfo[i].parentRels = findParentsByOid(tblinfo, numTables, - inhinfo, numInherits, - tblinfo[i].oid, - &tblinfo[i].numParents); - for (k=0;k<tblinfo[i].numParents;k++) { - parentInd = findTableByName(tblinfo, numTables, - tblinfo[i].parentRels[k]); - for (j=0;j<tblinfo[i].numatts;j++) { - if (strInArray(tblinfo[i].attnames[j], - tblinfo[parentInd].attnames, - tblinfo[parentInd].numatts) != -1) { - tblinfo[i].inhAttrs[j] = 1; + int i, + j, + k; + int parentInd; + + /* + * we go backwards because the tables in tblinfo are in OID order, + * meaning the subtables are after the parent tables we flag inherited + * attributes from child tables first + */ + for (i = numTables - 1; i >= 0; i--) + { + tblinfo[i].parentRels = findParentsByOid(tblinfo, numTables, + inhinfo, numInherits, + tblinfo[i].oid, + &tblinfo[i].numParents); + for (k = 0; k < tblinfo[i].numParents; k++) + { + parentInd = findTableByName(tblinfo, numTables, + tblinfo[i].parentRels[k]); + for (j = 0; j < tblinfo[i].numatts; j++) + { + if (strInArray(tblinfo[i].attnames[j], + tblinfo[parentInd].attnames, + tblinfo[parentInd].numatts) != -1) + { + tblinfo[i].inhAttrs[j] = 1; + } + } } - } } - } } /* * findTableByName - * finds the index (in tblinfo) of the table with the given relname - * returns -1 if not found + * finds the index (in tblinfo) of the table with the given relname + * returns -1 if not found * * NOTE: should hash this, but just do linear search for now */ int -findTableByName(TableInfo* tblinfo, int numTables, const char* relname) +findTableByName(TableInfo * tblinfo, int numTables, const char *relname) { - int i; - for (i=0;i<numTables;i++) { - if (strcmp(tblinfo[i].relname, relname) == 0) - return i; - } - return -1; + int i; + + for (i = 0; i < numTables; i++) + { + if (strcmp(tblinfo[i].relname, relname) == 0) + return i; + } + return -1; } /* * findTableByOid - * finds the index (in tblinfo) of the table with the given oid - * returns -1 if not found + * finds the index (in tblinfo) of the table with the given oid + * returns -1 if not found * * NOTE: should hash this, but just do linear search for now */ static int -findTableByOid(TableInfo* tblinfo, int numTables, const char* oid) +findTableByOid(TableInfo * tblinfo, int numTables, const char *oid) { - int i; - for (i=0;i<numTables;i++) { - if (strcmp(tblinfo[i].oid, oid) == 0) - return i; - } - return -1; + int i; + + for (i = 0; i < numTables; i++) + { + if (strcmp(tblinfo[i].oid, oid) == 0) + return i; + } + return -1; } /* * findFuncByName - * finds the index (in finfo) of the function with the given name - * returns -1 if not found + * finds the index (in finfo) of the function with the given name + * returns -1 if not found * * NOTE: should hash this, but just do linear search for now */ int -findFuncByName(FuncInfo* finfo, int numFuncs, const char* name) +findFuncByName(FuncInfo * finfo, int numFuncs, const char *name) { - int i; - for (i=0;i<numFuncs;i++) { - if (strcmp(finfo[i].proname, name) == 0) - return i; - } - return -1; + int i; + + for (i = 0; i < numFuncs; i++) + { + if (strcmp(finfo[i].proname, name) == 0) + return i; + } + return -1; } /* * isArchiveName * - * returns true if the relation name is an archive name, false otherwise - */ + * returns true if the relation name is an archive name, false otherwise + */ int -isArchiveName(const char* relname) +isArchiveName(const char *relname) { - return (strlen(relname) > 1 && relname[1] == ','); + return (strlen(relname) > 1 && relname[1] == ','); } |