]> granicus.if.org Git - postgresql/commitdiff
In pg_upgrade, remove dependency on pg_config, as that might not be in
authorBruce Momjian <bruce@momjian.us>
Mon, 19 Mar 2012 13:31:50 +0000 (09:31 -0400)
committerBruce Momjian <bruce@momjian.us>
Mon, 19 Mar 2012 13:31:50 +0000 (09:31 -0400)
the non-development install.  Instead, use the LOAD mechanism to check
for the pg_upgrade_support shared object, like we do for other shared
object checks.

Backpatch to 9.1.

Report from Ã€lvaro

contrib/pg_upgrade/check.c
contrib/pg_upgrade/function.c

index 7aa5c28c47c4ce181e23ef206224ab5ba30ca84d..cce5ff0c79ca8fa9d6dd08b98492f7479cac91a6 100644 (file)
@@ -19,7 +19,6 @@ static void check_is_super_user(ClusterInfo *cluster);
 static void check_for_prepared_transactions(ClusterInfo *cluster);
 static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
 static void check_for_reg_data_type_usage(ClusterInfo *cluster);
-static void check_for_support_lib(ClusterInfo *cluster);
 static void get_bin_version(ClusterInfo *cluster);
 
 
@@ -266,8 +265,6 @@ check_cluster_versions(void)
 void
 check_cluster_compatibility(bool live_check)
 {
-       check_for_support_lib(&new_cluster);
-
        /* get/check pg_control data of servers */
        get_control_data(&old_cluster, live_check);
        get_control_data(&new_cluster, false);
@@ -739,45 +736,6 @@ check_for_reg_data_type_usage(ClusterInfo *cluster)
 }
 
 
-/*
- * Test pg_upgrade_support.so is in the proper place.   We cannot copy it
- * ourselves because install directories are typically root-owned.
- */
-static void
-check_for_support_lib(ClusterInfo *cluster)
-{
-       char            cmd[MAXPGPATH];
-       char            libdir[MAX_STRING];
-       char            libfile[MAXPGPATH];
-       FILE       *lib_test;
-       FILE       *output;
-
-       snprintf(cmd, sizeof(cmd), "\"%s/pg_config\" --pkglibdir", cluster->bindir);
-
-       if ((output = popen(cmd, "r")) == NULL)
-               pg_log(PG_FATAL, "Could not get pkglibdir data: %s\n",
-                          getErrorText(errno));
-
-       fgets(libdir, sizeof(libdir), output);
-
-       pclose(output);
-
-       /* Remove trailing newline */
-       if (strchr(libdir, '\n') != NULL)
-               *strchr(libdir, '\n') = '\0';
-
-       snprintf(libfile, sizeof(libfile), "%s/pg_upgrade_support%s", libdir,
-                        DLSUFFIX);
-
-       if ((lib_test = fopen(libfile, "r")) == NULL)
-               pg_log(PG_FATAL,
-                          "The pg_upgrade_support module must be created and installed in the %s cluster.\n",
-                               CLUSTER_NAME(cluster));
-
-       fclose(lib_test);
-}
-
-
 static void
 get_bin_version(ClusterInfo *cluster)
 {
index 4878ded661591b527da2632e24355731ddfae527..6547e58e11ad6cdec2150b5682b3ee8871ecd8ff 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "access/transam.h"
 
+#define PG_UPGRADE_SUPPORT     "$libdir/pg_upgrade_support"
 
 /*
  * install_support_functions_in_new_db()
@@ -153,17 +154,17 @@ get_loadable_libraries(void)
                PQfinish(conn);
        }
 
+       totaltups++;    /* reserve for pg_upgrade_support */
+
        /* Allocate what's certainly enough space */
-       if (totaltups > 0)
-               os_info.libraries = (char **) pg_malloc(totaltups * sizeof(char *));
-       else
-               os_info.libraries = NULL;
+       os_info.libraries = (char **) pg_malloc(totaltups * sizeof(char *));
 
        /*
         * Now remove duplicates across DBs.  This is pretty inefficient code, but
         * there probably aren't enough entries to matter.
         */
        totaltups = 0;
+       os_info.libraries[totaltups++] = pg_strdup(PG_UPGRADE_SUPPORT);
 
        for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
        {
@@ -252,6 +253,12 @@ check_loadable_libraries(void)
                if (PQresultStatus(res) != PGRES_COMMAND_OK)
                {
                        found = true;
+
+                       /* exit and report missing support library with special message */
+                       if (strcmp(lib, PG_UPGRADE_SUPPORT) == 0)
+                               pg_log(PG_FATAL,
+                                  "The pg_upgrade_support module must be created and installed in the new cluster.\n");
+
                        if (script == NULL && (script = fopen(output_path, "w")) == NULL)
                                pg_log(PG_FATAL, "Could not create necessary file:  %s\n",
                                           output_path);