pg_dump extension - Mailing list pgsql-general

From hamann.w@t-online.de
Subject pg_dump extension
Date
Msg-id wolfgang-990717160448.A014843@loopback
Whole thread Raw
List pgsql-general

The following patch allows pg_dump to dump out data about
user-defined operator classes

Wolfgang Hamann

--- pg_dump.c.orig    Sat Jul 17 09:01:44 1999
+++ pg_dump.c    Sat Jul 17 13:34:03 1999
@@ -2371,6 +2371,107 @@
 }

 /*
+ * dumpOpclasses
+ *      writes out to fout the queries to recreate all the user-defined operator classes
+ *
+ */
+void
+dumpOpclasses(FILE *fout)
+{    int n, ntuples;
+
+    char        q[MAX_QUERY_SIZE];
+    PGresult   *res;
+
+    sprintf(q,
+        "SELECT DISTINCT opcname from pg_opclass where oid >%u",
+        g_last_builtin_oid);
+    res = PQexec(g_conn, q);
+    if (!res || PQresultStatus(res) != PGRES_TUPLES_OK)
+    {
+        fprintf(stderr, "dumpOpclass(): SELECT (opcname) failed.  Explanation from backend: '%s'.\n",
PQerrorMessage(g_conn));
+        exit_nicely(g_conn);
+    }
+    ntuples = PQntuples(res);
+    for(n = 0 ; n < ntuples ; n++)
+    {
+        sprintf(q, "INSERT INTO pg_opclass (opcname) VALUES ('%s');\n",
+         PQgetvalue(res, n, PQfnumber(res, "opcname")));
+        fputs(q, fout);
+    }
+    PQclear(res);
+
+    sprintf(q,
+        "SELECT DISTINCT pg_am.amname, cl.opcname, o.oprname, t1.typname as ltypname, t2.typname as rtypname,"
+        " amopstrategy, amopselect, amopnpages"
+        " FROM pg_amop, pg_operator o, pg_opclass cl, pg_type t1, pg_type t2"
+        " WHERE (amopid > %u OR amopclaid > %u OR amopopr > %u) AND"
+        " pg_am.oid = amopid AND cl.oid = amopclaid AND"
+        " o.oid = amopopr AND o.oprleft = t1.oid AND o.oprright = t2.oid",
+        g_last_builtin_oid, g_last_builtin_oid, g_last_builtin_oid);
+    res = PQexec(g_conn, q);
+    if (!res || PQresultStatus(res) != PGRES_TUPLES_OK)
+    {
+        fprintf(stderr, "dumpOpclass(): SELECT (amname, opcname, oprname, ..) failed.  Explanation from backend:
'%s'.\n",PQerrorMessage(g_conn)); 
+        exit_nicely(g_conn);
+    }
+    ntuples = PQntuples(res);
+    for(n = 0 ; n < ntuples ; n++)
+    {
+        sprintf(q,
+            "INSERT INTO pg_amop(amopid, amopclaid, amopopr, amopstrategy,"
+            " amopselect, amopnpages)\n"
+            " SELECT am.oid, cl.oid, o.oid, %s, '%s'::regproc, "
+            "'%s'::regproc\n"
+            " FROM pg_am am, pg_opclass cl, pg_operator o, pg_type t1, pg_type t2\n"
+            " WHERE am.amname = '%s'"
+            " AND cl.opcname = '%s'"
+            " AND o.oprname = '%s'\n"
+            " AND o.oprleft = t1.oid AND o.oprright = t2.oid\n"
+            " AND t1.typname = '%s'"
+            " AND t2.typname = '%s';\n",
+            PQgetvalue(res, n, PQfnumber(res, "amopstrategy")),
+            PQgetvalue(res, n, PQfnumber(res, "amopselect")),
+            PQgetvalue(res, n, PQfnumber(res, "amopnpages")),
+            PQgetvalue(res, n, PQfnumber(res, "amname")),
+            PQgetvalue(res, n, PQfnumber(res, "opcname")),
+            PQgetvalue(res, n, PQfnumber(res, "oprname")),
+            PQgetvalue(res, n, PQfnumber(res, "ltypname")),
+            PQgetvalue(res, n, PQfnumber(res, "rtypname")));
+        fputs(q, fout);
+    }
+    PQclear(res);
+
+    sprintf(q,
+        "SELECT DISTINCT pg_am.amname, cl.opcname, p.proname, amprocnum"
+        " FROM pg_amproc, pg_opclass cl, pg_proc p"
+        " WHERE (amid > %u or amopclaid > %u)"
+        " AND pg_am.oid = amid AND cl.oid = amopclaid AND p.oid = amproc",
+        g_last_builtin_oid, g_last_builtin_oid);
+    res = PQexec(g_conn, q);
+    if (!res || PQresultStatus(res) != PGRES_TUPLES_OK)
+    {
+        fprintf(stderr, "dumpOpclass(): SELECT (amname, opcname, proname, ..) failed.  Explanation from backend:
'%s'.\n",PQerrorMessage(g_conn)); 
+        exit_nicely(g_conn);
+    }
+    ntuples = PQntuples(res);
+    for(n = 0 ; n < ntuples ; n++)
+    {
+        sprintf(q,
+            "INSERT INTO pg_amproc (amid, amopclaid, amproc, amprocnum)\n"
+            " SELECT pg_am.oid, pg_opclass.oid, pg_proc.oid, %s\n"
+            " WHERE pg_am.amname = '%s' AND pg_opclass.opcname = '%s'"
+            " AND pg_proc.proname = '%s';\n",
+            PQgetvalue(res, n, PQfnumber(res, "amprocnum")),
+            PQgetvalue(res, n, PQfnumber(res, "amname")),
+            PQgetvalue(res, n, PQfnumber(res, "opcname")),
+            PQgetvalue(res, n, PQfnumber(res, "proname")));
+        fputs(q, fout);
+    }
+    PQclear(res);
+
+}
+
+/*
  * dumpAggs
  *      writes out to fout the queries to create all the user-defined aggregates
  *
--- common.c.orig    Sat Jul 17 09:13:29 1999
+++ common.c    Sat Jul 17 12:33:40 1999
@@ -335,6 +335,14 @@
                     g_comment_start, g_comment_end);
         dumpOprs(fout, oprinfo, numOperators, tinfo, numTypes);
     }
+// opclass
+    if (!tablename && fout)
+    {
+        if (g_verbose)
+            fprintf(stderr, "%s dumping out user-defined operator classes %s\n",
+                    g_comment_start, g_comment_end);
+        dumpOpclasses(fout);
+    }

     *numTablesPtr = numTables;
     clearAggInfo(agginfo, numAggregates);



pgsql-general by date:

Previous
From: "Tim Joyce"
Date:
Subject: Re: [GENERAL] PostgreSQL status report
Next
From: "Dan Wilson"
Date:
Subject: Permissions Question - re-post