Modify pg_dump to use error-free memory allocation macros. This avoids
authorBruce Momjian <bruce@momjian.us>
Fri, 25 Nov 2011 20:40:51 +0000 (15:40 -0500)
committerBruce Momjian <bruce@momjian.us>
Fri, 25 Nov 2011 20:40:51 +0000 (15:40 -0500)
ignoring errors and call-site error checking.

18 files changed:
src/bin/pg_dump/Makefile
src/bin/pg_dump/common.c
src/bin/pg_dump/common.h [new file with mode: 0644]
src/bin/pg_dump/compress_io.c
src/bin/pg_dump/dumpcatalog.c [new file with mode: 0644]
src/bin/pg_dump/dumputils.c
src/bin/pg_dump/pg_backup_archiver.c
src/bin/pg_dump/pg_backup_custom.c
src/bin/pg_dump/pg_backup_db.c
src/bin/pg_dump/pg_backup_directory.c
src/bin/pg_dump/pg_backup_files.c
src/bin/pg_dump/pg_backup_null.c
src/bin/pg_dump/pg_backup_tar.c
src/bin/pg_dump/pg_dump.c
src/bin/pg_dump/pg_dump.h
src/bin/pg_dump/pg_dump_sort.c
src/bin/pg_dump/pg_dumpall.c
src/bin/pg_dump/pg_restore.c

index 8410af13783860d55de520eef92249e53c85acd8..9d13bec7933f104c026f2ffdcd376a5bcbd8455a 100644 (file)
@@ -20,7 +20,7 @@ override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
 
 OBJS=  pg_backup_archiver.o pg_backup_db.o pg_backup_custom.o \
    pg_backup_files.o pg_backup_null.o pg_backup_tar.o \
-   pg_backup_directory.o dumputils.o compress_io.o $(WIN32RES)
+   pg_backup_directory.o common.o dumputils.o compress_io.o $(WIN32RES)
 
 KEYWRDOBJS = keywords.o kwlookup.o
 
@@ -29,8 +29,8 @@ kwlookup.c: % : $(top_srcdir)/src/backend/parser/%
 
 all: pg_dump pg_restore pg_dumpall
 
-pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) $(KEYWRDOBJS) | submake-libpq submake-libpgport
-   $(CC) $(CFLAGS) pg_dump.o common.o pg_dump_sort.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+pg_dump: pg_dump.o dumpcatalog.o pg_dump_sort.o $(OBJS) $(KEYWRDOBJS) | submake-libpq submake-libpgport
+   $(CC) $(CFLAGS) pg_dump.o dumpcatalog.o pg_dump_sort.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
 
 pg_restore: pg_restore.o $(OBJS) $(KEYWRDOBJS) | submake-libpq submake-libpgport
    $(CC) $(CFLAGS) pg_restore.o $(KEYWRDOBJS) $(OBJS) $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
@@ -50,4 +50,4 @@ uninstall:
    rm -f $(addprefix '$(DESTDIR)$(bindir)'/, pg_dump$(X) pg_restore$(X) pg_dumpall$(X))
 
 clean distclean maintainer-clean:
-   rm -f pg_dump$(X) pg_restore$(X) pg_dumpall$(X) $(OBJS) pg_dump.o common.o pg_dump_sort.o pg_restore.o pg_dumpall.o kwlookup.c $(KEYWRDOBJS)
+   rm -f pg_dump$(X) pg_restore$(X) pg_dumpall$(X) $(OBJS) pg_dump.o dumpcatalog.o pg_dump_sort.o pg_restore.o pg_dumpall.o kwlookup.c $(KEYWRDOBJS)
index bd81a2c3db12e4fae45c9098197a2d939a5ca6e3..1a3f4cb6e8e3777902576e022251efeaf46a9edd 100644 (file)
@@ -1,10 +1,8 @@
 /*-------------------------------------------------------------------------
  *
  * common.c
- *   common routines between pg_dump and pg4_dump
- *
- * Since pg4_dump is long-dead code, there is no longer any useful distinction
- * between this file and pg_dump.c.
+ *   common routines between pg_dump and pg_restore (but not pg_dumpall
+ *   because there is no failure location to report).
  *
  * Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *-------------------------------------------------------------------------
  */
 #include "postgres_fe.h"
+#include "pg_backup.h"
+#include "common.h"
 
 #include <ctype.h>
 
-#include "catalog/pg_class.h"
-
-#include "pg_backup_archiver.h"
-
-
-/*
- * Variables for mapping DumpId to DumpableObject
- */
-static DumpableObject **dumpIdMap = NULL;
-static int allocedDumpIds = 0;
-static DumpId lastDumpId = 0;
-
-/*
- * Variables for mapping CatalogId to DumpableObject
- */
-static bool catalogIdMapValid = false;
-static DumpableObject **catalogIdMap = NULL;
-static int numCatalogIds = 0;
-
-/*
- * These variables are static to avoid the notational cruft of having to pass
- * them into findTableByOid() and friends. For each of these arrays, we
- * build a sorted-by-OID index array immediately after it's built, and then
- * we use binary search in findTableByOid() and friends.  (qsort'ing the base
- * arrays themselves would be simpler, but it doesn't work because pg_dump.c
- * may have already established pointers between items.)
- */
-static TableInfo *tblinfo;
-static TypeInfo *typinfo;
-static FuncInfo *funinfo;
-static OprInfo *oprinfo;
-static int numTables;
-static int numTypes;
-static int numFuncs;
-static int numOperators;
-static int numCollations;
-static DumpableObject **tblinfoindex;
-static DumpableObject **typinfoindex;
-static DumpableObject **funinfoindex;
-static DumpableObject **oprinfoindex;
-static DumpableObject **collinfoindex;
-
-
-static void flagInhTables(TableInfo *tbinfo, int numTables,
-             InhInfo *inhinfo, int numInherits);
-static void flagInhAttrs(TableInfo *tblinfo, int numTables);
-static DumpableObject **buildIndexArray(void *objArray, int numObjs,
-               Size objSize);
-static int DOCatalogIdCompare(const void *p1, const void *p2);
-static void findParentsByOid(TableInfo *self,
-                InhInfo *inhinfo, int numInherits);
-static int strInArray(const char *pattern, char **arr, int arr_size);
-
-
-/*
- * getSchemaData
- *   Collect information about all potentially dumpable objects
- */
-TableInfo *
-getSchemaData(int *numTablesPtr)
-{
-   ExtensionInfo *extinfo;
-   InhInfo    *inhinfo;
-   CollInfo   *collinfo;
-   int         numNamespaces;
-   int         numExtensions;
-   int         numAggregates;
-   int         numInherits;
-   int         numRules;
-   int         numProcLangs;
-   int         numCasts;
-   int         numOpclasses;
-   int         numOpfamilies;
-   int         numConversions;
-   int         numTSParsers;
-   int         numTSTemplates;
-   int         numTSDicts;
-   int         numTSConfigs;
-   int         numForeignDataWrappers;
-   int         numForeignServers;
-   int         numDefaultACLs;
-
-   if (g_verbose)
-       write_msg(NULL, "reading schemas\n");
-   getNamespaces(&numNamespaces);
-
-   /*
-    * getTables should be done as soon as possible, so as to minimize the
-    * window between starting our transaction and acquiring per-table locks.
-    * However, we have to do getNamespaces first because the tables get
-    * linked to their containing namespaces during getTables.
-    */
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined tables\n");
-   tblinfo = getTables(&numTables);
-   tblinfoindex = buildIndexArray(tblinfo, numTables, sizeof(TableInfo));
-
-   if (g_verbose)
-       write_msg(NULL, "reading extensions\n");
-   extinfo = getExtensions(&numExtensions);
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined functions\n");
-   funinfo = getFuncs(&numFuncs);
-   funinfoindex = buildIndexArray(funinfo, numFuncs, sizeof(FuncInfo));
-
-   /* this must be after getTables and getFuncs */
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined types\n");
-   typinfo = getTypes(&numTypes);
-   typinfoindex = buildIndexArray(typinfo, numTypes, sizeof(TypeInfo));
-
-   /* this must be after getFuncs, too */
-   if (g_verbose)
-       write_msg(NULL, "reading procedural languages\n");
-   getProcLangs(&numProcLangs);
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined aggregate functions\n");
-   getAggregates(&numAggregates);
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined operators\n");
-   oprinfo = getOperators(&numOperators);
-   oprinfoindex = buildIndexArray(oprinfo, numOperators, sizeof(OprInfo));
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined operator classes\n");
-   getOpclasses(&numOpclasses);
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined operator families\n");
-   getOpfamilies(&numOpfamilies);
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined text search parsers\n");
-   getTSParsers(&numTSParsers);
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined text search templates\n");
-   getTSTemplates(&numTSTemplates);
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined text search dictionaries\n");
-   getTSDictionaries(&numTSDicts);
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined text search configurations\n");
-   getTSConfigurations(&numTSConfigs);
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined foreign-data wrappers\n");
-   getForeignDataWrappers(&numForeignDataWrappers);
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined foreign servers\n");
-   getForeignServers(&numForeignServers);
-
-   if (g_verbose)
-       write_msg(NULL, "reading default privileges\n");
-   getDefaultACLs(&numDefaultACLs);
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined collations\n");
-   collinfo = getCollations(&numCollations);
-   collinfoindex = buildIndexArray(collinfo, numCollations, sizeof(CollInfo));
-
-   if (g_verbose)
-       write_msg(NULL, "reading user-defined conversions\n");
-   getConversions(&numConversions);
-
-   if (g_verbose)
-       write_msg(NULL, "reading type casts\n");
-   getCasts(&numCasts);
-
-   if (g_verbose)
-       write_msg(NULL, "reading table inheritance information\n");
-   inhinfo = getInherits(&numInherits);
-
-   if (g_verbose)
-       write_msg(NULL, "reading rewrite rules\n");
-   getRules(&numRules);
-
-   /*
-    * Identify extension member objects and mark them as not to be dumped.
-    * This must happen after reading all objects that can be direct members
-    * of extensions, but before we begin to process table subsidiary objects.
-    */
-   if (g_verbose)
-       write_msg(NULL, "finding extension members\n");
-   getExtensionMembership(extinfo, numExtensions);
-
-   /* Link tables to parents, mark parents of target tables interesting */
-   if (g_verbose)
-       write_msg(NULL, "finding inheritance relationships\n");
-   flagInhTables(tblinfo, numTables, inhinfo, numInherits);
-
-   if (g_verbose)
-       write_msg(NULL, "reading column info for interesting tables\n");
-   getTableAttrs(tblinfo, numTables);
-
-   if (g_verbose)
-       write_msg(NULL, "flagging inherited columns in subtables\n");
-   flagInhAttrs(tblinfo, numTables);
-
-   if (g_verbose)
-       write_msg(NULL, "reading indexes\n");
-   getIndexes(tblinfo, numTables);
-
-   if (g_verbose)
-       write_msg(NULL, "reading constraints\n");
-   getConstraints(tblinfo, numTables);
-
-   if (g_verbose)
-       write_msg(NULL, "reading triggers\n");
-   getTriggers(tblinfo, numTables);
-
-   *numTablesPtr = numTables;
-   return tblinfo;
-}
-
-/* flagInhTables -
- *  Fill in parent link fields of every target table, and mark
- *  parents of target tables as interesting
- *
- * Note that only direct ancestors of targets are marked interesting.
- * This is sufficient; we don't much care whether they inherited their
- * attributes or not.
- *
- * modifies tblinfo
- */
-static void
-flagInhTables(TableInfo *tblinfo, int numTables,
-             InhInfo *inhinfo, int numInherits)
-{
-   int         i,
-               j;
-   int         numParents;
-   TableInfo **parents;
-
-   for (i = 0; i < numTables; i++)
-   {
-       /* Sequences and views never have parents */
-       if (tblinfo[i].relkind == RELKIND_SEQUENCE ||
-           tblinfo[i].relkind == RELKIND_VIEW)
-           continue;
-
-       /* Don't bother computing anything for non-target tables, either */
-       if (!tblinfo[i].dobj.dump)
-           continue;
-
-       /* Find all the immediate parent tables */
-       findParentsByOid(&tblinfo[i], inhinfo, numInherits);
-
-       /* Mark the parents as interesting for getTableAttrs */
-       numParents = tblinfo[i].numParents;
-       parents = tblinfo[i].parents;
-       for (j = 0; j < numParents; j++)
-           parents[j]->interesting = true;
-   }
-}
-
-/* flagInhAttrs -
- *  for each dumpable table in tblinfo, flag its inherited attributes
- * so when we dump the table out, we don't dump out the inherited attributes
- *
- * modifies tblinfo
- */
-static void
-flagInhAttrs(TableInfo *tblinfo, int numTables)
-{
-   int         i,
-               j,
-               k;
-
-   for (i = 0; i < numTables; i++)
-   {
-       TableInfo  *tbinfo = &(tblinfo[i]);
-       int         numParents;
-       TableInfo **parents;
-       TableInfo  *parent;
-
-       /* Sequences and views never have parents */
-       if (tbinfo->relkind == RELKIND_SEQUENCE ||
-           tbinfo->relkind == RELKIND_VIEW)
-           continue;
-
-       /* Don't bother computing anything for non-target tables, either */
-       if (!tbinfo->dobj.dump)
-           continue;
-
-       numParents = tbinfo->numParents;
-       parents = tbinfo->parents;
-
-       if (numParents == 0)
-           continue;           /* nothing to see here, move along */
-
-       /*----------------------------------------------------------------
-        * For each attr, check the parent info: if no parent has an attr
-        * with the same name, then it's not inherited. If there *is* an
-        * attr with the same name, then only dump it if:
-        *
-        * - it is NOT NULL and zero parents are NOT NULL
-        *   OR
-        * - it has a default value AND the default value does not match
-        *   all parent default values, or no parents specify a default.
-        *
-        * See discussion on -hackers around 2-Apr-2001.
-        *----------------------------------------------------------------
-        */
-       for (j = 0; j < tbinfo->numatts; j++)
-       {
-           bool        foundAttr;      /* Attr was found in a parent */
-           bool        foundNotNull;   /* Attr was NOT NULL in a parent */
-           bool        defaultsMatch;  /* All non-empty defaults match */
-           bool        defaultsFound;  /* Found a default in a parent */
-           AttrDefInfo *attrDef;
-
-           foundAttr = false;
-           foundNotNull = false;
-           defaultsMatch = true;
-           defaultsFound = false;
-
-           attrDef = tbinfo->attrdefs[j];
-
-           for (k = 0; k < numParents; k++)
-           {
-               int         inhAttrInd;
-
-               parent = parents[k];
-               inhAttrInd = strInArray(tbinfo->attnames[j],
-                                       parent->attnames,
-                                       parent->numatts);
-
-               if (inhAttrInd != -1)
-               {
-                   AttrDefInfo *inhDef = parent->attrdefs[inhAttrInd];
-
-                   foundAttr = true;
-                   foundNotNull |= parent->notnull[inhAttrInd];
-                   if (inhDef != NULL)
-                   {
-                       defaultsFound = true;
-
-                       /*
-                        * If any parent has a default and the child doesn't,
-                        * we have to emit an explicit DEFAULT NULL clause for
-                        * the child, else the parent's default will win.
-                        */
-                       if (attrDef == NULL)
-                       {
-                           attrDef = (AttrDefInfo *) malloc(sizeof(AttrDefInfo));
-                           attrDef->dobj.objType = DO_ATTRDEF;
-                           attrDef->dobj.catId.tableoid = 0;
-                           attrDef->dobj.catId.oid = 0;
-                           AssignDumpId(&attrDef->dobj);
-                           attrDef->adtable = tbinfo;
-                           attrDef->adnum = j + 1;
-                           attrDef->adef_expr = strdup("NULL");
-
-                           attrDef->dobj.name = strdup(tbinfo->dobj.name);
-                           attrDef->dobj.namespace = tbinfo->dobj.namespace;
-
-                           attrDef->dobj.dump = tbinfo->dobj.dump;
-
-                           attrDef->separate = false;
-                           addObjectDependency(&tbinfo->dobj,
-                                               attrDef->dobj.dumpId);
-
-                           tbinfo->attrdefs[j] = attrDef;
-                       }
-                       if (strcmp(attrDef->adef_expr, inhDef->adef_expr) != 0)
-                       {
-                           defaultsMatch = false;
-
-                           /*
-                            * Whenever there is a non-matching parent
-                            * default, add a dependency to force the parent
-                            * default to be dumped first, in case the
-                            * defaults end up being dumped as separate
-                            * commands.  Otherwise the parent default will
-                            * override the child's when it is applied.
-                            */
-                           addObjectDependency(&attrDef->dobj,
-                                               inhDef->dobj.dumpId);
-                       }
-                   }
-               }
-           }
-
-           /*
-            * Based on the scan of the parents, decide if we can rely on the
-            * inherited attr
-            */
-           if (foundAttr)      /* Attr was inherited */
-           {
-               /* Set inherited flag by default */
-               tbinfo->inhAttrs[j] = true;
-               tbinfo->inhAttrDef[j] = true;
-               tbinfo->inhNotNull[j] = true;
-
-               /*
-                * Clear it if attr had a default, but parents did not, or
-                * mismatch
-                */
-               if ((attrDef != NULL) && (!defaultsFound || !defaultsMatch))
-               {
-                   tbinfo->inhAttrs[j] = false;
-                   tbinfo->inhAttrDef[j] = false;
-               }
-
-               /*
-                * Clear it if NOT NULL and none of the parents were NOT NULL
-                */
-               if (tbinfo->notnull[j] && !foundNotNull)
-               {
-                   tbinfo->inhAttrs[j] = false;
-                   tbinfo->inhNotNull[j] = false;
-               }
-
-               /* Clear it if attr has local definition */
-               if (tbinfo->attislocal[j])
-                   tbinfo->inhAttrs[j] = false;
-           }
-       }
-   }
-}
-
-/*
- * AssignDumpId
- *     Given a newly-created dumpable object, assign a dump ID,
- *     and enter the object into the lookup table.
- *
- * The caller is expected to have filled in objType and catId,
- * but not any of the other standard fields of a DumpableObject.
- */
-void
-AssignDumpId(DumpableObject *dobj)
-{
-   dobj->dumpId = ++lastDumpId;
-   dobj->name = NULL;          /* must be set later */
-   dobj->namespace = NULL;     /* may be set later */
-   dobj->dump = true;          /* default assumption */
-   dobj->ext_member = false;   /* default assumption */
-   dobj->dependencies = NULL;
-   dobj->nDeps = 0;
-   dobj->allocDeps = 0;
-
-   while (dobj->dumpId >= allocedDumpIds)
-   {
-       int         newAlloc;
-
-       if (allocedDumpIds <= 0)
-       {
-           newAlloc = 256;
-           dumpIdMap = (DumpableObject **)
-               pg_malloc(newAlloc * sizeof(DumpableObject *));
-       }
-       else
-       {
-           newAlloc = allocedDumpIds * 2;
-           dumpIdMap = (DumpableObject **)
-               pg_realloc(dumpIdMap, newAlloc * sizeof(DumpableObject *));
-       }
-       memset(dumpIdMap + allocedDumpIds, 0,
-              (newAlloc - allocedDumpIds) * sizeof(DumpableObject *));
-       allocedDumpIds = newAlloc;
-   }
-   dumpIdMap[dobj->dumpId] = dobj;
-
-   /* mark catalogIdMap invalid, but don't rebuild it yet */
-   catalogIdMapValid = false;
-}
-
-/*
- * Assign a DumpId that's not tied to a DumpableObject.
- *
- * This is used when creating a "fixed" ArchiveEntry that doesn't need to
- * participate in the sorting logic.
- */
-DumpId
-createDumpId(void)
-{
-   return ++lastDumpId;
-}
-
-/*
- * Return the largest DumpId so far assigned
- */
-DumpId
-getMaxDumpId(void)
-{
-   return lastDumpId;
-}
-
-/*
- * Find a DumpableObject by dump ID
- *
- * Returns NULL for invalid ID
- */
-DumpableObject *
-findObjectByDumpId(DumpId dumpId)
-{
-   if (dumpId <= 0 || dumpId >= allocedDumpIds)
-       return NULL;            /* out of range? */
-   return dumpIdMap[dumpId];
-}
-
-/*
- * Find a DumpableObject by catalog ID
- *
- * Returns NULL for unknown ID
- *
- * We use binary search in a sorted list that is built on first call.
- * If AssignDumpId() and findObjectByCatalogId() calls were freely intermixed,
- * the code would work, but possibly be very slow. In the current usage
- * pattern that does not happen, indeed we build the list at most twice.
- */
-DumpableObject *
-findObjectByCatalogId(CatalogId catalogId)
-{
-   DumpableObject **low;
-   DumpableObject **high;
-
-   if (!catalogIdMapValid)
-   {
-       if (catalogIdMap)
-           free(catalogIdMap);
-       getDumpableObjects(&catalogIdMap, &numCatalogIds);
-       if (numCatalogIds > 1)
-           qsort((void *) catalogIdMap, numCatalogIds,
-                 sizeof(DumpableObject *), DOCatalogIdCompare);
-       catalogIdMapValid = true;
-   }
-
-   /*
-    * We could use bsearch() here, but the notational cruft of calling
-    * bsearch is nearly as bad as doing it ourselves; and the generalized
-    * bsearch function is noticeably slower as well.
-    */
-   if (numCatalogIds <= 0)
-       return NULL;
-   low = catalogIdMap;
-   high = catalogIdMap + (numCatalogIds - 1);
-   while (low <= high)
-   {
-       DumpableObject **middle;
-       int         difference;
-
-       middle = low + (high - low) / 2;
-       /* comparison must match DOCatalogIdCompare, below */
-       difference = oidcmp((*middle)->catId.oid, catalogId.oid);
-       if (difference == 0)
-           difference = oidcmp((*middle)->catId.tableoid, catalogId.tableoid);
-       if (difference == 0)
-           return *middle;
-       else if (difference < 0)
-           low = middle + 1;
-       else
-           high = middle - 1;
-   }
-   return NULL;
-}
-
-/*
- * Find a DumpableObject by OID, in a pre-sorted array of one type of object
- *
- * Returns NULL for unknown OID
- */
-static DumpableObject *
-findObjectByOid(Oid oid, DumpableObject **indexArray, int numObjs)
-{
-   DumpableObject **low;
-   DumpableObject **high;
-
-   /*
-    * This is the same as findObjectByCatalogId except we assume we need not
-    * look at table OID because the objects are all the same type.
-    *
-    * We could use bsearch() here, but the notational cruft of calling
-    * bsearch is nearly as bad as doing it ourselves; and the generalized
-    * bsearch function is noticeably slower as well.
-    */
-   if (numObjs <= 0)
-       return NULL;
-   low = indexArray;
-   high = indexArray + (numObjs - 1);
-   while (low <= high)
-   {
-       DumpableObject **middle;
-       int         difference;
-
-       middle = low + (high - low) / 2;
-       difference = oidcmp((*middle)->catId.oid, oid);
-       if (difference == 0)
-           return *middle;
-       else if (difference < 0)
-           low = middle + 1;
-       else
-           high = middle - 1;
-   }
-   return NULL;
-}
-
-/*
- * Build an index array of DumpableObject pointers, sorted by OID
- */
-static DumpableObject **
-buildIndexArray(void *objArray, int numObjs, Size objSize)
-{
-   DumpableObject **ptrs;
-   int         i;
-
-   ptrs = (DumpableObject **) malloc(numObjs * sizeof(DumpableObject *));
-   for (i = 0; i < numObjs; i++)
-       ptrs[i] = (DumpableObject *) ((char *) objArray + i * objSize);
-
-   /* We can use DOCatalogIdCompare to sort since its first key is OID */
-   if (numObjs > 1)
-       qsort((void *) ptrs, numObjs, sizeof(DumpableObject *),
-             DOCatalogIdCompare);
-
-   return ptrs;
-}
-
-/*
- * qsort comparator for pointers to DumpableObjects
- */
-static int
-DOCatalogIdCompare(const void *p1, const void *p2)
-{
-   const DumpableObject *obj1 = *(DumpableObject * const *) p1;
-   const DumpableObject *obj2 = *(DumpableObject * const *) p2;
-   int         cmpval;
-
-   /*
-    * Compare OID first since it's usually unique, whereas there will only be
-    * a few distinct values of tableoid.
-    */
-   cmpval = oidcmp(obj1->catId.oid, obj2->catId.oid);
-   if (cmpval == 0)
-       cmpval = oidcmp(obj1->catId.tableoid, obj2->catId.tableoid);
-   return cmpval;
-}
-
-/*
- * Build an array of pointers to all known dumpable objects
- *
- * This simply creates a modifiable copy of the internal map.
- */
-void
-getDumpableObjects(DumpableObject ***objs, int *numObjs)
-{
-   int         i,
-               j;
-
-   *objs = (DumpableObject **)
-       pg_malloc(allocedDumpIds * sizeof(DumpableObject *));
-   j = 0;
-   for (i = 1; i < allocedDumpIds; i++)
-   {
-       if (dumpIdMap[i])
-           (*objs)[j++] = dumpIdMap[i];
-   }
-   *numObjs = j;
-}
-
-/*
- * Add a dependency link to a DumpableObject
- *
- * Note: duplicate dependencies are currently not eliminated
- */
-void
-addObjectDependency(DumpableObject *dobj, DumpId refId)
-{
-   if (dobj->nDeps >= dobj->allocDeps)
-   {
-       if (dobj->allocDeps <= 0)
-       {
-           dobj->allocDeps = 16;
-           dobj->dependencies = (DumpId *)
-               pg_malloc(dobj->allocDeps * sizeof(DumpId));
-       }
-       else
-       {
-           dobj->allocDeps *= 2;
-           dobj->dependencies = (DumpId *)
-               pg_realloc(dobj->dependencies,
-                          dobj->allocDeps * sizeof(DumpId));
-       }
-   }
-   dobj->dependencies[dobj->nDeps++] = refId;
-}
-
-/*
- * Remove a dependency link from a DumpableObject
- *
- * If there are multiple links, all are removed
- */
-void
-removeObjectDependency(DumpableObject *dobj, DumpId refId)
-{
-   int         i;
-   int         j = 0;
-
-   for (i = 0; i < dobj->nDeps; i++)
-   {
-       if (dobj->dependencies[i] != refId)
-           dobj->dependencies[j++] = dobj->dependencies[i];
-   }
-   dobj->nDeps = j;
-}
-
-
-/*
- * findTableByOid
- *   finds the entry (in tblinfo) of the table with the given oid
- *   returns NULL if not found
- */
-TableInfo *
-findTableByOid(Oid oid)
-{
-   return (TableInfo *) findObjectByOid(oid, tblinfoindex, numTables);
-}
-
-/*
- * findTypeByOid
- *   finds the entry (in typinfo) of the type with the given oid
- *   returns NULL if not found
- */
-TypeInfo *
-findTypeByOid(Oid oid)
-{
-   return (TypeInfo *) findObjectByOid(oid, typinfoindex, numTypes);
-}
-
-/*
- * findFuncByOid
- *   finds the entry (in funinfo) of the function with the given oid
- *   returns NULL if not found
- */
-FuncInfo *
-findFuncByOid(Oid oid)
-{
-   return (FuncInfo *) findObjectByOid(oid, funinfoindex, numFuncs);
-}
-
-/*
- * findOprByOid
- *   finds the entry (in oprinfo) of the operator with the given oid
- *   returns NULL if not found
- */
-OprInfo *
-findOprByOid(Oid oid)
-{
-   return (OprInfo *) findObjectByOid(oid, oprinfoindex, numOperators);
-}
-
-/*
- * findCollationByOid
- *   finds the entry (in collinfo) of the collation with the given oid
- *   returns NULL if not found
- */
-CollInfo *
-findCollationByOid(Oid oid)
-{
-   return (CollInfo *) findObjectByOid(oid, collinfoindex, numCollations);
-}
-
-
-/*
- * findParentsByOid
- *   find a table's parents in tblinfo[]
- */
-static void
-findParentsByOid(TableInfo *self,
-                InhInfo *inhinfo, int numInherits)
-{
-   Oid         oid = self->dobj.catId.oid;
-   int         i,
-               j;
-   int         numParents;
-
-   numParents = 0;
-   for (i = 0; i < numInherits; i++)
-   {
-       if (inhinfo[i].inhrelid == oid)
-           numParents++;
-   }
-
-   self->numParents = numParents;
-
-   if (numParents > 0)
-   {
-       self->parents = (TableInfo **)
-           pg_malloc(sizeof(TableInfo *) * numParents);
-       j = 0;
-       for (i = 0; i < numInherits; i++)
-       {
-           if (inhinfo[i].inhrelid == oid)
-           {
-               TableInfo  *parent;
-
-               parent = findTableByOid(inhinfo[i].inhparent);
-               if (parent == NULL)
-               {
-                   write_msg(NULL, "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found\n",
-                             inhinfo[i].inhparent,
-                             self->dobj.name,
-                             oid);
-                   exit_nicely();
-               }
-               self->parents[j++] = parent;
-           }
-       }
-   }
-   else
-       self->parents = NULL;
-}
-
-/*
- * parseOidArray
- *   parse a string of numbers delimited by spaces into a character array
- *
- * Note: actually this is used for both Oids and potentially-signed
- * attribute numbers.  This should cause no trouble, but we could split
- * the function into two functions with different argument types if it does.
- */
-
-void
-parseOidArray(const char *str, Oid *array, int arraysize)
-{
-   int         j,
-               argNum;
-   char        temp[100];
-   char        s;
-
-   argNum = 0;
-   j = 0;
-   for (;;)
-   {
-       s = *str++;
-       if (s == ' ' || s == '\0')
-       {
-           if (j > 0)
-           {
-               if (argNum >= arraysize)
-               {
-                   write_msg(NULL, "could not parse numeric array \"%s\": too many numbers\n", str);
-                   exit_nicely();
-               }
-               temp[j] = '\0';
-               array[argNum++] = atooid(temp);
-               j = 0;
-           }
-           if (s == '\0')
-               break;
-       }
-       else
-       {
-           if (!(isdigit((unsigned char) s) || s == '-') ||
-               j >= sizeof(temp) - 1)
-           {
-               write_msg(NULL, "could not parse numeric array \"%s\": invalid character in number\n", str);
-               exit_nicely();
-           }
-           temp[j++] = s;
-       }
-   }
-
-   while (argNum < arraysize)
-       array[argNum++] = InvalidOid;
-}
-
-
-/*
- * 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
- */
-
-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;
-}
-
-
-/*
- * Support for simple list operations
- */
-
-void
-simple_oid_list_append(SimpleOidList *list, Oid val)
-{
-   SimpleOidListCell *cell;
-
-   cell = (SimpleOidListCell *) pg_malloc(sizeof(SimpleOidListCell));
-   cell->next = NULL;
-   cell->val = val;
-
-   if (list->tail)
-       list->tail->next = cell;
-   else
-       list->head = cell;
-   list->tail = cell;
-}
-
-void
-simple_string_list_append(SimpleStringList *list, const char *val)
-{
-   SimpleStringListCell *cell;
-
-   /* this calculation correctly accounts for the null trailing byte */
-   cell = (SimpleStringListCell *)
-       pg_malloc(sizeof(SimpleStringListCell) + strlen(val));
-   cell->next = NULL;
-   strcpy(cell->val, val);
-
-   if (list->tail)
-       list->tail->next = cell;
-   else
-       list->head = cell;
-   list->tail = cell;
-}
-
-bool
-simple_oid_list_member(SimpleOidList *list, Oid val)
-{
-   SimpleOidListCell *cell;
-
-   for (cell = list->head; cell; cell = cell->next)
-   {
-       if (cell->val == val)
-           return true;
-   }
-   return false;
-}
-
-bool
-simple_string_list_member(SimpleStringList *list, const char *val)
-{
-   SimpleStringListCell *cell;
-
-   for (cell = list->head; cell; cell = cell->next)
-   {
-       if (strcmp(cell->val, val) == 0)
-           return true;
-   }
-   return false;
-}
-
-
 /*
  * Safer versions of some standard C library functions. If an
  * out-of-memory condition occurs, these functions will bail out
  * safely; therefore, their return value is guaranteed to be non-NULL.
- *
- * XXX need to refactor things so that these can be in a file that can be
- * shared by pg_dumpall and pg_restore as well as pg_dump.
+ * We also report the program name and close the database connection.
  */
 
 char *
@@ -1020,7 +57,7 @@ pg_calloc(size_t nmemb, size_t size)
 
    tmp = calloc(nmemb, size);
    if (!tmp)
-       exit_horribly(NULL, NULL, "out of memory\n");
+       exit_horribly(NULL, NULL, _("out of memory\n"));
    return tmp;
 }
 
@@ -1031,6 +68,6 @@ pg_realloc(void *ptr, size_t size)
 
    tmp = realloc(ptr, size);
    if (!tmp)
-       exit_horribly(NULL, NULL, "out of memory\n");
+       exit_horribly(NULL, NULL, _("out of memory\n"));
    return tmp;
 }
diff --git a/src/bin/pg_dump/common.h b/src/bin/pg_dump/common.h
new file mode 100644 (file)
index 0000000..742d9f6
--- /dev/null
@@ -0,0 +1,24 @@
+/*-------------------------------------------------------------------------
+ *
+ * common.h
+ *   Common header file for the pg_dump, pg_dumpall, and pg_restore
+ *
+ * Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * src/bin/pg_dump/common.h
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef COMMON_H
+#define COMMON_H
+
+#include "postgres_fe.h"
+
+extern char *pg_strdup(const char *string);
+extern void *pg_malloc(size_t size);
+extern void *pg_calloc(size_t nmemb, size_t size);
+extern void *pg_realloc(void *ptr, size_t size);
+
+#endif   /* COMMON_H */
index 8540a75d1135d2ee00138dc4301c3e34dd6fa9cd..8375762ff5aca0adddf87a791eb584eea389a153 100644 (file)
@@ -53,6 +53,7 @@
  */
 
 #include "compress_io.h"
+#include "common.h"
 
 /*----------------------
  * Compressor API
@@ -135,9 +136,7 @@ AllocateCompressor(int compression, WriteFunc writeF)
        die_horribly(NULL, modulename, "not built with zlib support\n");
 #endif
 
-   cs = (CompressorState *) calloc(1, sizeof(CompressorState));
-   if (cs == NULL)
-       die_horribly(NULL, modulename, "out of memory\n");
+   cs = (CompressorState *) pg_calloc(1, sizeof(CompressorState));
    cs->writeF = writeF;
    cs->comprAlg = alg;
 
@@ -221,9 +220,7 @@ InitCompressorZlib(CompressorState *cs, int level)
 {
    z_streamp   zp;
 
-   zp = cs->zp = (z_streamp) malloc(sizeof(z_stream));
-   if (cs->zp == NULL)
-       die_horribly(NULL, modulename, "out of memory\n");
+   zp = cs->zp = (z_streamp) pg_malloc(sizeof(z_stream));
    zp->zalloc = Z_NULL;
    zp->zfree = Z_NULL;
    zp->opaque = Z_NULL;
@@ -233,12 +230,9 @@ InitCompressorZlib(CompressorState *cs, int level)
     * actually allocate one extra byte because some routines want to append a
     * trailing zero byte to the zlib output.
     */
-   cs->zlibOut = (char *) malloc(ZLIB_OUT_SIZE + 1);
+   cs->zlibOut = (char *) pg_malloc(ZLIB_OUT_SIZE + 1);
    cs->zlibOutSize = ZLIB_OUT_SIZE;
 
-   if (cs->zlibOut == NULL)
-       die_horribly(NULL, modulename, "out of memory\n");
-
    if (deflateInit(zp, level) != Z_OK)
        die_horribly(NULL, modulename,
                     "could not initialize compression library: %s\n",
@@ -338,21 +332,15 @@ ReadDataFromArchiveZlib(ArchiveHandle *AH, ReadFunc readF)
    char       *buf;
    size_t      buflen;
 
-   zp = (z_streamp) malloc(sizeof(z_stream));
-   if (zp == NULL)
-       die_horribly(NULL, modulename, "out of memory\n");
+   zp = (z_streamp) pg_malloc(sizeof(z_stream));
    zp->zalloc = Z_NULL;
    zp->zfree = Z_NULL;
    zp->opaque = Z_NULL;
 
-   buf = malloc(ZLIB_IN_SIZE);
-   if (buf == NULL)
-       die_horribly(NULL, modulename, "out of memory\n");
+   buf = pg_malloc(ZLIB_IN_SIZE);
    buflen = ZLIB_IN_SIZE;
 
-   out = malloc(ZLIB_OUT_SIZE + 1);
-   if (out == NULL)
-       die_horribly(NULL, modulename, "out of memory\n");
+   out = pg_malloc(ZLIB_OUT_SIZE + 1);
 
    if (inflateInit(zp) != Z_OK)
        die_horribly(NULL, modulename,
@@ -417,9 +405,7 @@ ReadDataFromArchiveNone(ArchiveHandle *AH, ReadFunc readF)
    char       *buf;
    size_t      buflen;
 
-   buf = malloc(ZLIB_OUT_SIZE);
-   if (buf == NULL)
-       die_horribly(NULL, modulename, "out of memory\n");
+   buf = pg_malloc(ZLIB_OUT_SIZE);
    buflen = ZLIB_OUT_SIZE;
 
    while ((cnt = readF(AH, &buf, &buflen)))
@@ -491,10 +477,7 @@ cfopen_read(const char *path, const char *mode)
        if (fp == NULL)
        {
            int         fnamelen = strlen(path) + 4;
-           char       *fname = malloc(fnamelen);
-
-           if (fname == NULL)
-               die_horribly(NULL, modulename, "Out of memory\n");
+           char       *fname = pg_malloc(fnamelen);
 
            snprintf(fname, fnamelen, "%s%s", path, ".gz");
            fp = cfopen(fname, mode, 1);
@@ -525,10 +508,7 @@ cfopen_write(const char *path, const char *mode, int compression)
    {
 #ifdef HAVE_LIBZ
        int         fnamelen = strlen(path) + 4;
-       char       *fname = malloc(fnamelen);
-
-       if (fname == NULL)
-           die_horribly(NULL, modulename, "Out of memory\n");
+       char       *fname = pg_malloc(fnamelen);
 
        snprintf(fname, fnamelen, "%s%s", path, ".gz");
        fp = cfopen(fname, mode, 1);
@@ -548,10 +528,7 @@ cfopen_write(const char *path, const char *mode, int compression)
 cfp *
 cfopen(const char *path, const char *mode, int compression)
 {
-   cfp        *fp = malloc(sizeof(cfp));
-
-   if (fp == NULL)
-       die_horribly(NULL, modulename, "Out of memory\n");
+   cfp        *fp = pg_malloc(sizeof(cfp));
 
    if (compression != 0)
    {
diff --git a/src/bin/pg_dump/dumpcatalog.c b/src/bin/pg_dump/dumpcatalog.c
new file mode 100644 (file)
index 0000000..9747d47
--- /dev/null
@@ -0,0 +1,978 @@
+/*-------------------------------------------------------------------------
+ *
+ * common.c
+ *   catalog routines used by pg_dump
+ *
+ * Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ *   src/bin/pg_dump/dumpcatalog.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "catalog/pg_class.h"
+
+#include "pg_backup_archiver.h"
+#include "common.h"
+
+
+/*
+ * Variables for mapping DumpId to DumpableObject
+ */
+static DumpableObject **dumpIdMap = NULL;
+static int allocedDumpIds = 0;
+static DumpId lastDumpId = 0;
+
+/*
+ * Variables for mapping CatalogId to DumpableObject
+ */
+static bool catalogIdMapValid = false;
+static DumpableObject **catalogIdMap = NULL;
+static int numCatalogIds = 0;
+
+/*
+ * These variables are static to avoid the notational cruft of having to pass
+ * them into findTableByOid() and friends. For each of these arrays, we
+ * build a sorted-by-OID index array immediately after it's built, and then
+ * we use binary search in findTableByOid() and friends.  (qsort'ing the base
+ * arrays themselves would be simpler, but it doesn't work because pg_dump.c
+ * may have already established pointers between items.)
+ */
+static TableInfo *tblinfo;
+static TypeInfo *typinfo;
+static FuncInfo *funinfo;
+static OprInfo *oprinfo;
+static int numTables;
+static int numTypes;
+static int numFuncs;
+static int numOperators;
+static int numCollations;
+static DumpableObject **tblinfoindex;
+static DumpableObject **typinfoindex;
+static DumpableObject **funinfoindex;
+static DumpableObject **oprinfoindex;
+static DumpableObject **collinfoindex;
+
+
+static void flagInhTables(TableInfo *tbinfo, int numTables,
+             InhInfo *inhinfo, int numInherits);
+static void flagInhAttrs(TableInfo *tblinfo, int numTables);
+static DumpableObject **buildIndexArray(void *objArray, int numObjs,
+               Size objSize);
+static int DOCatalogIdCompare(const void *p1, const void *p2);
+static void findParentsByOid(TableInfo *self,
+                InhInfo *inhinfo, int numInherits);
+static int strInArray(const char *pattern, char **arr, int arr_size);
+
+
+/*
+ * getSchemaData
+ *   Collect information about all potentially dumpable objects
+ */
+TableInfo *
+getSchemaData(int *numTablesPtr)
+{
+   ExtensionInfo *extinfo;
+   InhInfo    *inhinfo;
+   CollInfo   *collinfo;
+   int         numNamespaces;
+   int         numExtensions;
+   int         numAggregates;
+   int         numInherits;
+   int         numRules;
+   int         numProcLangs;
+   int         numCasts;
+   int         numOpclasses;
+   int         numOpfamilies;
+   int         numConversions;
+   int         numTSParsers;
+   int         numTSTemplates;
+   int         numTSDicts;
+   int         numTSConfigs;
+   int         numForeignDataWrappers;
+   int         numForeignServers;
+   int         numDefaultACLs;
+
+   if (g_verbose)
+       write_msg(NULL, "reading schemas\n");
+   getNamespaces(&numNamespaces);
+
+   /*
+    * getTables should be done as soon as possible, so as to minimize the
+    * window between starting our transaction and acquiring per-table locks.
+    * However, we have to do getNamespaces first because the tables get
+    * linked to their containing namespaces during getTables.
+    */
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined tables\n");
+   tblinfo = getTables(&numTables);
+   tblinfoindex = buildIndexArray(tblinfo, numTables, sizeof(TableInfo));
+
+   if (g_verbose)
+       write_msg(NULL, "reading extensions\n");
+   extinfo = getExtensions(&numExtensions);
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined functions\n");
+   funinfo = getFuncs(&numFuncs);
+   funinfoindex = buildIndexArray(funinfo, numFuncs, sizeof(FuncInfo));
+
+   /* this must be after getTables and getFuncs */
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined types\n");
+   typinfo = getTypes(&numTypes);
+   typinfoindex = buildIndexArray(typinfo, numTypes, sizeof(TypeInfo));
+
+   /* this must be after getFuncs, too */
+   if (g_verbose)
+       write_msg(NULL, "reading procedural languages\n");
+   getProcLangs(&numProcLangs);
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined aggregate functions\n");
+   getAggregates(&numAggregates);
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined operators\n");
+   oprinfo = getOperators(&numOperators);
+   oprinfoindex = buildIndexArray(oprinfo, numOperators, sizeof(OprInfo));
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined operator classes\n");
+   getOpclasses(&numOpclasses);
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined operator families\n");
+   getOpfamilies(&numOpfamilies);
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined text search parsers\n");
+   getTSParsers(&numTSParsers);
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined text search templates\n");
+   getTSTemplates(&numTSTemplates);
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined text search dictionaries\n");
+   getTSDictionaries(&numTSDicts);
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined text search configurations\n");
+   getTSConfigurations(&numTSConfigs);
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined foreign-data wrappers\n");
+   getForeignDataWrappers(&numForeignDataWrappers);
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined foreign servers\n");
+   getForeignServers(&numForeignServers);
+
+   if (g_verbose)
+       write_msg(NULL, "reading default privileges\n");
+   getDefaultACLs(&numDefaultACLs);
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined collations\n");
+   collinfo = getCollations(&numCollations);
+   collinfoindex = buildIndexArray(collinfo, numCollations, sizeof(CollInfo));
+
+   if (g_verbose)
+       write_msg(NULL, "reading user-defined conversions\n");
+   getConversions(&numConversions);
+
+   if (g_verbose)
+       write_msg(NULL, "reading type casts\n");
+   getCasts(&numCasts);
+
+   if (g_verbose)
+       write_msg(NULL, "reading table inheritance information\n");
+   inhinfo = getInherits(&numInherits);
+
+   if (g_verbose)
+       write_msg(NULL, "reading rewrite rules\n");
+   getRules(&numRules);
+
+   /*
+    * Identify extension member objects and mark them as not to be dumped.
+    * This must happen after reading all objects that can be direct members
+    * of extensions, but before we begin to process table subsidiary objects.
+    */
+   if (g_verbose)
+       write_msg(NULL, "finding extension members\n");
+   getExtensionMembership(extinfo, numExtensions);
+
+   /* Link tables to parents, mark parents of target tables interesting */
+   if (g_verbose)
+       write_msg(NULL, "finding inheritance relationships\n");
+   flagInhTables(tblinfo, numTables, inhinfo, numInherits);
+
+   if (g_verbose)
+       write_msg(NULL, "reading column info for interesting tables\n");
+   getTableAttrs(tblinfo, numTables);
+
+   if (g_verbose)
+       write_msg(NULL, "flagging inherited columns in subtables\n");
+   flagInhAttrs(tblinfo, numTables);
+
+   if (g_verbose)
+       write_msg(NULL, "reading indexes\n");
+   getIndexes(tblinfo, numTables);
+
+   if (g_verbose)
+       write_msg(NULL, "reading constraints\n");
+   getConstraints(tblinfo, numTables);
+
+   if (g_verbose)
+       write_msg(NULL, "reading triggers\n");
+   getTriggers(tblinfo, numTables);
+
+   *numTablesPtr = numTables;
+   return tblinfo;
+}
+
+/* flagInhTables -
+ *  Fill in parent link fields of every target table, and mark
+ *  parents of target tables as interesting
+ *
+ * Note that only direct ancestors of targets are marked interesting.
+ * This is sufficient; we don't much care whether they inherited their
+ * attributes or not.
+ *
+ * modifies tblinfo
+ */
+static void
+flagInhTables(TableInfo *tblinfo, int numTables,
+             InhInfo *inhinfo, int numInherits)
+{
+   int         i,
+               j;
+   int         numParents;
+   TableInfo **parents;
+
+   for (i = 0; i < numTables; i++)
+   {
+       /* Sequences and views never have parents */
+       if (tblinfo[i].relkind == RELKIND_SEQUENCE ||
+           tblinfo[i].relkind == RELKIND_VIEW)
+           continue;
+
+       /* Don't bother computing anything for non-target tables, either */
+       if (!tblinfo[i].dobj.dump)
+           continue;
+
+       /* Find all the immediate parent tables */
+       findParentsByOid(&tblinfo[i], inhinfo, numInherits);
+
+       /* Mark the parents as interesting for getTableAttrs */
+       numParents = tblinfo[i].numParents;
+       parents = tblinfo[i].parents;
+       for (j = 0; j < numParents; j++)
+           parents[j]->interesting = true;
+   }
+}
+
+/* flagInhAttrs -
+ *  for each dumpable table in tblinfo, flag its inherited attributes
+ * so when we dump the table out, we don't dump out the inherited attributes
+ *
+ * modifies tblinfo
+ */
+static void
+flagInhAttrs(TableInfo *tblinfo, int numTables)
+{
+   int         i,
+               j,
+               k;
+
+   for (i = 0; i < numTables; i++)
+   {
+       TableInfo  *tbinfo = &(tblinfo[i]);
+       int         numParents;
+       TableInfo **parents;
+       TableInfo  *parent;
+
+       /* Sequences and views never have parents */
+       if (tbinfo->relkind == RELKIND_SEQUENCE ||
+           tbinfo->relkind == RELKIND_VIEW)
+           continue;
+
+       /* Don't bother computing anything for non-target tables, either */
+       if (!tbinfo->dobj.dump)
+           continue;
+
+       numParents = tbinfo->numParents;
+       parents = tbinfo->parents;
+
+       if (numParents == 0)
+           continue;           /* nothing to see here, move along */
+
+       /*----------------------------------------------------------------
+        * For each attr, check the parent info: if no parent has an attr
+        * with the same name, then it's not inherited. If there *is* an
+        * attr with the same name, then only dump it if:
+        *
+        * - it is NOT NULL and zero parents are NOT NULL
+        *   OR
+        * - it has a default value AND the default value does not match
+        *   all parent default values, or no parents specify a default.
+        *
+        * See discussion on -hackers around 2-Apr-2001.
+        *----------------------------------------------------------------
+        */
+       for (j = 0; j < tbinfo->numatts; j++)
+       {
+           bool        foundAttr;      /* Attr was found in a parent */
+           bool        foundNotNull;   /* Attr was NOT NULL in a parent */
+           bool        defaultsMatch;  /* All non-empty defaults match */
+           bool        defaultsFound;  /* Found a default in a parent */
+           AttrDefInfo *attrDef;
+
+           foundAttr = false;
+           foundNotNull = false;
+           defaultsMatch = true;
+           defaultsFound = false;
+
+           attrDef = tbinfo->attrdefs[j];
+
+           for (k = 0; k < numParents; k++)
+           {
+               int         inhAttrInd;
+
+               parent = parents[k];
+               inhAttrInd = strInArray(tbinfo->attnames[j],
+                                       parent->attnames,
+                                       parent->numatts);
+
+               if (inhAttrInd != -1)
+               {
+                   AttrDefInfo *inhDef = parent->attrdefs[inhAttrInd];
+
+                   foundAttr = true;
+                   foundNotNull |= parent->notnull[inhAttrInd];
+                   if (inhDef != NULL)
+                   {
+                       defaultsFound = true;
+
+                       /*
+                        * If any parent has a default and the child doesn't,
+                        * we have to emit an explicit DEFAULT NULL clause for
+                        * the child, else the parent's default will win.
+                        */
+                       if (attrDef == NULL)
+                       {
+                           attrDef = (AttrDefInfo *) pg_malloc(sizeof(AttrDefInfo));
+                           attrDef->dobj.objType = DO_ATTRDEF;
+                           attrDef->dobj.catId.tableoid = 0;
+                           attrDef->dobj.catId.oid = 0;
+                           AssignDumpId(&attrDef->dobj);
+                           attrDef->adtable = tbinfo;
+                           attrDef->adnum = j + 1;
+                           attrDef->adef_expr = pg_strdup("NULL");
+
+                           attrDef->dobj.name = pg_strdup(tbinfo->dobj.name);
+                           attrDef->dobj.namespace = tbinfo->dobj.namespace;
+
+                           attrDef->dobj.dump = tbinfo->dobj.dump;
+
+                           attrDef->separate = false;
+                           addObjectDependency(&tbinfo->dobj,
+                                               attrDef->dobj.dumpId);
+
+                           tbinfo->attrdefs[j] = attrDef;
+                       }
+                       if (strcmp(attrDef->adef_expr, inhDef->adef_expr) != 0)
+                       {
+                           defaultsMatch = false;
+
+                           /*
+                            * Whenever there is a non-matching parent
+                            * default, add a dependency to force the parent
+                            * default to be dumped first, in case the
+                            * defaults end up being dumped as separate
+                            * commands.  Otherwise the parent default will
+                            * override the child's when it is applied.
+                            */
+                           addObjectDependency(&attrDef->dobj,
+                                               inhDef->dobj.dumpId);
+                       }
+                   }
+               }
+           }
+
+           /*
+            * Based on the scan of the parents, decide if we can rely on the
+            * inherited attr
+            */
+           if (foundAttr)      /* Attr was inherited */
+           {
+               /* Set inherited flag by default */
+               tbinfo->inhAttrs[j] = true;
+               tbinfo->inhAttrDef[j] = true;
+               tbinfo->inhNotNull[j] = true;
+
+               /*
+                * Clear it if attr had a default, but parents did not, or
+                * mismatch
+                */
+               if ((attrDef != NULL) && (!defaultsFound || !defaultsMatch))
+               {
+                   tbinfo->inhAttrs[j] = false;
+                   tbinfo->inhAttrDef[j] = false;
+               }
+
+               /*
+                * Clear it if NOT NULL and none of the parents were NOT NULL
+                */
+               if (tbinfo->notnull[j] && !foundNotNull)
+               {
+                   tbinfo->inhAttrs[j] = false;
+                   tbinfo->inhNotNull[j] = false;
+               }
+
+               /* Clear it if attr has local definition */
+               if (tbinfo->attislocal[j])
+                   tbinfo->inhAttrs[j] = false;
+           }
+       }
+   }
+}
+
+/*
+ * AssignDumpId
+ *     Given a newly-created dumpable object, assign a dump ID,
+ *     and enter the object into the lookup table.
+ *
+ * The caller is expected to have filled in objType and catId,
+ * but not any of the other standard fields of a DumpableObject.
+ */
+void
+AssignDumpId(DumpableObject *dobj)
+{
+   dobj->dumpId = ++lastDumpId;
+   dobj->name = NULL;          /* must be set later */
+   dobj->namespace = NULL;     /* may be set later */
+   dobj->dump = true;          /* default assumption */
+   dobj->ext_member = false;   /* default assumption */
+   dobj->dependencies = NULL;
+   dobj->nDeps = 0;
+   dobj->allocDeps = 0;
+
+   while (dobj->dumpId >= allocedDumpIds)
+   {
+       int         newAlloc;
+
+       if (allocedDumpIds <= 0)
+       {
+           newAlloc = 256;
+           dumpIdMap = (DumpableObject **)
+               pg_malloc(newAlloc * sizeof(DumpableObject *));
+       }
+       else
+       {
+           newAlloc = allocedDumpIds * 2;
+           dumpIdMap = (DumpableObject **)
+               pg_realloc(dumpIdMap, newAlloc * sizeof(DumpableObject *));
+       }
+       memset(dumpIdMap + allocedDumpIds, 0,
+              (newAlloc - allocedDumpIds) * sizeof(DumpableObject *));
+       allocedDumpIds = newAlloc;
+   }
+   dumpIdMap[dobj->dumpId] = dobj;
+
+   /* mark catalogIdMap invalid, but don't rebuild it yet */
+   catalogIdMapValid = false;
+}
+
+/*
+ * Assign a DumpId that's not tied to a DumpableObject.
+ *
+ * This is used when creating a "fixed" ArchiveEntry that doesn't need to
+ * participate in the sorting logic.
+ */
+DumpId
+createDumpId(void)
+{
+   return ++lastDumpId;
+}
+
+/*
+ * Return the largest DumpId so far assigned
+ */
+DumpId
+getMaxDumpId(void)
+{
+   return lastDumpId;
+}
+
+/*
+ * Find a DumpableObject by dump ID
+ *
+ * Returns NULL for invalid ID
+ */
+DumpableObject *
+findObjectByDumpId(DumpId dumpId)
+{
+   if (dumpId <= 0 || dumpId >= allocedDumpIds)
+       return NULL;            /* out of range? */
+   return dumpIdMap[dumpId];
+}
+
+/*
+ * Find a DumpableObject by catalog ID
+ *
+ * Returns NULL for unknown ID
+ *
+ * We use binary search in a sorted list that is built on first call.
+ * If AssignDumpId() and findObjectByCatalogId() calls were freely intermixed,
+ * the code would work, but possibly be very slow. In the current usage
+ * pattern that does not happen, indeed we build the list at most twice.
+ */
+DumpableObject *
+findObjectByCatalogId(CatalogId catalogId)
+{
+   DumpableObject **low;
+   DumpableObject **high;
+
+   if (!catalogIdMapValid)
+   {
+       if (catalogIdMap)
+           free(catalogIdMap);
+       getDumpableObjects(&catalogIdMap, &numCatalogIds);
+       if (numCatalogIds > 1)
+           qsort((void *) catalogIdMap, numCatalogIds,
+                 sizeof(DumpableObject *), DOCatalogIdCompare);
+       catalogIdMapValid = true;
+   }
+
+   /*
+    * We could use bsearch() here, but the notational cruft of calling
+    * bsearch is nearly as bad as doing it ourselves; and the generalized
+    * bsearch function is noticeably slower as well.
+    */
+   if (numCatalogIds <= 0)
+       return NULL;
+   low = catalogIdMap;
+   high = catalogIdMap + (numCatalogIds - 1);
+   while (low <= high)
+   {
+       DumpableObject **middle;
+       int         difference;
+
+       middle = low + (high - low) / 2;
+       /* comparison must match DOCatalogIdCompare, below */
+       difference = oidcmp((*middle)->catId.oid, catalogId.oid);
+       if (difference == 0)
+           difference = oidcmp((*middle)->catId.tableoid, catalogId.tableoid);
+       if (difference == 0)
+           return *middle;
+       else if (difference < 0)
+           low = middle + 1;
+       else
+           high = middle - 1;
+   }
+   return NULL;
+}
+
+/*
+ * Find a DumpableObject by OID, in a pre-sorted array of one type of object
+ *
+ * Returns NULL for unknown OID
+ */
+static DumpableObject *
+findObjectByOid(Oid oid, DumpableObject **indexArray, int numObjs)
+{
+   DumpableObject **low;
+   DumpableObject **high;
+
+   /*
+    * This is the same as findObjectByCatalogId except we assume we need not
+    * look at table OID because the objects are all the same type.
+    *
+    * We could use bsearch() here, but the notational cruft of calling
+    * bsearch is nearly as bad as doing it ourselves; and the generalized
+    * bsearch function is noticeably slower as well.
+    */
+   if (numObjs <= 0)
+       return NULL;
+   low = indexArray;
+   high = indexArray + (numObjs - 1);
+   while (low <= high)
+   {
+       DumpableObject **middle;
+       int         difference;
+
+       middle = low + (high - low) / 2;
+       difference = oidcmp((*middle)->catId.oid, oid);
+       if (difference == 0)
+           return *middle;
+       else if (difference < 0)
+           low = middle + 1;
+       else
+           high = middle - 1;
+   }
+   return NULL;
+}
+
+/*
+ * Build an index array of DumpableObject pointers, sorted by OID
+ */
+static DumpableObject **
+buildIndexArray(void *objArray, int numObjs, Size objSize)
+{
+   DumpableObject **ptrs;
+   int         i;
+
+   ptrs = (DumpableObject **) pg_malloc(numObjs * sizeof(DumpableObject *));
+   for (i = 0; i < numObjs; i++)
+       ptrs[i] = (DumpableObject *) ((char *) objArray + i * objSize);
+
+   /* We can use DOCatalogIdCompare to sort since its first key is OID */
+   if (numObjs > 1)
+       qsort((void *) ptrs, numObjs, sizeof(DumpableObject *),
+             DOCatalogIdCompare);
+
+   return ptrs;
+}
+
+/*
+ * qsort comparator for pointers to DumpableObjects
+ */
+static int
+DOCatalogIdCompare(const void *p1, const void *p2)
+{
+   const DumpableObject *obj1 = *(DumpableObject * const *) p1;
+   const DumpableObject *obj2 = *(DumpableObject * const *) p2;
+   int         cmpval;
+
+   /*
+    * Compare OID first since it's usually unique, whereas there will only be
+    * a few distinct values of tableoid.
+    */
+   cmpval = oidcmp(obj1->catId.oid, obj2->catId.oid);
+   if (cmpval == 0)
+       cmpval = oidcmp(obj1->catId.tableoid, obj2->catId.tableoid);
+   return cmpval;
+}
+
+/*
+ * Build an array of pointers to all known dumpable objects
+ *
+ * This simply creates a modifiable copy of the internal map.
+ */
+void
+getDumpableObjects(DumpableObject ***objs, int *numObjs)
+{
+   int         i,
+               j;
+
+   *objs = (DumpableObject **)
+       pg_malloc(allocedDumpIds * sizeof(DumpableObject *));
+   j = 0;
+   for (i = 1; i < allocedDumpIds; i++)
+   {
+       if (dumpIdMap[i])
+           (*objs)[j++] = dumpIdMap[i];
+   }
+   *numObjs = j;
+}
+
+/*
+ * Add a dependency link to a DumpableObject
+ *
+ * Note: duplicate dependencies are currently not eliminated
+ */
+void
+addObjectDependency(DumpableObject *dobj, DumpId refId)
+{
+   if (dobj->nDeps >= dobj->allocDeps)
+   {
+       if (dobj->allocDeps <= 0)
+       {
+           dobj->allocDeps = 16;
+           dobj->dependencies = (DumpId *)
+               pg_malloc(dobj->allocDeps * sizeof(DumpId));
+       }
+       else
+       {
+           dobj->allocDeps *= 2;
+           dobj->dependencies = (DumpId *)
+               pg_realloc(dobj->dependencies,
+                          dobj->allocDeps * sizeof(DumpId));
+       }
+   }
+   dobj->dependencies[dobj->nDeps++] = refId;
+}
+
+/*
+ * Remove a dependency link from a DumpableObject
+ *
+ * If there are multiple links, all are removed
+ */
+void
+removeObjectDependency(DumpableObject *dobj, DumpId refId)
+{
+   int         i;
+   int         j = 0;
+
+   for (i = 0; i < dobj->nDeps; i++)
+   {
+       if (dobj->dependencies[i] != refId)
+           dobj->dependencies[j++] = dobj->dependencies[i];
+   }
+   dobj->nDeps = j;
+}
+
+
+/*
+ * findTableByOid
+ *   finds the entry (in tblinfo) of the table with the given oid
+ *   returns NULL if not found
+ */
+TableInfo *
+findTableByOid(Oid oid)
+{
+   return (TableInfo *) findObjectByOid(oid, tblinfoindex, numTables);
+}
+
+/*
+ * findTypeByOid
+ *   finds the entry (in typinfo) of the type with the given oid
+ *   returns NULL if not found
+ */
+TypeInfo *
+findTypeByOid(Oid oid)
+{
+   return (TypeInfo *) findObjectByOid(oid, typinfoindex, numTypes);
+}
+
+/*
+ * findFuncByOid
+ *   finds the entry (in funinfo) of the function with the given oid
+ *   returns NULL if not found
+ */
+FuncInfo *
+findFuncByOid(Oid oid)
+{
+   return (FuncInfo *) findObjectByOid(oid, funinfoindex, numFuncs);
+}
+
+/*
+ * findOprByOid
+ *   finds the entry (in oprinfo) of the operator with the given oid
+ *   returns NULL if not found
+ */
+OprInfo *
+findOprByOid(Oid oid)
+{
+   return (OprInfo *) findObjectByOid(oid, oprinfoindex, numOperators);
+}
+
+/*
+ * findCollationByOid
+ *   finds the entry (in collinfo) of the collation with the given oid
+ *   returns NULL if not found
+ */
+CollInfo *
+findCollationByOid(Oid oid)
+{
+   return (CollInfo *) findObjectByOid(oid, collinfoindex, numCollations);
+}
+
+
+/*
+ * findParentsByOid
+ *   find a table's parents in tblinfo[]
+ */
+static void
+findParentsByOid(TableInfo *self,
+                InhInfo *inhinfo, int numInherits)
+{
+   Oid         oid = self->dobj.catId.oid;
+   int         i,
+               j;
+   int         numParents;
+
+   numParents = 0;
+   for (i = 0; i < numInherits; i++)
+   {
+       if (inhinfo[i].inhrelid == oid)
+           numParents++;
+   }
+
+   self->numParents = numParents;
+
+   if (numParents > 0)
+   {
+       self->parents = (TableInfo **)
+           pg_malloc(sizeof(TableInfo *) * numParents);
+       j = 0;
+       for (i = 0; i < numInherits; i++)
+       {
+           if (inhinfo[i].inhrelid == oid)
+           {
+               TableInfo  *parent;
+
+               parent = findTableByOid(inhinfo[i].inhparent);
+               if (parent == NULL)
+               {
+                   write_msg(NULL, "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found\n",
+                             inhinfo[i].inhparent,
+                             self->dobj.name,
+                             oid);
+                   exit_nicely();
+               }
+               self->parents[j++] = parent;
+           }
+       }
+   }
+   else
+       self->parents = NULL;
+}
+
+/*
+ * parseOidArray
+ *   parse a string of numbers delimited by spaces into a character array
+ *
+ * Note: actually this is used for both Oids and potentially-signed
+ * attribute numbers.  This should cause no trouble, but we could split
+ * the function into two functions with different argument types if it does.
+ */
+
+void
+parseOidArray(const char *str, Oid *array, int arraysize)
+{
+   int         j,
+               argNum;
+   char        temp[100];
+   char        s;
+
+   argNum = 0;
+   j = 0;
+   for (;;)
+   {
+       s = *str++;
+       if (s == ' ' || s == '\0')
+       {
+           if (j > 0)
+           {
+               if (argNum >= arraysize)
+               {
+                   write_msg(NULL, "could not parse numeric array \"%s\": too many numbers\n", str);
+                   exit_nicely();
+               }
+               temp[j] = '\0';
+               array[argNum++] = atooid(temp);
+               j = 0;
+           }
+           if (s == '\0')
+               break;
+       }
+       else
+       {
+           if (!(isdigit((unsigned char) s) || s == '-') ||
+               j >= sizeof(temp) - 1)
+           {
+               write_msg(NULL, "could not parse numeric array \"%s\": invalid character in number\n", str);
+               exit_nicely();
+           }
+           temp[j++] = s;
+       }
+   }
+
+   while (argNum < arraysize)
+       array[argNum++] = InvalidOid;
+}
+
+
+/*
+ * 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
+ */
+
+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;
+}
+
+
+/*
+ * Support for simple list operations
+ */
+
+void
+simple_oid_list_append(SimpleOidList *list, Oid val)
+{
+   SimpleOidListCell *cell;
+
+   cell = (SimpleOidListCell *) pg_malloc(sizeof(SimpleOidListCell));
+   cell->next = NULL;
+   cell->val = val;
+
+   if (list->tail)
+       list->tail->next = cell;
+   else
+       list->head = cell;
+   list->tail = cell;
+}
+
+void
+simple_string_list_append(SimpleStringList *list, const char *val)
+{
+   SimpleStringListCell *cell;
+
+   /* this calculation correctly accounts for the null trailing byte */
+   cell = (SimpleStringListCell *)
+       pg_malloc(sizeof(SimpleStringListCell) + strlen(val));
+   cell->next = NULL;
+   strcpy(cell->val, val);
+
+   if (list->tail)
+       list->tail->next = cell;
+   else
+       list->head = cell;
+   list->tail = cell;
+}
+
+bool
+simple_oid_list_member(SimpleOidList *list, Oid val)
+{
+   SimpleOidListCell *cell;
+
+   for (cell = list->head; cell; cell = cell->next)
+   {
+       if (cell->val == val)
+           return true;
+   }
+   return false;
+}
+
+bool
+simple_string_list_member(SimpleStringList *list, const char *val)
+{
+   SimpleStringListCell *cell;
+
+   for (cell = list->head; cell; cell = cell->next)
+   {
+       if (strcmp(cell->val, val) == 0)
+           return true;
+   }
+   return false;
+}
index acce7f82fa448a52987e2ea31598a0c3a91fb83e..5cc012d9e3c373187b6445a23aa467eb7df959e4 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <ctype.h>
 
+#include "common.h"
 #include "dumputils.h"
 
 #include "parser/keywords.h"
index f47af264cba07952dea3507b6de8afa232339ae6..8fb838276fc23d410aac90ca56fceaebd02bd445 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 #include "pg_backup_db.h"
+#include "common.h"
 #include "dumputils.h"
 
 #include <ctype.h>
@@ -541,7 +542,7 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te,
        {
            ahlog(AH, 1, "connecting to new database \"%s\"\n", te->tag);
            _reconnectToDB(AH, te->tag);
-           ropt->dbname = strdup(te->tag);
+           ropt->dbname = pg_strdup(te->tag);
        }
    }
 
@@ -660,7 +661,7 @@ NewRestoreOptions(void)
 {
    RestoreOptions *opts;
 
-   opts = (RestoreOptions *) calloc(1, sizeof(RestoreOptions));
+   opts = (RestoreOptions *) pg_calloc(1, sizeof(RestoreOptions));
 
    /* set any fields that shouldn't default to zeroes */
    opts->format = archUnknown;
@@ -759,9 +760,7 @@ ArchiveEntry(Archive *AHX,
    ArchiveHandle *AH = (ArchiveHandle *) AHX;
    TocEntry   *newToc;
 
-   newToc = (TocEntry *) calloc(1, sizeof(TocEntry));
-   if (!newToc)
-       die_horribly(AH, modulename, "out of memory\n");
+   newToc = (TocEntry *) pg_calloc(1, sizeof(TocEntry));
 
    AH->tocCount++;
    if (dumpId > AH->maxDumpId)
@@ -776,19 +775,19 @@ ArchiveEntry(Archive *AHX,
    newToc->dumpId = dumpId;
    newToc->section = section;
 
-   newToc->tag = strdup(tag);
-   newToc->namespace = namespace ? strdup(namespace) : NULL;
-   newToc->tablespace = tablespace ? strdup(tablespace) : NULL;
-   newToc->owner = strdup(owner);
+   newToc->tag = pg_strdup(tag);
+   newToc->namespace = namespace ? pg_strdup(namespace) : NULL;
+   newToc->tablespace = tablespace ? pg_strdup(tablespace) : NULL;
+   newToc->owner = pg_strdup(owner);
    newToc->withOids = withOids;
-   newToc->desc = strdup(desc);
-   newToc->defn = strdup(defn);
-   newToc->dropStmt = strdup(dropStmt);
-   newToc->copyStmt = copyStmt ? strdup(copyStmt) : NULL;
+   newToc->desc = pg_strdup(desc);
+   newToc->defn = pg_strdup(defn);
+   newToc->dropStmt = pg_strdup(dropStmt);
+   newToc->copyStmt = copyStmt ? pg_strdup(copyStmt) : NULL;
 
    if (nDeps > 0)
    {
-       newToc->dependencies = (DumpId *) malloc(nDeps * sizeof(DumpId));
+       newToc->dependencies = (DumpId *) pg_malloc(nDeps * sizeof(DumpId));
        memcpy(newToc->dependencies, deps, nDeps * sizeof(DumpId));
        newToc->nDeps = nDeps;
    }
@@ -1032,7 +1031,7 @@ SortTocFromFile(Archive *AHX, RestoreOptions *ropt)
    bool        incomplete_line;
 
    /* Allocate space for the 'wanted' array, and init it */
-   ropt->idWanted = (bool *) malloc(sizeof(bool) * AH->maxDumpId);
+   ropt->idWanted = (bool *) pg_malloc(sizeof(bool) * AH->maxDumpId);
    memset(ropt->idWanted, 0, sizeof(bool) * AH->maxDumpId);
 
    /* Setup the file */
@@ -1120,7 +1119,7 @@ InitDummyWantedList(Archive *AHX, RestoreOptions *ropt)
    ArchiveHandle *AH = (ArchiveHandle *) AHX;
 
    /* Allocate space for the 'wanted' array, and init it to 1's */
-   ropt->idWanted = (bool *) malloc(sizeof(bool) * AH->maxDumpId);
+   ropt->idWanted = (bool *) pg_malloc(sizeof(bool) * AH->maxDumpId);
    memset(ropt->idWanted, 1, sizeof(bool) * AH->maxDumpId);
 }
 
@@ -1155,9 +1154,7 @@ archprintf(Archive *AH, const char *fmt,...)
        if (p != NULL)
            free(p);
        bSize *= 2;
-       p = (char *) malloc(bSize);
-       if (p == NULL)
-           exit_horribly(AH, modulename, "out of memory\n");
+       p = (char *) pg_malloc(bSize);
        va_start(ap, fmt);
        cnt = vsnprintf(p, bSize, fmt, ap);
        va_end(ap);
@@ -1286,9 +1283,7 @@ ahprintf(ArchiveHandle *AH, const char *fmt,...)
        if (p != NULL)
            free(p);
        bSize *= 2;
-       p = (char *) malloc(bSize);
-       if (p == NULL)
-           die_horribly(AH, modulename, "out of memory\n");
+       p = (char *) pg_malloc(bSize);
        va_start(ap, fmt);
        cnt = vsnprintf(p, bSize, fmt, ap);
        va_end(ap);
@@ -1756,10 +1751,7 @@ ReadStr(ArchiveHandle *AH)
        buf = NULL;
    else
    {
-       buf = (char *) malloc(l + 1);
-       if (!buf)
-           die_horribly(AH, modulename, "out of memory\n");
-
+       buf = (char *) pg_malloc(l + 1);
        if ((*AH->ReadBufPtr) (AH, (void *) buf, l) != l)
            die_horribly(AH, modulename, "unexpected end of file\n");
 
@@ -1785,7 +1777,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
        free(AH->lookahead);
 
    AH->lookaheadSize = 512;
-   AH->lookahead = calloc(1, 512);
+   AH->lookahead = pg_calloc(1, 512);
    AH->lookaheadLen = 0;
    AH->lookaheadPos = 0;
 
@@ -1950,9 +1942,7 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
    write_msg(modulename, "allocating AH for %s, format %d\n", FileSpec, fmt);
 #endif
 
-   AH = (ArchiveHandle *) calloc(1, sizeof(ArchiveHandle));
-   if (!AH)
-       die_horribly(AH, modulename, "out of memory\n");
+   AH = (ArchiveHandle *) pg_calloc(1, sizeof(ArchiveHandle));
 
    /* AH->debugLevel = 100; */
 
@@ -1979,12 +1969,12 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
    AH->offSize = sizeof(pgoff_t);
    if (FileSpec)
    {
-       AH->fSpec = strdup(FileSpec);
+       AH->fSpec = pg_strdup(FileSpec);
 
        /*
         * Not used; maybe later....
         *
-        * AH->workDir = strdup(FileSpec); for(i=strlen(FileSpec) ; i > 0 ;
+        * AH->workDir = pg_strdup(FileSpec); for(i=strlen(FileSpec) ; i > 0 ;
         * i--) if (AH->workDir[i-1] == '/')
         */
    }
@@ -1996,9 +1986,7 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
    AH->currTablespace = NULL;  /* ditto */
    AH->currWithOids = -1;      /* force SET */
 
-   AH->toc = (TocEntry *) calloc(1, sizeof(TocEntry));
-   if (!AH->toc)
-       die_horribly(AH, modulename, "out of memory\n");
+   AH->toc = (TocEntry *) pg_calloc(1, sizeof(TocEntry));
 
    AH->toc->next = AH->toc;
    AH->toc->prev = AH->toc;
@@ -2169,7 +2157,7 @@ ReadToc(ArchiveHandle *AH)
 
    for (i = 0; i < AH->tocCount; i++)
    {
-       te = (TocEntry *) calloc(1, sizeof(TocEntry));
+       te = (TocEntry *) pg_calloc(1, sizeof(TocEntry));
        te->dumpId = ReadInt(AH);
 
        if (te->dumpId > AH->maxDumpId)
@@ -2255,7 +2243,7 @@ ReadToc(ArchiveHandle *AH)
        if (AH->version >= K_VERS_1_5)
        {
            depSize = 100;
-           deps = (DumpId *) malloc(sizeof(DumpId) * depSize);
+           deps = (DumpId *) pg_malloc(sizeof(DumpId) * depSize);
            depIdx = 0;
            for (;;)
            {
@@ -2315,7 +2303,7 @@ static void
 processEncodingEntry(ArchiveHandle *AH, TocEntry *te)
 {
    /* te->defn should have the form SET client_encoding = 'foo'; */
-   char       *defn = strdup(te->defn);
+   char       *defn = pg_strdup(te->defn);
    char       *ptr1;
    char       *ptr2 = NULL;
    int         encoding;
@@ -2660,7 +2648,7 @@ _becomeUser(ArchiveHandle *AH, const char *user)
     */
    if (AH->currUser)
        free(AH->currUser);
-   AH->currUser = strdup(user);
+   AH->currUser = pg_strdup(user);
 }
 
 /*
@@ -2729,7 +2717,7 @@ _selectOutputSchema(ArchiveHandle *AH, const char *schemaName)
 
    if (AH->currSchema)
        free(AH->currSchema);
-   AH->currSchema = strdup(schemaName);
+   AH->currSchema = pg_strdup(schemaName);
 
    destroyPQExpBuffer(qry);
 }
@@ -2790,7 +2778,7 @@ _selectTablespace(ArchiveHandle *AH, const char *tablespace)
 
    if (AH->currTablespace)
        free(AH->currTablespace);
-   AH->currTablespace = strdup(want);
+   AH->currTablespace = pg_strdup(want);
 
    destroyPQExpBuffer(qry);
 }
@@ -2872,7 +2860,7 @@ _getObjectDescription(PQExpBuffer buf, TocEntry *te, ArchiveHandle *AH)
        strcmp(type, "OPERATOR FAMILY") == 0)
    {
        /* Chop "DROP " off the front and make a modifiable copy */
-       char       *first = strdup(te->dropStmt + 5);
+       char       *first = pg_strdup(te->dropStmt + 5);
        char       *last;
 
        /* point to last character in string */
@@ -3279,7 +3267,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH)
 
    ahlog(AH, 2, "entering restore_toc_entries_parallel\n");
 
-   slots = (ParallelSlot *) calloc(sizeof(ParallelSlot), n_slots);
+   slots = (ParallelSlot *) pg_calloc(sizeof(ParallelSlot), n_slots);
 
    /* Adjust dependency information */
    fix_dependencies(AH);
@@ -3431,7 +3419,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH)
                par_list_remove(next_work_item);
 
                /* this memory is dealloced in mark_work_done() */
-               args = malloc(sizeof(RestoreArgs));
+               args = pg_malloc(sizeof(RestoreArgs));
                args->AH = CloneArchive(AH);
                args->te = next_work_item;
 
@@ -3550,7 +3538,7 @@ reap_child(ParallelSlot *slots, int n_slots, int *work_status)
 
    /* first time around only, make space for handles to listen on */
    if (handles == NULL)
-       handles = (HANDLE *) calloc(sizeof(HANDLE), n_slots);
+       handles = (HANDLE *) pg_calloc(sizeof(HANDLE), n_slots);
 
    /* set up list of handles to listen to */
    for (snum = 0, tnum = 0; snum < n_slots; snum++)
@@ -3898,7 +3886,7 @@ fix_dependencies(ArchiveHandle *AH)
     * the TOC items are marked as not being in any parallel-processing list.
     */
    maxDumpId = AH->maxDumpId;
-   tocsByDumpId = (TocEntry **) calloc(maxDumpId, sizeof(TocEntry *));
+   tocsByDumpId = (TocEntry **) pg_calloc(maxDumpId, sizeof(TocEntry *));
    for (te = AH->toc->next; te != AH->toc; te = te->next)
    {
        tocsByDumpId[te->dumpId - 1] = te;
@@ -3958,7 +3946,7 @@ fix_dependencies(ArchiveHandle *AH)
                {
                    if (strcmp(te2->desc, "BLOBS") == 0)
                    {
-                       te->dependencies = (DumpId *) malloc(sizeof(DumpId));
+                       te->dependencies = (DumpId *) pg_malloc(sizeof(DumpId));
                        te->dependencies[0] = te2->dumpId;
                        te->nDeps++;
                        te->depCount++;
@@ -4000,7 +3988,7 @@ fix_dependencies(ArchiveHandle *AH)
    for (te = AH->toc->next; te != AH->toc; te = te->next)
    {
        if (te->nRevDeps > 0)
-           te->revDeps = (DumpId *) malloc(te->nRevDeps * sizeof(DumpId));
+           te->revDeps = (DumpId *) pg_malloc(te->nRevDeps * sizeof(DumpId));
        te->nRevDeps = 0;
    }
 
@@ -4092,7 +4080,7 @@ identify_locking_dependencies(TocEntry *te)
     * that all the entry types we are interested in here are POST_DATA, so
     * they will all have been changed this way.)
     */
-   lockids = (DumpId *) malloc(te->nDeps * sizeof(DumpId));
+   lockids = (DumpId *) pg_malloc(te->nDeps * sizeof(DumpId));
    nlockids = 0;
    for (i = 0; i < te->nDeps; i++)
    {
@@ -4204,9 +4192,7 @@ CloneArchive(ArchiveHandle *AH)
    ArchiveHandle *clone;
 
    /* Make a "flat" copy */
-   clone = (ArchiveHandle *) malloc(sizeof(ArchiveHandle));
-   if (clone == NULL)
-       die_horribly(AH, modulename, "out of memory\n");
+   clone = (ArchiveHandle *) pg_malloc(sizeof(ArchiveHandle));
    memcpy(clone, AH, sizeof(ArchiveHandle));
 
    /* Handle format-independent fields ... none at the moment */
@@ -4220,7 +4206,7 @@ CloneArchive(ArchiveHandle *AH)
 
    /* savedPassword must be local in case we change it while connecting */
    if (clone->savedPassword)
-       clone->savedPassword = strdup(clone->savedPassword);
+       clone->savedPassword = pg_strdup(clone->savedPassword);
 
    /* clone has its own error count, too */
    clone->public.n_errors = 0;
index 55ff39a4fe817ebd2d2812a92950e71785c18393..bfdf482a6b268a2cdfbdd88009c2c0aadb736348 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 #include "compress_io.h"
+#include "common.h"
 
 /*--------
  * Routines in the format interface
@@ -126,16 +127,12 @@ InitArchiveFmt_Custom(ArchiveHandle *AH)
    AH->DeClonePtr = _DeClone;
 
    /* Set up a private area. */
-   ctx = (lclContext *) calloc(1, sizeof(lclContext));
-   if (ctx == NULL)
-       die_horribly(AH, modulename, "out of memory\n");
+   ctx = (lclContext *) pg_calloc(1, sizeof(lclContext));
    AH->formatData = (void *) ctx;
 
    /* Initialize LO buffering */
    AH->lo_buf_size = LOBBUFSIZE;
-   AH->lo_buf = (void *) malloc(LOBBUFSIZE);
-   if (AH->lo_buf == NULL)
-       die_horribly(AH, modulename, "out of memory\n");
+   AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
 
    ctx->filePos = 0;
 
@@ -199,7 +196,7 @@ _ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
 {
    lclTocEntry *ctx;
 
-   ctx = (lclTocEntry *) calloc(1, sizeof(lclTocEntry));
+   ctx = (lclTocEntry *) pg_calloc(1, sizeof(lclTocEntry));
    if (te->dataDumper)
        ctx->dataState = K_OFFSET_POS_NOT_SET;
    else
@@ -240,7 +237,7 @@ _ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
 
    if (ctx == NULL)
    {
-       ctx = (lclTocEntry *) calloc(1, sizeof(lclTocEntry));
+       ctx = (lclTocEntry *) pg_calloc(1, sizeof(lclTocEntry));
        te->formatData = (void *) ctx;
    }
 
@@ -566,7 +563,7 @@ _skipData(ArchiveHandle *AH)
        {
            if (buf)
                free(buf);
-           buf = (char *) malloc(blkLen);
+           buf = (char *) pg_malloc(blkLen);
            buflen = blkLen;
        }
        cnt = fread(buf, 1, blkLen, AH->FH);
@@ -774,9 +771,7 @@ _Clone(ArchiveHandle *AH)
 {
    lclContext *ctx = (lclContext *) AH->formatData;
 
-   AH->formatData = (lclContext *) malloc(sizeof(lclContext));
-   if (AH->formatData == NULL)
-       die_horribly(AH, modulename, "out of memory\n");
+   AH->formatData = (lclContext *) pg_malloc(sizeof(lclContext));
    memcpy(AH->formatData, ctx, sizeof(lclContext));
    ctx = (lclContext *) AH->formatData;
 
@@ -901,9 +896,7 @@ _CustomReadFunc(ArchiveHandle *AH, char **buf, size_t *buflen)
    if (blkLen > *buflen)
    {
        free(*buf);
-       *buf = (char *) malloc(blkLen);
-       if (!(*buf))
-           die_horribly(AH, modulename, "out of memory\n");
+       *buf = (char *) pg_malloc(blkLen);
        *buflen = blkLen;
    }
 
index 600728d19856aac3b2b46850ec243bfed0c63a37..a58eb2da701a32ff3afd9495069e785e98f8d888 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include "pg_backup_db.h"
+#include "common.h"
 #include "dumputils.h"
 
 #include <unistd.h>
@@ -55,7 +56,7 @@ _check_database_version(ArchiveHandle *AH)
 
    remoteversion = _parse_version(AH, remoteversion_str);
 
-   AH->public.remoteVersionStr = strdup(remoteversion_str);
+   AH->public.remoteVersionStr = pg_strdup(remoteversion_str);
    AH->public.remoteVersion = remoteversion;
    if (!AH->archiveRemoteVersion)
        AH->archiveRemoteVersion = AH->public.remoteVersionStr;
@@ -150,11 +151,8 @@ _connectDB(ArchiveHandle *AH, const char *reqdb, const char *requser)
    do
    {
 #define PARAMS_ARRAY_SIZE  7
-       const char **keywords = malloc(PARAMS_ARRAY_SIZE * sizeof(*keywords));
-       const char **values = malloc(PARAMS_ARRAY_SIZE * sizeof(*values));
-
-       if (!keywords || !values)
-           die_horribly(AH, modulename, "out of memory\n");
+       const char **keywords = pg_malloc(PARAMS_ARRAY_SIZE * sizeof(*keywords));
+       const char **values = pg_malloc(PARAMS_ARRAY_SIZE * sizeof(*values));
 
        keywords[0] = "host";
        values[0] = PQhost(AH->connection);
@@ -257,11 +255,8 @@ ConnectDatabase(Archive *AHX,
    do
    {
 #define PARAMS_ARRAY_SIZE  7
-       const char **keywords = malloc(PARAMS_ARRAY_SIZE * sizeof(*keywords));
-       const char **values = malloc(PARAMS_ARRAY_SIZE * sizeof(*values));
-
-       if (!keywords || !values)
-           die_horribly(AH, modulename, "out of memory\n");
+       const char **keywords = pg_malloc(PARAMS_ARRAY_SIZE * sizeof(*keywords));
+       const char **values = pg_malloc(PARAMS_ARRAY_SIZE * sizeof(*values));
 
        keywords[0] = "host";
        values[0] = pghost;
@@ -397,10 +392,8 @@ ExecuteSqlCommandBuf(ArchiveHandle *AH, const char *buf, size_t bufLen)
            ExecuteSqlCommand(AH, buf, "could not execute query");
        else
        {
-           char   *str = (char *) malloc(bufLen + 1);
+           char   *str = (char *) pg_malloc(bufLen + 1);
 
-           if (!str)
-               die_horribly(AH, modulename, "out of memory\n");
            memcpy(str, buf, bufLen);
            str[bufLen] = '\0';
            ExecuteSqlCommand(AH, str, "could not execute query");
index 2e110acfff072e4d6c6ffec01fef005be7cb3c20..4f9fcc2be55c257b7b6ef4dcac6a25ce92e839b2 100644 (file)
@@ -34,6 +34,7 @@
  */
 
 #include "compress_io.h"
+#include "common.h"
 
 #include <dirent.h>
 #include <sys/stat.h>
@@ -125,9 +126,7 @@ InitArchiveFmt_Directory(ArchiveHandle *AH)
    AH->DeClonePtr = NULL;
 
    /* Set up our private context */
-   ctx = (lclContext *) calloc(1, sizeof(lclContext));
-   if (ctx == NULL)
-       die_horribly(AH, modulename, "out of memory\n");
+   ctx = (lclContext *) pg_calloc(1, sizeof(lclContext));
    AH->formatData = (void *) ctx;
 
    ctx->dataFH = NULL;
@@ -135,9 +134,7 @@ InitArchiveFmt_Directory(ArchiveHandle *AH)
 
    /* Initialize LO buffering */
    AH->lo_buf_size = LOBBUFSIZE;
-   AH->lo_buf = (void *) malloc(LOBBUFSIZE);
-   if (AH->lo_buf == NULL)
-       die_horribly(AH, modulename, "out of memory\n");
+   AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
 
    /*
     * Now open the TOC file
@@ -196,16 +193,14 @@ _ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
    lclTocEntry *tctx;
    char        fn[MAXPGPATH];
 
-   tctx = (lclTocEntry *) calloc(1, sizeof(lclTocEntry));
-   if (!tctx)
-       die_horribly(AH, modulename, "out of memory\n");
+   tctx = (lclTocEntry *) pg_calloc(1, sizeof(lclTocEntry));
    if (te->dataDumper)
    {
        snprintf(fn, MAXPGPATH, "%d.dat", te->dumpId);
-       tctx->filename = strdup(fn);
+       tctx->filename = pg_strdup(fn);
    }
    else if (strcmp(te->desc, "BLOBS") == 0)
-       tctx->filename = strdup("blobs.toc");
+       tctx->filename = pg_strdup("blobs.toc");
    else
        tctx->filename = NULL;
 
@@ -247,9 +242,7 @@ _ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
 
    if (tctx == NULL)
    {
-       tctx = (lclTocEntry *) calloc(1, sizeof(lclTocEntry));
-       if (!tctx)
-           die_horribly(AH, modulename, "out of memory\n");
+       tctx = (lclTocEntry *) pg_calloc(1, sizeof(lclTocEntry));
        te->formatData = (void *) tctx;
    }
 
@@ -355,9 +348,7 @@ _PrintFileData(ArchiveHandle *AH, char *filename, RestoreOptions *ropt)
        die_horribly(AH, modulename, "could not open input file \"%s\": %s\n",
                     filename, strerror(errno));
 
-   buf = malloc(ZLIB_OUT_SIZE);
-   if (buf == NULL)
-       die_horribly(NULL, modulename, "out of memory\n");
+   buf = pg_malloc(ZLIB_OUT_SIZE);
    buflen = ZLIB_OUT_SIZE;
 
    while ((cnt = cfread(buf, buflen, cfp)))
index afd53bff8e26407faf501d7df8fd895d1250d3be..76366e190bc023a770f0e500a2c476b5c7d4c959 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 #include "pg_backup_archiver.h"
+#include "common.h"
 
 static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te);
 static void _StartData(ArchiveHandle *AH, TocEntry *te);
@@ -103,15 +104,13 @@ InitArchiveFmt_Files(ArchiveHandle *AH)
    /*
     * Set up some special context used in compressing data.
     */
-   ctx = (lclContext *) calloc(1, sizeof(lclContext));
+   ctx = (lclContext *) pg_calloc(1, sizeof(lclContext));
    AH->formatData = (void *) ctx;
    ctx->filePos = 0;
 
    /* Initialize LO buffering */
    AH->lo_buf_size = LOBBUFSIZE;
-   AH->lo_buf = (void *) malloc(LOBBUFSIZE);
-   if (AH->lo_buf == NULL)
-       die_horribly(AH, modulename, "out of memory\n");
+   AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
 
    /*
     * Now open the TOC file
@@ -183,7 +182,7 @@ _ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
    lclTocEntry *ctx;
    char        fn[K_STD_BUF_SIZE];
 
-   ctx = (lclTocEntry *) calloc(1, sizeof(lclTocEntry));
+   ctx = (lclTocEntry *) pg_calloc(1, sizeof(lclTocEntry));
    if (te->dataDumper)
    {
 #ifdef HAVE_LIBZ
@@ -194,7 +193,7 @@ _ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
 #else
        sprintf(fn, "%d.dat", te->dumpId);
 #endif
-       ctx->filename = strdup(fn);
+       ctx->filename = pg_strdup(fn);
    }
    else
    {
@@ -222,7 +221,7 @@ _ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
 
    if (ctx == NULL)
    {
-       ctx = (lclTocEntry *) calloc(1, sizeof(lclTocEntry));
+       ctx = (lclTocEntry *) pg_calloc(1, sizeof(lclTocEntry));
        te->formatData = (void *) ctx;
    }
 
index bf1e6e68bf2911419072b4cfd8e7a06cb8ff34b7..252e7a403bf5118c72b39e8c8e79344f72a11ef4 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 #include "pg_backup_archiver.h"
+#include "common.h"
 #include "dumputils.h"
 
 #include <unistd.h>                /* for dup */
@@ -67,9 +68,7 @@ InitArchiveFmt_Null(ArchiveHandle *AH)
 
    /* Initialize LO buffering */
    AH->lo_buf_size = LOBBUFSIZE;
-   AH->lo_buf = (void *) malloc(LOBBUFSIZE);
-   if (AH->lo_buf == NULL)
-       die_horribly(AH, NULL, "out of memory\n");
+   AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
 
    /*
     * Now prevent reading...
index 4642132d7152188c98803f3cc02555b611e6ca35..94133cf50db362a586024d9749572d0a1afb15a5 100644 (file)
@@ -28,6 +28,7 @@
 #include "pg_backup.h"
 #include "pg_backup_archiver.h"
 #include "pg_backup_tar.h"
+#include "common.h"
 
 #include <sys/stat.h>
 #include <ctype.h>
@@ -159,16 +160,14 @@ InitArchiveFmt_Tar(ArchiveHandle *AH)
    /*
     * Set up some special context used in compressing data.
     */
-   ctx = (lclContext *) calloc(1, sizeof(lclContext));
+   ctx = (lclContext *) pg_calloc(1, sizeof(lclContext));
    AH->formatData = (void *) ctx;
    ctx->filePos = 0;
    ctx->isSpecialScript = 0;
 
    /* Initialize LO buffering */
    AH->lo_buf_size = LOBBUFSIZE;
-   AH->lo_buf = (void *) malloc(LOBBUFSIZE);
-   if (AH->lo_buf == NULL)
-       die_horribly(AH, modulename, "out of memory\n");
+   AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE);
 
    /*
     * Now open the tar file, and load the TOC if we're in read mode.
@@ -267,7 +266,7 @@ _ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
    lclTocEntry *ctx;
    char        fn[K_STD_BUF_SIZE];
 
-   ctx = (lclTocEntry *) calloc(1, sizeof(lclTocEntry));
+   ctx = (lclTocEntry *) pg_calloc(1, sizeof(lclTocEntry));
    if (te->dataDumper != NULL)
    {
 #ifdef HAVE_LIBZ
@@ -278,7 +277,7 @@ _ArchiveEntry(ArchiveHandle *AH, TocEntry *te)
 #else
        sprintf(fn, "%d.dat", te->dumpId);
 #endif
-       ctx->filename = strdup(fn);
+       ctx->filename = pg_strdup(fn);
    }
    else
    {
@@ -306,7 +305,7 @@ _ReadExtraToc(ArchiveHandle *AH, TocEntry *te)
 
    if (ctx == NULL)
    {
-       ctx = (lclTocEntry *) calloc(1, sizeof(lclTocEntry));
+       ctx = (lclTocEntry *) pg_calloc(1, sizeof(lclTocEntry));
        te->formatData = (void *) ctx;
    }
 
@@ -379,7 +378,7 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode)
    }
    else
    {
-       tm = calloc(1, sizeof(TAR_MEMBER));
+       tm = pg_calloc(1, sizeof(TAR_MEMBER));
 
 #ifndef WIN32
        tm->tmpFH = tmpfile();
@@ -432,7 +431,7 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode)
 #endif
 
        tm->AH = AH;
-       tm->targetFile = strdup(filename);
+       tm->targetFile = pg_strdup(filename);
    }
 
    tm->mode = mode;
@@ -665,7 +664,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt)
        ahprintf(AH, "\\.\n");
 
        /* Get a copy of the COPY statement and clean it up */
-       tmpCopy = strdup(te->copyStmt);
+       tmpCopy = pg_strdup(te->copyStmt);
        for (i = 0; i < strlen(tmpCopy); i++)
            tmpCopy[i] = pg_tolower((unsigned char) tmpCopy[i]);
 
@@ -1010,9 +1009,7 @@ tarPrintf(ArchiveHandle *AH, TAR_MEMBER *th, const char *fmt,...)
        if (p != NULL)
            free(p);
        bSize *= 2;
-       p = (char *) malloc(bSize);
-       if (p == NULL)
-           die_horribly(AH, modulename, "out of memory\n");
+       p = (char *) pg_malloc(bSize);
        va_start(ap, fmt);
        cnt = vsnprintf(p, bSize, fmt, ap);
        va_end(ap);
@@ -1125,7 +1122,7 @@ static TAR_MEMBER *
 _tarPositionTo(ArchiveHandle *AH, const char *filename)
 {
    lclContext *ctx = (lclContext *) AH->formatData;
-   TAR_MEMBER *th = calloc(1, sizeof(TAR_MEMBER));
+   TAR_MEMBER *th = pg_calloc(1, sizeof(TAR_MEMBER));
    char        c;
    char        header[512];
    size_t      i,
@@ -1295,7 +1292,7 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th)
                     tag, sum, chk, buf);
    }
 
-   th->targetFile = strdup(tag);
+   th->targetFile = pg_strdup(tag);
    th->fileLen = len;
 
    return 1;
index 28a527357f9e0bd8bec3333fc3867028d00fec22..76ff4d17e2c34a18594a54109aee5f6756789616 100644 (file)
@@ -57,6 +57,7 @@
 #include "libpq/libpq-fs.h"
 
 #include "pg_backup_archiver.h"
+#include "common.h"
 #include "dumputils.h"
 
 extern char *optarg;
@@ -438,7 +439,7 @@ main(int argc, char **argv)
                break;
 
            case 'S':           /* Username for superuser in plain text output */
-               outputSuperuser = strdup(optarg);
+               outputSuperuser = pg_strdup(optarg);
                break;
 
            case 't':           /* include table(s) */
@@ -1585,7 +1586,7 @@ makeTableDataInfo(TableInfo *tbinfo, bool oids)
 {
    TableDataInfo *tdinfo;
 
-   tdinfo = (TableDataInfo *) malloc(sizeof(TableDataInfo));
+   tdinfo = (TableDataInfo *) pg_malloc(sizeof(TableDataInfo));
 
    tdinfo->dobj.objType = DO_TABLE_DATA;
 
@@ -2181,7 +2182,7 @@ getBlobs(Archive *AH)
        /*
         * Each large object has its own BLOB archive entry.
         */
-       binfo = (BlobInfo *) malloc(ntups * sizeof(BlobInfo));
+       binfo = (BlobInfo *) pg_malloc(ntups * sizeof(BlobInfo));
 
        for (i = 0; i < ntups; i++)
        {
@@ -2190,13 +2191,13 @@ getBlobs(Archive *AH)
            binfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, 0));
            AssignDumpId(&binfo[i].dobj);
 
-           binfo[i].dobj.name = strdup(PQgetvalue(res, i, 0));
+           binfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, 0));
            if (!PQgetisnull(res, i, 1))
-               binfo[i].rolname = strdup(PQgetvalue(res, i, 1));
+               binfo[i].rolname = pg_strdup(PQgetvalue(res, i, 1));
            else
                binfo[i].rolname = "";
            if (!PQgetisnull(res, i, 2))
-               binfo[i].blobacl = strdup(PQgetvalue(res, i, 2));
+               binfo[i].blobacl = pg_strdup(PQgetvalue(res, i, 2));
            else
                binfo[i].blobacl = NULL;
        }
@@ -2205,11 +2206,11 @@ getBlobs(Archive *AH)
         * If we have any large objects, a "BLOBS" archive entry is needed.
         * This is just a placeholder for sorting; it carries no data now.
         */
-       bdata = (DumpableObject *) malloc(sizeof(DumpableObject));
+       bdata = (DumpableObject *) pg_malloc(sizeof(DumpableObject));
        bdata->objType = DO_BLOB_DATA;
        bdata->catId = nilCatalogId;
        AssignDumpId(bdata);
-       bdata->name = strdup("BLOBS");
+       bdata->name = pg_strdup("BLOBS");
    }
 
    PQclear(res);
@@ -2608,15 +2609,15 @@ getNamespaces(int *numNamespaces)
     */
    if (g_fout->remoteVersion < 70300)
    {
-       nsinfo = (NamespaceInfo *) malloc(2 * sizeof(NamespaceInfo));
+       nsinfo = (NamespaceInfo *) pg_malloc(2 * sizeof(NamespaceInfo));
 
        nsinfo[0].dobj.objType = DO_NAMESPACE;
        nsinfo[0].dobj.catId.tableoid = 0;
        nsinfo[0].dobj.catId.oid = 0;
        AssignDumpId(&nsinfo[0].dobj);
-       nsinfo[0].dobj.name = strdup("public");
-       nsinfo[0].rolname = strdup("");
-       nsinfo[0].nspacl = strdup("");
+       nsinfo[0].dobj.name = pg_strdup("public");
+       nsinfo[0].rolname = pg_strdup("");
+       nsinfo[0].nspacl = pg_strdup("");
 
        selectDumpableNamespace(&nsinfo[0]);
 
@@ -2624,9 +2625,9 @@ getNamespaces(int *numNamespaces)
        nsinfo[1].dobj.catId.tableoid = 0;
        nsinfo[1].dobj.catId.oid = 1;
        AssignDumpId(&nsinfo[1].dobj);
-       nsinfo[1].dobj.name = strdup("pg_catalog");
-       nsinfo[1].rolname = strdup("");
-       nsinfo[1].nspacl = strdup("");
+       nsinfo[1].dobj.name = pg_strdup("pg_catalog");
+       nsinfo[1].rolname = pg_strdup("");
+       nsinfo[1].nspacl = pg_strdup("");
 
        selectDumpableNamespace(&nsinfo[1]);
 
@@ -2655,7 +2656,7 @@ getNamespaces(int *numNamespaces)
 
    ntups = PQntuples(res);
 
-   nsinfo = (NamespaceInfo *) malloc(ntups * sizeof(NamespaceInfo));
+   nsinfo = (NamespaceInfo *) pg_malloc(ntups * sizeof(NamespaceInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -2669,9 +2670,9 @@ getNamespaces(int *numNamespaces)
        nsinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        nsinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&nsinfo[i].dobj);
-       nsinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_nspname));
-       nsinfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
-       nsinfo[i].nspacl = strdup(PQgetvalue(res, i, i_nspacl));
+       nsinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_nspname));
+       nsinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
+       nsinfo[i].nspacl = pg_strdup(PQgetvalue(res, i, i_nspacl));
 
        /* Decide whether to dump this namespace */
        selectDumpableNamespace(&nsinfo[i]);
@@ -2776,7 +2777,7 @@ getExtensions(int *numExtensions)
 
    ntups = PQntuples(res);
 
-   extinfo = (ExtensionInfo *) malloc(ntups * sizeof(ExtensionInfo));
+   extinfo = (ExtensionInfo *) pg_malloc(ntups * sizeof(ExtensionInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -2793,12 +2794,12 @@ getExtensions(int *numExtensions)
        extinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        extinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&extinfo[i].dobj);
-       extinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_extname));
-       extinfo[i].namespace = strdup(PQgetvalue(res, i, i_nspname));
+       extinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_extname));
+       extinfo[i].namespace = pg_strdup(PQgetvalue(res, i, i_nspname));
        extinfo[i].relocatable = *(PQgetvalue(res, i, i_extrelocatable)) == 't';
-       extinfo[i].extversion = strdup(PQgetvalue(res, i, i_extversion));
-       extinfo[i].extconfig = strdup(PQgetvalue(res, i, i_extconfig));
-       extinfo[i].extcondition = strdup(PQgetvalue(res, i, i_extcondition));
+       extinfo[i].extversion = pg_strdup(PQgetvalue(res, i, i_extversion));
+       extinfo[i].extconfig = pg_strdup(PQgetvalue(res, i, i_extconfig));
+       extinfo[i].extcondition = pg_strdup(PQgetvalue(res, i, i_extcondition));
 
        /* Decide whether we want to dump it */
        selectDumpableExtension(&(extinfo[i]));
@@ -2929,7 +2930,7 @@ getTypes(int *numTypes)
 
    ntups = PQntuples(res);
 
-   tyinfo = (TypeInfo *) malloc(ntups * sizeof(TypeInfo));
+   tyinfo = (TypeInfo *) pg_malloc(ntups * sizeof(TypeInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -2951,10 +2952,10 @@ getTypes(int *numTypes)
        tyinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        tyinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&tyinfo[i].dobj);
-       tyinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_typname));
+       tyinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_typname));
        tyinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_typnamespace)),
                                                 tyinfo[i].dobj.catId.oid);
-       tyinfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
+       tyinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
        tyinfo[i].typelem = atooid(PQgetvalue(res, i, i_typelem));
        tyinfo[i].typrelid = atooid(PQgetvalue(res, i, i_typrelid));
        tyinfo[i].typrelkind = *PQgetvalue(res, i, i_typrelkind);
@@ -2995,11 +2996,11 @@ getTypes(int *numTypes)
        if (tyinfo[i].dobj.dump && (tyinfo[i].typtype == TYPTYPE_BASE ||
                                    tyinfo[i].typtype == TYPTYPE_RANGE))
        {
-           stinfo = (ShellTypeInfo *) malloc(sizeof(ShellTypeInfo));
+           stinfo = (ShellTypeInfo *) pg_malloc(sizeof(ShellTypeInfo));
            stinfo->dobj.objType = DO_SHELL_TYPE;
            stinfo->dobj.catId = nilCatalogId;
            AssignDumpId(&stinfo->dobj);
-           stinfo->dobj.name = strdup(tyinfo[i].dobj.name);
+           stinfo->dobj.name = pg_strdup(tyinfo[i].dobj.name);
            stinfo->dobj.namespace = tyinfo[i].dobj.namespace;
            stinfo->baseType = &(tyinfo[i]);
            tyinfo[i].shellType = stinfo;
@@ -3134,7 +3135,7 @@ getOperators(int *numOprs)
    ntups = PQntuples(res);
    *numOprs = ntups;
 
-   oprinfo = (OprInfo *) malloc(ntups * sizeof(OprInfo));
+   oprinfo = (OprInfo *) pg_malloc(ntups * sizeof(OprInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -3149,10 +3150,10 @@ getOperators(int *numOprs)
        oprinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        oprinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&oprinfo[i].dobj);
-       oprinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_oprname));
+       oprinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_oprname));
        oprinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_oprnamespace)),
                                                  oprinfo[i].dobj.catId.oid);
-       oprinfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
+       oprinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
        oprinfo[i].oprcode = atooid(PQgetvalue(res, i, i_oprcode));
 
        /* Decide whether we want to dump it */
@@ -3218,7 +3219,7 @@ getCollations(int *numCollations)
    ntups = PQntuples(res);
    *numCollations = ntups;
 
-   collinfo = (CollInfo *) malloc(ntups * sizeof(CollInfo));
+   collinfo = (CollInfo *) pg_malloc(ntups * sizeof(CollInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -3232,10 +3233,10 @@ getCollations(int *numCollations)
        collinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        collinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&collinfo[i].dobj);
-       collinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_collname));
+       collinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_collname));
        collinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_collnamespace)),
                                                 collinfo[i].dobj.catId.oid);
-       collinfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
+       collinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
 
        /* Decide whether we want to dump it */
        selectDumpableObject(&(collinfo[i].dobj));
@@ -3296,7 +3297,7 @@ getConversions(int *numConversions)
    ntups = PQntuples(res);
    *numConversions = ntups;
 
-   convinfo = (ConvInfo *) malloc(ntups * sizeof(ConvInfo));
+   convinfo = (ConvInfo *) pg_malloc(ntups * sizeof(ConvInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -3310,10 +3311,10 @@ getConversions(int *numConversions)
        convinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        convinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&convinfo[i].dobj);
-       convinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_conname));
+       convinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_conname));
        convinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_connamespace)),
                                                 convinfo[i].dobj.catId.oid);
-       convinfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
+       convinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
 
        /* Decide whether we want to dump it */
        selectDumpableObject(&(convinfo[i].dobj));
@@ -3386,7 +3387,7 @@ getOpclasses(int *numOpclasses)
    ntups = PQntuples(res);
    *numOpclasses = ntups;
 
-   opcinfo = (OpclassInfo *) malloc(ntups * sizeof(OpclassInfo));
+   opcinfo = (OpclassInfo *) pg_malloc(ntups * sizeof(OpclassInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -3400,10 +3401,10 @@ getOpclasses(int *numOpclasses)
        opcinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        opcinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&opcinfo[i].dobj);
-       opcinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_opcname));
+       opcinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opcname));
        opcinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_opcnamespace)),
                                                  opcinfo[i].dobj.catId.oid);
-       opcinfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
+       opcinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
 
        /* Decide whether we want to dump it */
        selectDumpableObject(&(opcinfo[i].dobj));
@@ -3473,7 +3474,7 @@ getOpfamilies(int *numOpfamilies)
    ntups = PQntuples(res);
    *numOpfamilies = ntups;
 
-   opfinfo = (OpfamilyInfo *) malloc(ntups * sizeof(OpfamilyInfo));
+   opfinfo = (OpfamilyInfo *) pg_malloc(ntups * sizeof(OpfamilyInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -3487,10 +3488,10 @@ getOpfamilies(int *numOpfamilies)
        opfinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        opfinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&opfinfo[i].dobj);
-       opfinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_opfname));
+       opfinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opfname));
        opfinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_opfnamespace)),
                                                  opfinfo[i].dobj.catId.oid);
-       opfinfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
+       opfinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
 
        /* Decide whether we want to dump it */
        selectDumpableObject(&(opfinfo[i].dobj));
@@ -3613,7 +3614,7 @@ getAggregates(int *numAggs)
    ntups = PQntuples(res);
    *numAggs = ntups;
 
-   agginfo = (AggInfo *) malloc(ntups * sizeof(AggInfo));
+   agginfo = (AggInfo *) pg_malloc(ntups * sizeof(AggInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -3630,22 +3631,22 @@ getAggregates(int *numAggs)
        agginfo[i].aggfn.dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        agginfo[i].aggfn.dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&agginfo[i].aggfn.dobj);
-       agginfo[i].aggfn.dobj.name = strdup(PQgetvalue(res, i, i_aggname));
+       agginfo[i].aggfn.dobj.name = pg_strdup(PQgetvalue(res, i, i_aggname));
        agginfo[i].aggfn.dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_aggnamespace)),
                                            agginfo[i].aggfn.dobj.catId.oid);
-       agginfo[i].aggfn.rolname = strdup(PQgetvalue(res, i, i_rolname));
+       agginfo[i].aggfn.rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
        if (strlen(agginfo[i].aggfn.rolname) == 0)
            write_msg(NULL, "WARNING: owner of aggregate function \"%s\" appears to be invalid\n",
                      agginfo[i].aggfn.dobj.name);
        agginfo[i].aggfn.lang = InvalidOid;     /* not currently interesting */
        agginfo[i].aggfn.prorettype = InvalidOid;       /* not saved */
-       agginfo[i].aggfn.proacl = strdup(PQgetvalue(res, i, i_aggacl));
+       agginfo[i].aggfn.proacl = pg_strdup(PQgetvalue(res, i, i_aggacl));
        agginfo[i].aggfn.nargs = atoi(PQgetvalue(res, i, i_pronargs));
        if (agginfo[i].aggfn.nargs == 0)
            agginfo[i].aggfn.argtypes = NULL;
        else
        {
-           agginfo[i].aggfn.argtypes = (Oid *) malloc(agginfo[i].aggfn.nargs * sizeof(Oid));
+           agginfo[i].aggfn.argtypes = (Oid *) pg_malloc(agginfo[i].aggfn.nargs * sizeof(Oid));
            if (g_fout->remoteVersion >= 70300)
                parseOidArray(PQgetvalue(res, i, i_proargtypes),
                              agginfo[i].aggfn.argtypes,
@@ -3775,7 +3776,7 @@ getFuncs(int *numFuncs)
 
    *numFuncs = ntups;
 
-   finfo = (FuncInfo *) calloc(ntups, sizeof(FuncInfo));
+   finfo = (FuncInfo *) pg_calloc(ntups, sizeof(FuncInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -3794,20 +3795,20 @@ getFuncs(int *numFuncs)
        finfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        finfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&finfo[i].dobj);
-       finfo[i].dobj.name = strdup(PQgetvalue(res, i, i_proname));
+       finfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_proname));
        finfo[i].dobj.namespace =
            findNamespace(atooid(PQgetvalue(res, i, i_pronamespace)),
                          finfo[i].dobj.catId.oid);
-       finfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
+       finfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
        finfo[i].lang = atooid(PQgetvalue(res, i, i_prolang));
        finfo[i].prorettype = atooid(PQgetvalue(res, i, i_prorettype));
-       finfo[i].proacl = strdup(PQgetvalue(res, i, i_proacl));
+       finfo[i].proacl = pg_strdup(PQgetvalue(res, i, i_proacl));
        finfo[i].nargs = atoi(PQgetvalue(res, i, i_pronargs));
        if (finfo[i].nargs == 0)
            finfo[i].argtypes = NULL;
        else
        {
-           finfo[i].argtypes = (Oid *) malloc(finfo[i].nargs * sizeof(Oid));
+           finfo[i].argtypes = (Oid *) pg_malloc(finfo[i].nargs * sizeof(Oid));
            parseOidArray(PQgetvalue(res, i, i_proargtypes),
                          finfo[i].argtypes, finfo[i].nargs);
        }
@@ -4204,7 +4205,7 @@ getTables(int *numTables)
     * only one, because we don't yet know which tables might be inheritance
     * ancestors of the target table.
     */
-   tblinfo = (TableInfo *) calloc(ntups, sizeof(TableInfo));
+   tblinfo = (TableInfo *) pg_calloc(ntups, sizeof(TableInfo));
 
    i_reltableoid = PQfnumber(res, "tableoid");
    i_reloid = PQfnumber(res, "oid");
@@ -4250,11 +4251,11 @@ getTables(int *numTables)
        tblinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_reltableoid));
        tblinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_reloid));
        AssignDumpId(&tblinfo[i].dobj);
-       tblinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_relname));
+       tblinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_relname));
        tblinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_relnamespace)),
                                                  tblinfo[i].dobj.catId.oid);
-       tblinfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
-       tblinfo[i].relacl = strdup(PQgetvalue(res, i, i_relacl));
+       tblinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
+       tblinfo[i].relacl = pg_strdup(PQgetvalue(res, i, i_relacl));
        tblinfo[i].relkind = *(PQgetvalue(res, i, i_relkind));
        tblinfo[i].relpersistence = *(PQgetvalue(res, i, i_relpersistence));
        tblinfo[i].hasindex = (strcmp(PQgetvalue(res, i, i_relhasindex), "t") == 0);
@@ -4267,7 +4268,7 @@ getTables(int *numTables)
        if (PQgetisnull(res, i, i_reloftype))
            tblinfo[i].reloftype = NULL;
        else
-           tblinfo[i].reloftype = strdup(PQgetvalue(res, i, i_reloftype));
+           tblinfo[i].reloftype = pg_strdup(PQgetvalue(res, i, i_reloftype));
        tblinfo[i].ncheck = atoi(PQgetvalue(res, i, i_relchecks));
        if (PQgetisnull(res, i, i_owning_tab))
        {
@@ -4279,9 +4280,9 @@ getTables(int *numTables)
            tblinfo[i].owning_tab = atooid(PQgetvalue(res, i, i_owning_tab));
            tblinfo[i].owning_col = atoi(PQgetvalue(res, i, i_owning_col));
        }
-       tblinfo[i].reltablespace = strdup(PQgetvalue(res, i, i_reltablespace));
-       tblinfo[i].reloptions = strdup(PQgetvalue(res, i, i_reloptions));
-       tblinfo[i].toast_reloptions = strdup(PQgetvalue(res, i, i_toastreloptions));
+       tblinfo[i].reltablespace = pg_strdup(PQgetvalue(res, i, i_reltablespace));
+       tblinfo[i].reloptions = pg_strdup(PQgetvalue(res, i, i_reloptions));
+       tblinfo[i].toast_reloptions = pg_strdup(PQgetvalue(res, i, i_toastreloptions));
 
        /* other fields were zeroed above */
 
@@ -4395,7 +4396,7 @@ getInherits(int *numInherits)
 
    *numInherits = ntups;
 
-   inhinfo = (InhInfo *) malloc(ntups * sizeof(InhInfo));
+   inhinfo = (InhInfo *) pg_malloc(ntups * sizeof(InhInfo));
 
    i_inhrelid = PQfnumber(res, "inhrelid");
    i_inhparent = PQfnumber(res, "inhparent");
@@ -4660,8 +4661,8 @@ getIndexes(TableInfo tblinfo[], int numTables)
        i_tablespace = PQfnumber(res, "tablespace");
        i_options = PQfnumber(res, "options");
 
-       indxinfo = (IndxInfo *) malloc(ntups * sizeof(IndxInfo));
-       constrinfo = (ConstraintInfo *) malloc(ntups * sizeof(ConstraintInfo));
+       indxinfo = (IndxInfo *) pg_malloc(ntups * sizeof(IndxInfo));
+       constrinfo = (ConstraintInfo *) pg_malloc(ntups * sizeof(ConstraintInfo));
 
        for (j = 0; j < ntups; j++)
        {
@@ -4671,13 +4672,13 @@ getIndexes(TableInfo tblinfo[], int numTables)
            indxinfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_tableoid));
            indxinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
            AssignDumpId(&indxinfo[j].dobj);
-           indxinfo[j].dobj.name = strdup(PQgetvalue(res, j, i_indexname));
+           indxinfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_indexname));
            indxinfo[j].dobj.namespace = tbinfo->dobj.namespace;
            indxinfo[j].indextable = tbinfo;
-           indxinfo[j].indexdef = strdup(PQgetvalue(res, j, i_indexdef));
+           indxinfo[j].indexdef = pg_strdup(PQgetvalue(res, j, i_indexdef));
            indxinfo[j].indnkeys = atoi(PQgetvalue(res, j, i_indnkeys));
-           indxinfo[j].tablespace = strdup(PQgetvalue(res, j, i_tablespace));
-           indxinfo[j].options = strdup(PQgetvalue(res, j, i_options));
+           indxinfo[j].tablespace = pg_strdup(PQgetvalue(res, j, i_tablespace));
+           indxinfo[j].options = pg_strdup(PQgetvalue(res, j, i_options));
 
            /*
             * In pre-7.4 releases, indkeys may contain more entries than
@@ -4688,7 +4689,7 @@ getIndexes(TableInfo tblinfo[], int numTables)
             * have to allocate enough space to keep parseOidArray from
             * complaining.
             */
-           indxinfo[j].indkeys = (Oid *) malloc(INDEX_MAX_KEYS * sizeof(Oid));
+           indxinfo[j].indkeys = (Oid *) pg_malloc(INDEX_MAX_KEYS * sizeof(Oid));
            parseOidArray(PQgetvalue(res, j, i_indkey),
                          indxinfo[j].indkeys, INDEX_MAX_KEYS);
            indxinfo[j].indisclustered = (PQgetvalue(res, j, i_indisclustered)[0] == 't');
@@ -4707,13 +4708,13 @@ getIndexes(TableInfo tblinfo[], int numTables)
                constrinfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_contableoid));
                constrinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_conoid));
                AssignDumpId(&constrinfo[j].dobj);
-               constrinfo[j].dobj.name = strdup(PQgetvalue(res, j, i_conname));
+               constrinfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_conname));
                constrinfo[j].dobj.namespace = tbinfo->dobj.namespace;
                constrinfo[j].contable = tbinfo;
                constrinfo[j].condomain = NULL;
                constrinfo[j].contype = contype;
                if (contype == 'x')
-                   constrinfo[j].condef = strdup(PQgetvalue(res, j, i_condef));
+                   constrinfo[j].condef = pg_strdup(PQgetvalue(res, j, i_condef));
                else
                    constrinfo[j].condef = NULL;
                constrinfo[j].confrelid = InvalidOid;
@@ -4808,7 +4809,7 @@ getConstraints(TableInfo tblinfo[], int numTables)
        i_confrelid = PQfnumber(res, "confrelid");
        i_condef = PQfnumber(res, "condef");
 
-       constrinfo = (ConstraintInfo *) malloc(ntups * sizeof(ConstraintInfo));
+       constrinfo = (ConstraintInfo *) pg_malloc(ntups * sizeof(ConstraintInfo));
 
        for (j = 0; j < ntups; j++)
        {
@@ -4816,12 +4817,12 @@ getConstraints(TableInfo tblinfo[], int numTables)
            constrinfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_contableoid));
            constrinfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_conoid));
            AssignDumpId(&constrinfo[j].dobj);
-           constrinfo[j].dobj.name = strdup(PQgetvalue(res, j, i_conname));
+           constrinfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_conname));
            constrinfo[j].dobj.namespace = tbinfo->dobj.namespace;
            constrinfo[j].contable = tbinfo;
            constrinfo[j].condomain = NULL;
            constrinfo[j].contype = 'f';
-           constrinfo[j].condef = strdup(PQgetvalue(res, j, i_condef));
+           constrinfo[j].condef = pg_strdup(PQgetvalue(res, j, i_condef));
            constrinfo[j].confrelid = atooid(PQgetvalue(res, j, i_confrelid));
            constrinfo[j].conindex = 0;
            constrinfo[j].condeferrable = false;
@@ -4891,7 +4892,7 @@ getDomainConstraints(TypeInfo *tyinfo)
    i_conname = PQfnumber(res, "conname");
    i_consrc = PQfnumber(res, "consrc");
 
-   constrinfo = (ConstraintInfo *) malloc(ntups * sizeof(ConstraintInfo));
+   constrinfo = (ConstraintInfo *) pg_malloc(ntups * sizeof(ConstraintInfo));
 
    tyinfo->nDomChecks = ntups;
    tyinfo->domChecks = constrinfo;
@@ -4902,12 +4903,12 @@ getDomainConstraints(TypeInfo *tyinfo)
        constrinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        constrinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&constrinfo[i].dobj);
-       constrinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_conname));
+       constrinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_conname));
        constrinfo[i].dobj.namespace = tyinfo->dobj.namespace;
        constrinfo[i].contable = NULL;
        constrinfo[i].condomain = tyinfo;
        constrinfo[i].contype = 'c';
-       constrinfo[i].condef = strdup(PQgetvalue(res, i, i_consrc));
+       constrinfo[i].condef = pg_strdup(PQgetvalue(res, i, i_consrc));
        constrinfo[i].confrelid = InvalidOid;
        constrinfo[i].conindex = 0;
        constrinfo[i].condeferrable = false;
@@ -4989,7 +4990,7 @@ getRules(int *numRules)
 
    *numRules = ntups;
 
-   ruleinfo = (RuleInfo *) malloc(ntups * sizeof(RuleInfo));
+   ruleinfo = (RuleInfo *) pg_malloc(ntups * sizeof(RuleInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -5007,7 +5008,7 @@ getRules(int *numRules)
        ruleinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        ruleinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&ruleinfo[i].dobj);
-       ruleinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_rulename));
+       ruleinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_rulename));
        ruletableoid = atooid(PQgetvalue(res, i, i_ruletable));
        ruleinfo[i].ruletable = findTableByOid(ruletableoid);
        if (ruleinfo[i].ruletable == NULL)
@@ -5211,7 +5212,7 @@ getTriggers(TableInfo tblinfo[], int numTables)
        i_tginitdeferred = PQfnumber(res, "tginitdeferred");
        i_tgdef = PQfnumber(res, "tgdef");
 
-       tginfo = (TriggerInfo *) malloc(ntups * sizeof(TriggerInfo));
+       tginfo = (TriggerInfo *) pg_malloc(ntups * sizeof(TriggerInfo));
 
        for (j = 0; j < ntups; j++)
        {
@@ -5219,13 +5220,13 @@ getTriggers(TableInfo tblinfo[], int numTables)
            tginfo[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, i_tableoid));
            tginfo[j].dobj.catId.oid = atooid(PQgetvalue(res, j, i_oid));
            AssignDumpId(&tginfo[j].dobj);
-           tginfo[j].dobj.name = strdup(PQgetvalue(res, j, i_tgname));
+           tginfo[j].dobj.name = pg_strdup(PQgetvalue(res, j, i_tgname));
            tginfo[j].dobj.namespace = tbinfo->dobj.namespace;
            tginfo[j].tgtable = tbinfo;
            tginfo[j].tgenabled = *(PQgetvalue(res, j, i_tgenabled));
            if (i_tgdef >= 0)
            {
-               tginfo[j].tgdef = strdup(PQgetvalue(res, j, i_tgdef));
+               tginfo[j].tgdef = pg_strdup(PQgetvalue(res, j, i_tgdef));
 
                /* remaining fields are not valid if we have tgdef */
                tginfo[j].tgfname = NULL;
@@ -5243,17 +5244,17 @@ getTriggers(TableInfo tblinfo[], int numTables)
            {
                tginfo[j].tgdef = NULL;
 
-               tginfo[j].tgfname = strdup(PQgetvalue(res, j, i_tgfname));
+               tginfo[j].tgfname = pg_strdup(PQgetvalue(res, j, i_tgfname));
                tginfo[j].tgtype = atoi(PQgetvalue(res, j, i_tgtype));
                tginfo[j].tgnargs = atoi(PQgetvalue(res, j, i_tgnargs));
-               tginfo[j].tgargs = strdup(PQgetvalue(res, j, i_tgargs));
+               tginfo[j].tgargs = pg_strdup(PQgetvalue(res, j, i_tgargs));
                tginfo[j].tgisconstraint = *(PQgetvalue(res, j, i_tgisconstraint)) == 't';
                tginfo[j].tgdeferrable = *(PQgetvalue(res, j, i_tgdeferrable)) == 't';
                tginfo[j].tginitdeferred = *(PQgetvalue(res, j, i_tginitdeferred)) == 't';
 
                if (tginfo[j].tgisconstraint)
                {
-                   tginfo[j].tgconstrname = strdup(PQgetvalue(res, j, i_tgconstrname));
+                   tginfo[j].tgconstrname = pg_strdup(PQgetvalue(res, j, i_tgconstrname));
                    tginfo[j].tgconstrrelid = atooid(PQgetvalue(res, j, i_tgconstrrelid));
                    if (OidIsValid(tginfo[j].tgconstrrelid))
                    {
@@ -5264,7 +5265,7 @@ getTriggers(TableInfo tblinfo[], int numTables)
                                      tginfo[j].tgconstrrelid);
                            exit_nicely();
                        }
-                       tginfo[j].tgconstrrelname = strdup(PQgetvalue(res, j, i_tgconstrrelname));
+                       tginfo[j].tgconstrrelname = pg_strdup(PQgetvalue(res, j, i_tgconstrrelname));
                    }
                    else
                        tginfo[j].tgconstrrelname = NULL;
@@ -5381,7 +5382,7 @@ getProcLangs(int *numProcLangs)
 
    *numProcLangs = ntups;
 
-   planginfo = (ProcLangInfo *) malloc(ntups * sizeof(ProcLangInfo));
+   planginfo = (ProcLangInfo *) pg_malloc(ntups * sizeof(ProcLangInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -5401,7 +5402,7 @@ getProcLangs(int *numProcLangs)
        planginfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&planginfo[i].dobj);
 
-       planginfo[i].dobj.name = strdup(PQgetvalue(res, i, i_lanname));
+       planginfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_lanname));
        planginfo[i].lanpltrusted = *(PQgetvalue(res, i, i_lanpltrusted)) == 't';
        planginfo[i].lanplcallfoid = atooid(PQgetvalue(res, i, i_lanplcallfoid));
        if (i_laninline >= 0)
@@ -5413,13 +5414,13 @@ getProcLangs(int *numProcLangs)
        else
            planginfo[i].lanvalidator = InvalidOid;
        if (i_lanacl >= 0)
-           planginfo[i].lanacl = strdup(PQgetvalue(res, i, i_lanacl));
+           planginfo[i].lanacl = pg_strdup(PQgetvalue(res, i, i_lanacl));
        else
-           planginfo[i].lanacl = strdup("{=U}");
+           planginfo[i].lanacl = pg_strdup("{=U}");
        if (i_lanowner >= 0)
-           planginfo[i].lanowner = strdup(PQgetvalue(res, i, i_lanowner));
+           planginfo[i].lanowner = pg_strdup(PQgetvalue(res, i, i_lanowner));
        else
-           planginfo[i].lanowner = strdup("");
+           planginfo[i].lanowner = pg_strdup("");
 
        if (g_fout->remoteVersion < 70300)
        {
@@ -5502,7 +5503,7 @@ getCasts(int *numCasts)
 
    *numCasts = ntups;
 
-   castinfo = (CastInfo *) malloc(ntups * sizeof(CastInfo));
+   castinfo = (CastInfo *) pg_malloc(ntups * sizeof(CastInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -5784,24 +5785,24 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
        i_attfdwoptions = PQfnumber(res, "attfdwoptions");
 
        tbinfo->numatts = ntups;
-       tbinfo->attnames = (char **) malloc(ntups * sizeof(char *));
-       tbinfo->atttypnames = (char **) malloc(ntups * sizeof(char *));
-       tbinfo->atttypmod = (int *) malloc(ntups * sizeof(int));
-       tbinfo->attstattarget = (int *) malloc(ntups * sizeof(int));
-       tbinfo->attstorage = (char *) malloc(ntups * sizeof(char));
-       tbinfo->typstorage = (char *) malloc(ntups * sizeof(char));
-       tbinfo->attisdropped = (bool *) malloc(ntups * sizeof(bool));
-       tbinfo->attlen = (int *) malloc(ntups * sizeof(int));
-       tbinfo->attalign = (char *) malloc(ntups * sizeof(char));
-       tbinfo->attislocal = (bool *) malloc(ntups * sizeof(bool));
-       tbinfo->notnull = (bool *) malloc(ntups * sizeof(bool));
-       tbinfo->attrdefs = (AttrDefInfo **) malloc(ntups * sizeof(AttrDefInfo *));
-       tbinfo->attoptions = (char **) malloc(ntups * sizeof(char *));
-       tbinfo->attcollation = (Oid *) malloc(ntups * sizeof(Oid));
-       tbinfo->attfdwoptions = (char **) malloc(ntups * sizeof(char *));
-       tbinfo->inhAttrs = (bool *) malloc(ntups * sizeof(bool));
-       tbinfo->inhAttrDef = (bool *) malloc(ntups * sizeof(bool));
-       tbinfo->inhNotNull = (bool *) malloc(ntups * sizeof(bool));
+       tbinfo->attnames = (char **) pg_malloc(ntups * sizeof(char *));
+       tbinfo->atttypnames = (char **) pg_malloc(ntups * sizeof(char *));
+       tbinfo->atttypmod = (int *) pg_malloc(ntups * sizeof(int));
+       tbinfo->attstattarget = (int *) pg_malloc(ntups * sizeof(int));
+       tbinfo->attstorage = (char *) pg_malloc(ntups * sizeof(char));
+       tbinfo->typstorage = (char *) pg_malloc(ntups * sizeof(char));
+       tbinfo->attisdropped = (bool *) pg_malloc(ntups * sizeof(bool));
+       tbinfo->attlen = (int *) pg_malloc(ntups * sizeof(int));
+       tbinfo->attalign = (char *) pg_malloc(ntups * sizeof(char));
+       tbinfo->attislocal = (bool *) pg_malloc(ntups * sizeof(bool));
+       tbinfo->notnull = (bool *) pg_malloc(ntups * sizeof(bool));
+       tbinfo->attrdefs = (AttrDefInfo **) pg_malloc(ntups * sizeof(AttrDefInfo *));
+       tbinfo->attoptions = (char **) pg_malloc(ntups * sizeof(char *));
+       tbinfo->attcollation = (Oid *) pg_malloc(ntups * sizeof(Oid));
+       tbinfo->attfdwoptions = (char **) pg_malloc(ntups * sizeof(char *));
+       tbinfo->inhAttrs = (bool *) pg_malloc(ntups * sizeof(bool));
+       tbinfo->inhAttrDef = (bool *) pg_malloc(ntups * sizeof(bool));
+       tbinfo->inhNotNull = (bool *) pg_malloc(ntups * sizeof(bool));
        hasdefaults = false;
 
        for (j = 0; j < ntups; j++)
@@ -5812,8 +5813,8 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
                          tbinfo->dobj.name);
                exit_nicely();
            }
-           tbinfo->attnames[j] = strdup(PQgetvalue(res, j, i_attname));
-           tbinfo->atttypnames[j] = strdup(PQgetvalue(res, j, i_atttypname));
+           tbinfo->attnames[j] = pg_strdup(PQgetvalue(res, j, i_attname));
+           tbinfo->atttypnames[j] = pg_strdup(PQgetvalue(res, j, i_atttypname));
            tbinfo->atttypmod[j] = atoi(PQgetvalue(res, j, i_atttypmod));
            tbinfo->attstattarget[j] = atoi(PQgetvalue(res, j, i_attstattarget));
            tbinfo->attstorage[j] = *(PQgetvalue(res, j, i_attstorage));
@@ -5823,9 +5824,9 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
            tbinfo->attalign[j] = *(PQgetvalue(res, j, i_attalign));
            tbinfo->attislocal[j] = (PQgetvalue(res, j, i_attislocal)[0] == 't');
            tbinfo->notnull[j] = (PQgetvalue(res, j, i_attnotnull)[0] == 't');
-           tbinfo->attoptions[j] = strdup(PQgetvalue(res, j, i_attoptions));
+           tbinfo->attoptions[j] = pg_strdup(PQgetvalue(res, j, i_attoptions));
            tbinfo->attcollation[j] = atooid(PQgetvalue(res, j, i_attcollation));
-           tbinfo->attfdwoptions[j] = strdup(PQgetvalue(res, j, i_attfdwoptions));
+           tbinfo->attfdwoptions[j] = pg_strdup(PQgetvalue(res, j, i_attfdwoptions));
            tbinfo->attrdefs[j] = NULL; /* fix below */
            if (PQgetvalue(res, j, i_atthasdef)[0] == 't')
                hasdefaults = true;
@@ -5889,7 +5890,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
            check_sql_result(res, g_conn, q->data, PGRES_TUPLES_OK);
 
            numDefaults = PQntuples(res);
-           attrdefs = (AttrDefInfo *) malloc(numDefaults * sizeof(AttrDefInfo));
+           attrdefs = (AttrDefInfo *) pg_malloc(numDefaults * sizeof(AttrDefInfo));
 
            for (j = 0; j < numDefaults; j++)
            {
@@ -5901,9 +5902,9 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
                AssignDumpId(&attrdefs[j].dobj);
                attrdefs[j].adtable = tbinfo;
                attrdefs[j].adnum = adnum = atoi(PQgetvalue(res, j, 2));
-               attrdefs[j].adef_expr = strdup(PQgetvalue(res, j, 3));
+               attrdefs[j].adef_expr = pg_strdup(PQgetvalue(res, j, 3));
 
-               attrdefs[j].dobj.name = strdup(tbinfo->dobj.name);
+               attrdefs[j].dobj.name = pg_strdup(tbinfo->dobj.name);
                attrdefs[j].dobj.namespace = tbinfo->dobj.namespace;
 
                attrdefs[j].dobj.dump = tbinfo->dobj.dump;
@@ -6048,7 +6049,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
                exit_nicely();
            }
 
-           constrs = (ConstraintInfo *) malloc(numConstrs * sizeof(ConstraintInfo));
+           constrs = (ConstraintInfo *) pg_malloc(numConstrs * sizeof(ConstraintInfo));
            tbinfo->checkexprs = constrs;
 
            for (j = 0; j < numConstrs; j++)
@@ -6059,12 +6060,12 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
                constrs[j].dobj.catId.tableoid = atooid(PQgetvalue(res, j, 0));
                constrs[j].dobj.catId.oid = atooid(PQgetvalue(res, j, 1));
                AssignDumpId(&constrs[j].dobj);
-               constrs[j].dobj.name = strdup(PQgetvalue(res, j, 2));
+               constrs[j].dobj.name = pg_strdup(PQgetvalue(res, j, 2));
                constrs[j].dobj.namespace = tbinfo->dobj.namespace;
                constrs[j].contable = tbinfo;
                constrs[j].condomain = NULL;
                constrs[j].contype = 'c';
-               constrs[j].condef = strdup(PQgetvalue(res, j, 3));
+               constrs[j].condef = pg_strdup(PQgetvalue(res, j, 3));
                constrs[j].confrelid = InvalidOid;
                constrs[j].conindex = 0;
                constrs[j].condeferrable = false;
@@ -6157,7 +6158,7 @@ getTSParsers(int *numTSParsers)
    ntups = PQntuples(res);
    *numTSParsers = ntups;
 
-   prsinfo = (TSParserInfo *) malloc(ntups * sizeof(TSParserInfo));
+   prsinfo = (TSParserInfo *) pg_malloc(ntups * sizeof(TSParserInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -6175,7 +6176,7 @@ getTSParsers(int *numTSParsers)
        prsinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        prsinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&prsinfo[i].dobj);
-       prsinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_prsname));
+       prsinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_prsname));
        prsinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_prsnamespace)),
                                                  prsinfo[i].dobj.catId.oid);
        prsinfo[i].prsstart = atooid(PQgetvalue(res, i, i_prsstart));
@@ -6240,7 +6241,7 @@ getTSDictionaries(int *numTSDicts)
    ntups = PQntuples(res);
    *numTSDicts = ntups;
 
-   dictinfo = (TSDictInfo *) malloc(ntups * sizeof(TSDictInfo));
+   dictinfo = (TSDictInfo *) pg_malloc(ntups * sizeof(TSDictInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -6256,15 +6257,15 @@ getTSDictionaries(int *numTSDicts)
        dictinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        dictinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&dictinfo[i].dobj);
-       dictinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_dictname));
+       dictinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_dictname));
        dictinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_dictnamespace)),
                                                 dictinfo[i].dobj.catId.oid);
-       dictinfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
+       dictinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
        dictinfo[i].dicttemplate = atooid(PQgetvalue(res, i, i_dicttemplate));
        if (PQgetisnull(res, i, i_dictinitoption))
            dictinfo[i].dictinitoption = NULL;
        else
-           dictinfo[i].dictinitoption = strdup(PQgetvalue(res, i, i_dictinitoption));
+           dictinfo[i].dictinitoption = pg_strdup(PQgetvalue(res, i, i_dictinitoption));
 
        /* Decide whether we want to dump it */
        selectDumpableObject(&(dictinfo[i].dobj));
@@ -6319,7 +6320,7 @@ getTSTemplates(int *numTSTemplates)
    ntups = PQntuples(res);
    *numTSTemplates = ntups;
 
-   tmplinfo = (TSTemplateInfo *) malloc(ntups * sizeof(TSTemplateInfo));
+   tmplinfo = (TSTemplateInfo *) pg_malloc(ntups * sizeof(TSTemplateInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -6334,7 +6335,7 @@ getTSTemplates(int *numTSTemplates)
        tmplinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        tmplinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&tmplinfo[i].dobj);
-       tmplinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_tmplname));
+       tmplinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_tmplname));
        tmplinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_tmplnamespace)),
                                                 tmplinfo[i].dobj.catId.oid);
        tmplinfo[i].tmplinit = atooid(PQgetvalue(res, i, i_tmplinit));
@@ -6394,7 +6395,7 @@ getTSConfigurations(int *numTSConfigs)
    ntups = PQntuples(res);
    *numTSConfigs = ntups;
 
-   cfginfo = (TSConfigInfo *) malloc(ntups * sizeof(TSConfigInfo));
+   cfginfo = (TSConfigInfo *) pg_malloc(ntups * sizeof(TSConfigInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -6409,10 +6410,10 @@ getTSConfigurations(int *numTSConfigs)
        cfginfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        cfginfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&cfginfo[i].dobj);
-       cfginfo[i].dobj.name = strdup(PQgetvalue(res, i, i_cfgname));
+       cfginfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_cfgname));
        cfginfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_cfgnamespace)),
                                                  cfginfo[i].dobj.catId.oid);
-       cfginfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
+       cfginfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
        cfginfo[i].cfgparser = atooid(PQgetvalue(res, i, i_cfgparser));
 
        /* Decide whether we want to dump it */
@@ -6493,7 +6494,7 @@ getForeignDataWrappers(int *numForeignDataWrappers)
    ntups = PQntuples(res);
    *numForeignDataWrappers = ntups;
 
-   fdwinfo = (FdwInfo *) malloc(ntups * sizeof(FdwInfo));
+   fdwinfo = (FdwInfo *) pg_malloc(ntups * sizeof(FdwInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -6510,13 +6511,13 @@ getForeignDataWrappers(int *numForeignDataWrappers)
        fdwinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        fdwinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&fdwinfo[i].dobj);
-       fdwinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_fdwname));
+       fdwinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_fdwname));
        fdwinfo[i].dobj.namespace = NULL;
-       fdwinfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
-       fdwinfo[i].fdwhandler = strdup(PQgetvalue(res, i, i_fdwhandler));
-       fdwinfo[i].fdwvalidator = strdup(PQgetvalue(res, i, i_fdwvalidator));
-       fdwinfo[i].fdwoptions = strdup(PQgetvalue(res, i, i_fdwoptions));
-       fdwinfo[i].fdwacl = strdup(PQgetvalue(res, i, i_fdwacl));
+       fdwinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
+       fdwinfo[i].fdwhandler = pg_strdup(PQgetvalue(res, i, i_fdwhandler));
+       fdwinfo[i].fdwvalidator = pg_strdup(PQgetvalue(res, i, i_fdwvalidator));
+       fdwinfo[i].fdwoptions = pg_strdup(PQgetvalue(res, i, i_fdwoptions));
+       fdwinfo[i].fdwacl = pg_strdup(PQgetvalue(res, i, i_fdwacl));
 
        /* Decide whether we want to dump it */
        selectDumpableObject(&(fdwinfo[i].dobj));
@@ -6580,7 +6581,7 @@ getForeignServers(int *numForeignServers)
    ntups = PQntuples(res);
    *numForeignServers = ntups;
 
-   srvinfo = (ForeignServerInfo *) malloc(ntups * sizeof(ForeignServerInfo));
+   srvinfo = (ForeignServerInfo *) pg_malloc(ntups * sizeof(ForeignServerInfo));
 
    i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
@@ -6598,14 +6599,14 @@ getForeignServers(int *numForeignServers)
        srvinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        srvinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&srvinfo[i].dobj);
-       srvinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_srvname));
+       srvinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_srvname));
        srvinfo[i].dobj.namespace = NULL;
-       srvinfo[i].rolname = strdup(PQgetvalue(res, i, i_rolname));
+       srvinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
        srvinfo[i].srvfdw = atooid(PQgetvalue(res, i, i_srvfdw));
-       srvinfo[i].srvtype = strdup(PQgetvalue(res, i, i_srvtype));
-       srvinfo[i].srvversion = strdup(PQgetvalue(res, i, i_srvversion));
-       srvinfo[i].srvoptions = strdup(PQgetvalue(res, i, i_srvoptions));
-       srvinfo[i].srvacl = strdup(PQgetvalue(res, i, i_srvacl));
+       srvinfo[i].srvtype = pg_strdup(PQgetvalue(res, i, i_srvtype));
+       srvinfo[i].srvversion = pg_strdup(PQgetvalue(res, i, i_srvversion));
+       srvinfo[i].srvoptions = pg_strdup(PQgetvalue(res, i, i_srvoptions));
+       srvinfo[i].srvacl = pg_strdup(PQgetvalue(res, i, i_srvacl));
 
        /* Decide whether we want to dump it */
        selectDumpableObject(&(srvinfo[i].dobj));
@@ -6665,7 +6666,7 @@ getDefaultACLs(int *numDefaultACLs)
    ntups = PQntuples(res);
    *numDefaultACLs = ntups;
 
-   daclinfo = (DefaultACLInfo *) malloc(ntups * sizeof(DefaultACLInfo));
+   daclinfo = (DefaultACLInfo *) pg_malloc(ntups * sizeof(DefaultACLInfo));
 
    i_oid = PQfnumber(res, "oid");
    i_tableoid = PQfnumber(res, "tableoid");
@@ -6683,7 +6684,7 @@ getDefaultACLs(int *numDefaultACLs)
        daclinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&daclinfo[i].dobj);
        /* cheesy ... is it worth coming up with a better object name? */
-       daclinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_defaclobjtype));
+       daclinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_defaclobjtype));
 
        if (nspid != InvalidOid)
            daclinfo[i].dobj.namespace = findNamespace(nspid,
@@ -6691,9 +6692,9 @@ getDefaultACLs(int *numDefaultACLs)
        else
            daclinfo[i].dobj.namespace = NULL;
 
-       daclinfo[i].defaclrole = strdup(PQgetvalue(res, i, i_defaclrole));
+       daclinfo[i].defaclrole = pg_strdup(PQgetvalue(res, i, i_defaclrole));
        daclinfo[i].defaclobjtype = *(PQgetvalue(res, i, i_defaclobjtype));
-       daclinfo[i].defaclacl = strdup(PQgetvalue(res, i, i_defaclacl));
+       daclinfo[i].defaclacl = pg_strdup(PQgetvalue(res, i, i_defaclacl));
 
        /* Decide whether we want to dump it */
        selectDumpableDefaultACL(&(daclinfo[i]));
@@ -7021,7 +7022,7 @@ collectComments(Archive *fout, CommentItem **items)
 
    ntups = PQntuples(res);
 
-   comments = (CommentItem *) malloc(ntups * sizeof(CommentItem));
+   comments = (CommentItem *) pg_malloc(ntups * sizeof(CommentItem));
 
    for (i = 0; i < ntups; i++)
    {
@@ -7174,7 +7175,7 @@ dumpNamespace(Archive *fout, NamespaceInfo *nspinfo)
    delq = createPQExpBuffer();
    labelq = createPQExpBuffer();
 
-   qnspname = strdup(fmtId(nspinfo->dobj.name));
+   qnspname = pg_strdup(fmtId(nspinfo->dobj.name));
 
    appendPQExpBuffer(delq, "DROP SCHEMA %s;\n", qnspname);
 
@@ -7233,7 +7234,7 @@ dumpExtension(Archive *fout, ExtensionInfo *extinfo)
    delq = createPQExpBuffer();
    labelq = createPQExpBuffer();
 
-   qextname = strdup(fmtId(extinfo->dobj.name));
+   qextname = pg_strdup(fmtId(extinfo->dobj.name));
 
    appendPQExpBuffer(delq, "DROP EXTENSION %s;\n", qextname);
 
@@ -8634,7 +8635,7 @@ dumpProcLang(Archive *fout, ProcLangInfo *plang)
    delqry = createPQExpBuffer();
    labelq = createPQExpBuffer();
 
-   qlanname = strdup(fmtId(plang->dobj.name));
+   qlanname = pg_strdup(fmtId(plang->dobj.name));
 
    /*
     * If dumping a HANDLER clause, treat the language as being in the handler
@@ -9723,7 +9724,7 @@ convertRegProcReference(const char *proc)
        char       *paren;
        bool        inquote;
 
-       name = strdup(proc);
+       name = pg_strdup(proc);
        /* find non-double-quoted left paren */
        inquote = false;
        for (paren = name; *paren; paren++)
@@ -9770,7 +9771,7 @@ convertOperatorReference(const char *opr)
        bool        inquote;
        bool        sawdot;
 
-       name = strdup(opr);
+       name = pg_strdup(opr);
        /* find non-double-quoted left paren, and check for non-quoted dot */
        inquote = false;
        sawdot = false;
@@ -9789,7 +9790,7 @@ convertOperatorReference(const char *opr)
        /* If not schema-qualified, don't need to add OPERATOR() */
        if (!sawdot)
            return name;
-       oname = malloc(strlen(name) + 11);
+       oname = pg_malloc(strlen(name) + 11);
        sprintf(oname, "OPERATOR(%s)", name);
        free(name);
        return oname;
@@ -9836,7 +9837,7 @@ convertTSFunction(Oid funcOid)
        exit_nicely();
    }
 
-   result = strdup(PQgetvalue(res, 0, 0));
+   result = pg_strdup(PQgetvalue(res, 0, 0));
 
    PQclear(res);
 
@@ -9962,11 +9963,11 @@ dumpOpclass(Archive *fout, OpclassInfo *opcinfo)
    opckeytype = PQgetvalue(res, 0, i_opckeytype);
    opcdefault = PQgetvalue(res, 0, i_opcdefault);
    /* opcfamily will still be needed after we PQclear res */
-   opcfamily = strdup(PQgetvalue(res, 0, i_opcfamily));
+   opcfamily = pg_strdup(PQgetvalue(res, 0, i_opcfamily));
    opcfamilyname = PQgetvalue(res, 0, i_opcfamilyname);
    opcfamilynsp = PQgetvalue(res, 0, i_opcfamilynsp);
    /* amname will still be needed after we PQclear res */
-   amname = strdup(PQgetvalue(res, 0, i_amname));
+   amname = pg_strdup(PQgetvalue(res, 0, i_amname));
 
    /*
     * DROP must be fully qualified in case same name appears in pg_catalog
@@ -10409,7 +10410,7 @@ dumpOpfamily(Archive *fout, OpfamilyInfo *opfinfo)
    i_amname = PQfnumber(res, "amname");
 
    /* amname will still be needed after we PQclear res */
-   amname = strdup(PQgetvalue(res, 0, i_amname));
+   amname = pg_strdup(PQgetvalue(res, 0, i_amname));
 
    /*
     * DROP must be fully qualified in case same name appears in pg_catalog
@@ -11429,7 +11430,7 @@ dumpForeignDataWrapper(Archive *fout, FdwInfo *fdwinfo)
    delq = createPQExpBuffer();
    labelq = createPQExpBuffer();
 
-   qfdwname = strdup(fmtId(fdwinfo->dobj.name));
+   qfdwname = pg_strdup(fmtId(fdwinfo->dobj.name));
 
    appendPQExpBuffer(q, "CREATE FOREIGN DATA WRAPPER %s",
                      qfdwname);
@@ -11508,7 +11509,7 @@ dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
    labelq = createPQExpBuffer();
    query = createPQExpBuffer();
 
-   qsrvname = strdup(fmtId(srvinfo->dobj.name));
+   qsrvname = pg_strdup(fmtId(srvinfo->dobj.name));
 
    /* look up the foreign-data wrapper */
    selectSourceSchema("pg_catalog");
@@ -12091,7 +12092,7 @@ collectSecLabels(Archive *fout, SecLabelItem **items)
 
    ntups = PQntuples(res);
 
-   labels = (SecLabelItem *) malloc(ntups * sizeof(SecLabelItem));
+   labels = (SecLabelItem *) pg_malloc(ntups * sizeof(SecLabelItem));
 
    for (i = 0; i < ntups; i++)
    {
@@ -12126,7 +12127,7 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
            dumpTableSchema(fout, tbinfo);
 
        /* Handle the ACL here */
-       namecopy = strdup(fmtId(tbinfo->dobj.name));
+       namecopy = pg_strdup(fmtId(tbinfo->dobj.name));
        dumpACL(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
                (tbinfo->relkind == RELKIND_SEQUENCE) ? "SEQUENCE" :
                "TABLE",
@@ -12160,8 +12161,8 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
                char       *attnamecopy;
                char       *acltag;
 
-               attnamecopy = strdup(fmtId(attname));
-               acltag = malloc(strlen(tbinfo->dobj.name) + strlen(attname) + 2);
+               attnamecopy = pg_strdup(fmtId(attname));
+               acltag = pg_malloc(strlen(tbinfo->dobj.name) + strlen(attname) + 2);
                sprintf(acltag, "%s.%s", tbinfo->dobj.name, attname);
                /* Column's GRANT type is always TABLE */
                dumpACL(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId, "TABLE",
@@ -12296,8 +12297,8 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
            check_sql_result(res, g_conn, query->data, PGRES_TUPLES_OK);
            i_srvname = PQfnumber(res, "srvname");
            i_ftoptions = PQfnumber(res, "ftoptions");
-           srvname = strdup(PQgetvalue(res, 0, i_srvname));
-           ftoptions = strdup(PQgetvalue(res, 0, i_ftoptions));
+           srvname = pg_strdup(PQgetvalue(res, 0, i_srvname));
+           ftoptions = pg_strdup(PQgetvalue(res, 0, i_ftoptions));
            PQclear(res);
        }
        else
@@ -13968,7 +13969,7 @@ getExtensionMembership(ExtensionInfo extinfo[], int numExtensions)
                     */
                    makeTableDataInfo(configtbl, false);
                    if (strlen(extconditionarray[j]) > 0)
-                       configtbl->dataObj->filtercond = strdup(extconditionarray[j]);
+                       configtbl->dataObj->filtercond = pg_strdup(extconditionarray[j]);
                }
            }
        }
@@ -14141,7 +14142,7 @@ selectSourceSchema(const char *schemaName)
    destroyPQExpBuffer(query);
    if (curSchemaName)
        free(curSchemaName);
-   curSchemaName = strdup(schemaName);
+   curSchemaName = pg_strdup(schemaName);
 }
 
 /*
@@ -14162,13 +14163,13 @@ getFormattedTypeName(Oid oid, OidOptions opts)
    if (oid == 0)
    {
        if ((opts & zeroAsOpaque) != 0)
-           return strdup(g_opaque_type);
+           return pg_strdup(g_opaque_type);
        else if ((opts & zeroAsAny) != 0)
-           return strdup("'any'");
+           return pg_strdup("'any'");
        else if ((opts & zeroAsStar) != 0)
-           return strdup("*");
+           return pg_strdup("*");
        else if ((opts & zeroAsNone) != 0)
-           return strdup("NONE");
+           return pg_strdup("NONE");
    }
 
    query = createPQExpBuffer();
@@ -14207,12 +14208,12 @@ getFormattedTypeName(Oid oid, OidOptions opts)
    if (g_fout->remoteVersion >= 70100)
    {
        /* already quoted */
-       result = strdup(PQgetvalue(res, 0, 0));
+       result = pg_strdup(PQgetvalue(res, 0, 0));
    }
    else
    {
        /* may need to quote it */
-       result = strdup(fmtId(PQgetvalue(res, 0, 0)));
+       result = pg_strdup(fmtId(PQgetvalue(res, 0, 0)));
    }
 
    PQclear(res);
@@ -14285,7 +14286,7 @@ myFormatType(const char *typname, int32 typmod)
    if (isarray)
        appendPQExpBuffer(buf, "[]");
 
-   result = strdup(buf->data);
+   result = pg_strdup(buf->data);
    destroyPQExpBuffer(buf);
 
    return result;
index 3d5d534269f7f1e5828cf4c1824142c8f46319b8..c248e755992bb68f8e02fdd84a8c4ae3959a392b 100644 (file)
@@ -521,11 +521,6 @@ extern void simple_string_list_append(SimpleStringList *list, const char *val);
 extern bool simple_oid_list_member(SimpleOidList *list, Oid val);
 extern bool simple_string_list_member(SimpleStringList *list, const char *val);
 
-extern char *pg_strdup(const char *string);
-extern void *pg_malloc(size_t size);
-extern void *pg_calloc(size_t nmemb, size_t size);
-extern void *pg_realloc(void *ptr, size_t size);
-
 extern void check_conn_and_db(void);
 extern void exit_nicely(void);
 
index 6b6c073eb6a084fcb6d32178a5eecf449ab5cf44..3bb220d1966f1da264f0bc9942c8ddc9d782613f 100644 (file)
@@ -14,7 +14,7 @@
  *-------------------------------------------------------------------------
  */
 #include "pg_backup_archiver.h"
-
+#include "common.h"
 
 static const char *modulename = gettext_noop("sorter");
 
@@ -227,10 +227,7 @@ sortDumpableObjects(DumpableObject **objs, int numObjs)
    if (numObjs <= 0)
        return;
 
-   ordering = (DumpableObject **) malloc(numObjs * sizeof(DumpableObject *));
-   if (ordering == NULL)
-       exit_horribly(NULL, modulename, "out of memory\n");
-
+   ordering = (DumpableObject **) pg_malloc(numObjs * sizeof(DumpableObject *));
    while (!TopoSort(objs, numObjs, ordering, &nOrdering))
        findDependencyLoops(ordering, nOrdering, numObjs);
 
@@ -301,9 +298,7 @@ TopoSort(DumpableObject **objs,
        return true;
 
    /* Create workspace for the above-described heap */
-   pendingHeap = (int *) malloc(numObjs * sizeof(int));
-   if (pendingHeap == NULL)
-       exit_horribly(NULL, modulename, "out of memory\n");
+   pendingHeap = (int *) pg_malloc(numObjs * sizeof(int));
 
    /*
     * Scan the constraints, and for each item in the input, generate a count
@@ -312,13 +307,9 @@ TopoSort(DumpableObject **objs,
     * We also make a map showing the input-order index of the item with
     * dumpId j.
     */
-   beforeConstraints = (int *) malloc((maxDumpId + 1) * sizeof(int));
-   if (beforeConstraints == NULL)
-       exit_horribly(NULL, modulename, "out of memory\n");
+   beforeConstraints = (int *) pg_malloc((maxDumpId + 1) * sizeof(int));
    memset(beforeConstraints, 0, (maxDumpId + 1) * sizeof(int));
-   idMap = (int *) malloc((maxDumpId + 1) * sizeof(int));
-   if (idMap == NULL)
-       exit_horribly(NULL, modulename, "out of memory\n");
+   idMap = (int *) pg_malloc((maxDumpId + 1) * sizeof(int));
    for (i = 0; i < numObjs; i++)
    {
        obj = objs[i];
@@ -516,9 +507,7 @@ findDependencyLoops(DumpableObject **objs, int nObjs, int totObjs)
    bool        fixedloop;
    int         i;
 
-   workspace = (DumpableObject **) malloc(totObjs * sizeof(DumpableObject *));
-   if (workspace == NULL)
-       exit_horribly(NULL, modulename, "out of memory\n");
+   workspace = (DumpableObject **) pg_malloc(totObjs * sizeof(DumpableObject *));
    initiallen = 0;
    fixedloop = false;
 
index d138da568ea06e6e2678ae5eab707a01fc8e2578..4782e6889be569ce20c7a2f7da8168c6a229bf64 100644 (file)
@@ -60,6 +60,9 @@ static PGconn *connectDatabase(const char *dbname, const char *pghost, const cha
 static PGresult *executeQuery(PGconn *conn, const char *query);
 static void executeCommand(PGconn *conn, const char *query);
 
+char *pg_strdup(const char *string);
+void *pg_malloc(size_t size);
+
 static char pg_dump_bin[MAXPGPATH];
 static PQExpBuffer pgdumpopts;
 static bool skip_acls = false;
@@ -916,7 +919,7 @@ dumpGroups(PGconn *conn)
        if (strlen(grolist) < 3)
            continue;
 
-       grolist = strdup(grolist);
+       grolist = pg_strdup(grolist);
        grolist[0] = '(';
        grolist[strlen(grolist) - 1] = ')';
        printfPQExpBuffer(buf,
@@ -1040,7 +1043,7 @@ dumpTablespaces(PGconn *conn)
        char       *fspcname;
 
        /* needed for buildACLCommands() */
-       fspcname = strdup(fmtId(spcname));
+       fspcname = pg_strdup(fmtId(spcname));
 
        appendPQExpBuffer(buf, "CREATE TABLESPACE %s", fspcname);
        appendPQExpBuffer(buf, " OWNER %s", fmtId(spcowner));
@@ -1189,11 +1192,11 @@ dumpCreateDB(PGconn *conn)
    if (PQntuples(res) > 0)
    {
        if (!PQgetisnull(res, 0, 0))
-           default_encoding = strdup(PQgetvalue(res, 0, 0));
+           default_encoding = pg_strdup(PQgetvalue(res, 0, 0));
        if (!PQgetisnull(res, 0, 1))
-           default_collate = strdup(PQgetvalue(res, 0, 1));
+           default_collate = pg_strdup(PQgetvalue(res, 0, 1));
        if (!PQgetisnull(res, 0, 2))
-           default_ctype = strdup(PQgetvalue(res, 0, 2));
+           default_ctype = pg_strdup(PQgetvalue(res, 0, 2));
    }
 
    PQclear(res);
@@ -1283,7 +1286,7 @@ dumpCreateDB(PGconn *conn)
        char       *dbtablespace = PQgetvalue(res, i, 9);
        char       *fdbname;
 
-       fdbname = strdup(fmtId(dbname));
+       fdbname = pg_strdup(fmtId(dbname));
 
        resetPQExpBuffer(buf);
 
@@ -1519,7 +1522,7 @@ makeAlterConfigCommand(PGconn *conn, const char *arrayitem,
    char       *mine;
    PQExpBuffer buf = createPQExpBuffer();
 
-   mine = strdup(arrayitem);
+   mine = pg_strdup(arrayitem);
    pos = strchr(mine, '=');
    if (pos == NULL)
        return;
@@ -1688,14 +1691,8 @@ connectDatabase(const char *dbname, const char *pghost, const char *pgport,
    do
    {
 #define PARAMS_ARRAY_SIZE  7
-       const char **keywords = malloc(PARAMS_ARRAY_SIZE * sizeof(*keywords));
-       const char **values = malloc(PARAMS_ARRAY_SIZE * sizeof(*values));
-
-       if (!keywords || !values)
-       {
-           fprintf(stderr, _("%s: out of memory\n"), progname);
-           exit(1);
-       }
+       const char **keywords = pg_malloc(PARAMS_ARRAY_SIZE * sizeof(*keywords));
+       const char **values = pg_malloc(PARAMS_ARRAY_SIZE * sizeof(*values));
 
        keywords[0] = "host";
        values[0] = pghost;
@@ -1911,3 +1908,41 @@ doShellQuoting(PQExpBuffer buf, const char *str)
    appendPQExpBufferChar(buf, '"');
 #endif   /* WIN32 */
 }
+
+
+/*
+ * Simpler versions of common.c functions.
+ */
+
+char *
+pg_strdup(const char *string)
+{
+   char       *tmp;
+
+   if (!string)
+   {
+       fprintf(stderr, "cannot duplicate null pointer\n");
+       exit(1);
+   }
+   tmp = strdup(string);
+   if (!tmp)
+   {
+       fprintf(stderr, _("%s: out of memory\n"), progname);
+       exit(1);
+   }
+   return tmp;
+}
+
+void *
+pg_malloc(size_t size)
+{
+   void       *tmp;
+
+   tmp = malloc(size);
+   if (!tmp)
+   {
+       fprintf(stderr, _("%s: out of memory\n"), progname);
+       exit(1);
+   }
+   return tmp;
+}
index 7731d2540c75a0c4b5880bdf0a879c560720f99b..a810ed60b4e3910306670fd246bea800b1f48b9b 100644 (file)
@@ -39,6 +39,7 @@
  *-------------------------------------------------------------------------
  */
 
+#include "common.h"
 #include "pg_backup_archiver.h"
 #include "dumputils.h"
 
@@ -159,21 +160,21 @@ main(int argc, char **argv)
                opts->createDB = 1;
                break;
            case 'd':
-               opts->dbname = strdup(optarg);
+               opts->dbname = pg_strdup(optarg);
                break;
            case 'e':
                opts->exit_on_error = true;
                break;
            case 'f':           /* output file name */
-               opts->filename = strdup(optarg);
+               opts->filename = pg_strdup(optarg);
                break;
            case 'F':
                if (strlen(optarg) != 0)
-                   opts->formatName = strdup(optarg);
+                   opts->formatName = pg_strdup(optarg);
                break;
            case 'h':
                if (strlen(optarg) != 0)
-                   opts->pghost = strdup(optarg);
+                   opts->pghost = pg_strdup(optarg);
                break;
            case 'i':
                /* ignored, deprecated option */
@@ -188,11 +189,11 @@ main(int argc, char **argv)
                break;
 
            case 'L':           /* input TOC summary file name */
-               opts->tocFile = strdup(optarg);
+               opts->tocFile = pg_strdup(optarg);
                break;
 
            case 'n':           /* Dump data for this schema only */
-               opts->schemaNames = strdup(optarg);
+               opts->schemaNames = pg_strdup(optarg);
                break;
 
            case 'O':
@@ -201,7 +202,7 @@ main(int argc, char **argv)
 
            case 'p':
                if (strlen(optarg) != 0)
-                   opts->pgport = strdup(optarg);
+                   opts->pgport = pg_strdup(optarg);
                break;
            case 'R':
                /* no-op, still accepted for backwards compatibility */
@@ -209,29 +210,29 @@ main(int argc, char **argv)
            case 'P':           /* Function */
                opts->selTypes = 1;
                opts->selFunction = 1;
-               opts->functionNames = strdup(optarg);
+               opts->functionNames = pg_strdup(optarg);
                break;
            case 'I':           /* Index */
                opts->selTypes = 1;
                opts->selIndex = 1;
-               opts->indexNames = strdup(optarg);
+               opts->indexNames = pg_strdup(optarg);
                break;
            case 'T':           /* Trigger */
                opts->selTypes = 1;
                opts->selTrigger = 1;
-               opts->triggerNames = strdup(optarg);
+               opts->triggerNames = pg_strdup(optarg);
                break;
            case 's':           /* dump schema only */
                opts->schemaOnly = 1;
                break;
            case 'S':           /* Superuser username */
                if (strlen(optarg) != 0)
-                   opts->superuser = strdup(optarg);
+                   opts->superuser = pg_strdup(optarg);
                break;
            case 't':           /* Dump data for this table only */
                opts->selTypes = 1;
                opts->selTable = 1;
-               opts->tableNames = strdup(optarg);
+               opts->tableNames = pg_strdup(optarg);
                break;
 
            case 'U':