]> granicus.if.org Git - postgresql/commitdiff
Refactor pg_dump.c to avoid duplicating returns-one-row check.
authorRobert Haas <rhaas@postgresql.org>
Thu, 16 Feb 2012 17:07:06 +0000 (12:07 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 16 Feb 2012 17:07:06 +0000 (12:07 -0500)
Any patches apt to get broken have probably already been broken by the
error-handling cleanups I just did, so we might as well clean this up
at the same time.

src/bin/pg_dump/pg_dump.c

index 6eddc63e28be2336f3fdd845635d546874858666..35530f7d7dfb305057c0928b2337993b9f38db2b 100644 (file)
@@ -257,6 +257,7 @@ static void binary_upgrade_extension_member(PQExpBuffer upgrade_buffer,
                                                                const char *objlabel);
 static const char *getAttrName(int attrnum, TableInfo *tblInfo);
 static const char *fmtCopyColumnList(const TableInfo *ti);
+static PGresult *ExecuteSqlQueryForSingleRow(Archive *fout, char *query);
 
 int
 main(int argc, char **argv)
@@ -2446,7 +2447,6 @@ binary_upgrade_set_type_oids_by_type_oid(Archive *fout,
                                                                                 Oid pg_type_oid)
 {
        PQExpBuffer upgrade_query = createPQExpBuffer();
-       int                     ntups;
        PGresult   *upgrade_res;
        Oid                     pg_type_array_oid;
 
@@ -2462,18 +2462,7 @@ binary_upgrade_set_type_oids_by_type_oid(Archive *fout,
                                          "WHERE pg_type.oid = '%u'::pg_catalog.oid;",
                                          pg_type_oid);
 
-       upgrade_res = ExecuteSqlQuery(fout, upgrade_query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(upgrade_res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, upgrade_query->data);
-               exit_nicely(1);
-       }
+       upgrade_res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
 
        pg_type_array_oid = atooid(PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "typarray")));
 
@@ -2496,7 +2485,6 @@ binary_upgrade_set_type_oids_by_rel_oid(Archive *fout,
                                                                                Oid pg_rel_oid)
 {
        PQExpBuffer upgrade_query = createPQExpBuffer();
-       int                     ntups;
        PGresult   *upgrade_res;
        Oid                     pg_type_oid;
        bool            toast_set = false;
@@ -2510,18 +2498,7 @@ binary_upgrade_set_type_oids_by_rel_oid(Archive *fout,
                                          "WHERE c.oid = '%u'::pg_catalog.oid;",
                                          pg_rel_oid);
 
-       upgrade_res = ExecuteSqlQuery(fout, upgrade_query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(upgrade_res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, upgrade_query->data);
-               exit_nicely(1);
-       }
+       upgrade_res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
 
        pg_type_oid = atooid(PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "crel")));
 
@@ -2554,7 +2531,6 @@ binary_upgrade_set_pg_class_oids(Archive *fout,
                                                                 bool is_index)
 {
        PQExpBuffer upgrade_query = createPQExpBuffer();
-       int                     ntups;
        PGresult   *upgrade_res;
        Oid                     pg_class_reltoastrelid;
        Oid                     pg_class_reltoastidxid;
@@ -2566,18 +2542,7 @@ binary_upgrade_set_pg_class_oids(Archive *fout,
                                          "WHERE c.oid = '%u'::pg_catalog.oid;",
                                          pg_class_oid);
 
-       upgrade_res = ExecuteSqlQuery(fout, upgrade_query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(upgrade_res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, upgrade_query->data);
-               exit_nicely(1);
-       }
+       upgrade_res = ExecuteSqlQueryForSingleRow(fout, upgrade_query->data);
 
        pg_class_reltoastrelid = atooid(PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "reltoastrelid")));
        pg_class_reltoastidxid = atooid(PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "reltoastidxid")));
@@ -7807,7 +7772,6 @@ dumpBaseType(Archive *fout, TypeInfo *tyinfo)
        PQExpBuffer labelq = createPQExpBuffer();
        PQExpBuffer query = createPQExpBuffer();
        PGresult   *res;
-       int                     ntups;
        char       *typlen;
        char       *typinput;
        char       *typoutput;
@@ -8008,18 +7972,7 @@ dumpBaseType(Archive *fout, TypeInfo *tyinfo)
                                                  tyinfo->dobj.catId.oid);
        }
 
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
 
        typlen = PQgetvalue(res, 0, PQfnumber(res, "typlen"));
        typinput = PQgetvalue(res, 0, PQfnumber(res, "typinput"));
@@ -8201,7 +8154,6 @@ dumpDomain(Archive *fout, TypeInfo *tyinfo)
        PQExpBuffer labelq = createPQExpBuffer();
        PQExpBuffer query = createPQExpBuffer();
        PGresult   *res;
-       int                     ntups;
        int                     i;
        char       *typnotnull;
        char       *typdefn;
@@ -8239,18 +8191,7 @@ dumpDomain(Archive *fout, TypeInfo *tyinfo)
                                                  tyinfo->dobj.catId.oid);
        }
 
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
 
        typnotnull = PQgetvalue(res, 0, PQfnumber(res, "typnotnull"));
        typdefn = PQgetvalue(res, 0, PQfnumber(res, "typdefn"));
@@ -9056,7 +8997,6 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
        char       *funcsig;            /* identity signature */
        char       *funcfullsig;        /* full signature */
        char       *funcsig_tag;
-       int                     ntups;
        char       *proretset;
        char       *prosrc;
        char       *probin;
@@ -9231,18 +9171,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
                                                  finfo->dobj.catId.oid);
        }
 
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
 
        proretset = PQgetvalue(res, 0, PQfnumber(res, "proretset"));
        prosrc = PQgetvalue(res, 0, PQfnumber(res, "prosrc"));
@@ -9685,7 +9614,6 @@ dumpOpr(Archive *fout, OprInfo *oprinfo)
        PQExpBuffer details;
        const char *name;
        PGresult   *res;
-       int                     ntups;
        int                     i_oprkind;
        int                     i_oprcode;
        int                     i_oprleft;
@@ -9788,18 +9716,7 @@ dumpOpr(Archive *fout, OprInfo *oprinfo)
                                                  oprinfo->dobj.catId.oid);
        }
 
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
 
        i_oprkind = PQfnumber(res, "oprkind");
        i_oprcode = PQfnumber(res, "oprcode");
@@ -10038,21 +9955,10 @@ convertTSFunction(Archive *fout, Oid funcOid)
        char       *result;
        char            query[128];
        PGresult   *res;
-       int                     ntups;
 
        snprintf(query, sizeof(query),
                         "SELECT '%u'::pg_catalog.regproc", funcOid);
-       res = ExecuteSqlQuery(fout, query, PGRES_TUPLES_OK);
-
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query);
 
        result = pg_strdup(PQgetvalue(res, 0, 0));
 
@@ -10158,18 +10064,7 @@ dumpOpclass(Archive *fout, OpclassInfo *opcinfo)
                                                  opcinfo->dobj.catId.oid);
        }
 
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
 
        i_opcintype = PQfnumber(res, "opcintype");
        i_opckeytype = PQfnumber(res, "opckeytype");
@@ -10626,18 +10521,7 @@ dumpOpfamily(Archive *fout, OpfamilyInfo *opfinfo)
                                          "WHERE oid = '%u'::pg_catalog.oid",
                                          opfinfo->dobj.catId.oid);
 
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
 
        i_amname = PQfnumber(res, "amname");
 
@@ -10785,7 +10669,6 @@ dumpCollation(Archive *fout, CollInfo *collinfo)
        PQExpBuffer delq;
        PQExpBuffer labelq;
        PGresult   *res;
-       int                     ntups;
        int                     i_collcollate;
        int                     i_collctype;
        const char *collcollate;
@@ -10811,18 +10694,7 @@ dumpCollation(Archive *fout, CollInfo *collinfo)
                                          "WHERE c.oid = '%u'::pg_catalog.oid",
                                          collinfo->dobj.catId.oid);
 
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
 
        i_collcollate = PQfnumber(res, "collcollate");
        i_collctype = PQfnumber(res, "collctype");
@@ -10885,7 +10757,6 @@ dumpConversion(Archive *fout, ConvInfo *convinfo)
        PQExpBuffer delq;
        PQExpBuffer labelq;
        PGresult   *res;
-       int                     ntups;
        int                     i_conforencoding;
        int                     i_contoencoding;
        int                     i_conproc;
@@ -10916,18 +10787,7 @@ dumpConversion(Archive *fout, ConvInfo *convinfo)
                                          "WHERE c.oid = '%u'::pg_catalog.oid",
                                          convinfo->dobj.catId.oid);
 
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
 
        i_conforencoding = PQfnumber(res, "conforencoding");
        i_contoencoding = PQfnumber(res, "contoencoding");
@@ -11040,7 +10900,6 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
        char       *aggsig;
        char       *aggsig_tag;
        PGresult   *res;
-       int                     ntups;
        int                     i_aggtransfn;
        int                     i_aggfinalfn;
        int                     i_aggsortop;
@@ -11116,18 +10975,7 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
                                                  agginfo->aggfn.dobj.catId.oid);
        }
 
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
 
        i_aggtransfn = PQfnumber(res, "aggtransfn");
        i_aggfinalfn = PQfnumber(res, "aggfinalfn");
@@ -11340,7 +11188,6 @@ dumpTSDictionary(Archive *fout, TSDictInfo *dictinfo)
        PQExpBuffer labelq;
        PQExpBuffer query;
        PGresult   *res;
-       int                     ntups;
        char       *nspname;
        char       *tmplname;
 
@@ -11359,16 +11206,7 @@ dumpTSDictionary(Archive *fout, TSDictInfo *dictinfo)
                                          "FROM pg_ts_template p, pg_namespace n "
                                          "WHERE p.oid = '%u' AND n.oid = tmplnamespace",
                                          dictinfo->dicttemplate);
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
        nspname = PQgetvalue(res, 0, 0);
        tmplname = PQgetvalue(res, 0, 1);
 
@@ -11525,16 +11363,7 @@ dumpTSConfig(Archive *fout, TSConfigInfo *cfginfo)
                                          "FROM pg_ts_parser p, pg_namespace n "
                                          "WHERE p.oid = '%u' AND n.oid = prsnamespace",
                                          cfginfo->cfgparser);
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
        nspname = PQgetvalue(res, 0, 0);
        prsname = PQgetvalue(res, 0, 1);
 
@@ -11723,7 +11552,6 @@ dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
        PQExpBuffer labelq;
        PQExpBuffer query;
        PGresult   *res;
-       int                     ntups;
        char       *qsrvname;
        char       *fdwname;
 
@@ -11744,16 +11572,7 @@ dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
                                          "FROM pg_foreign_data_wrapper w "
                                          "WHERE w.oid = '%u'",
                                          srvinfo->srvfdw);
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
        fdwname = PQgetvalue(res, 0, 0);
 
        appendPQExpBuffer(q, "CREATE SERVER %s", qsrvname);
@@ -14430,7 +14249,6 @@ getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts)
        char       *result;
        PQExpBuffer query;
        PGresult   *res;
-       int                     ntups;
 
        if (oid == 0)
        {
@@ -14463,18 +14281,7 @@ getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts)
                                                  oid);
        }
 
-       res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
-
-       /* Expecting a single result only */
-       ntups = PQntuples(res);
-       if (ntups != 1)
-       {
-               write_msg(NULL, ngettext("query returned %d row instead of one: %s\n",
-                                                          "query returned %d rows instead of one: %s\n",
-                                                                ntups),
-                                 ntups, query->data);
-               exit_nicely(1);
-       }
+       res = ExecuteSqlQueryForSingleRow(fout, query->data);
 
        if (fout->remoteVersion >= 70100)
        {
@@ -14630,3 +14437,26 @@ fmtCopyColumnList(const TableInfo *ti)
        appendPQExpBuffer(q, ")");
        return q->data;
 }
+
+/*
+ * Execute an SQL query and verify that we got exactly one row back.
+ */
+static PGresult *
+ExecuteSqlQueryForSingleRow(Archive *fout, char *query)
+{
+       PGresult   *res;
+       int                     ntups;
+
+       res = ExecuteSqlQuery(fout, query, PGRES_TUPLES_OK);
+
+       /* Expecting a single result only */
+       ntups = PQntuples(res);
+       if (ntups != 1)
+               exit_horribly(NULL,
+                                         ngettext("query returned %d row instead of one: %s\n",
+                                                          "query returned %d rows instead of one: %s\n",
+                                                                ntups),
+                                         ntups, query);
+
+       return res;
+}