aboutsummaryrefslogtreecommitdiff
path: root/contrib/pg_upgrade/tablespace.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/pg_upgrade/tablespace.c')
-rw-r--r--contrib/pg_upgrade/tablespace.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/contrib/pg_upgrade/tablespace.c b/contrib/pg_upgrade/tablespace.c
new file mode 100644
index 00000000000..302eb0d1cb1
--- /dev/null
+++ b/contrib/pg_upgrade/tablespace.c
@@ -0,0 +1,85 @@
+/*
+ * tablespace.c
+ *
+ * tablespace functions
+ */
+
+#include "pg_upgrade.h"
+
+static void get_tablespace_paths(migratorContext *ctx);
+static void set_tablespace_directory_suffix(migratorContext *ctx,
+ Cluster whichCluster);
+
+
+void
+init_tablespaces(migratorContext *ctx)
+{
+ get_tablespace_paths(ctx);
+
+ set_tablespace_directory_suffix(ctx, CLUSTER_OLD);
+ set_tablespace_directory_suffix(ctx, CLUSTER_NEW);
+
+ if (ctx->num_tablespaces > 0 &&
+ strcmp(ctx->old.tablespace_suffix, ctx->new.tablespace_suffix) == 0)
+ pg_log(ctx, PG_FATAL,
+ "Cannot migrate to/from the same system catalog version when\n"
+ "using tablespaces.\n");
+}
+
+
+/*
+ * get_tablespace_paths()
+ *
+ * Scans pg_tablespace and returns a malloc'ed array of all tablespace
+ * paths. Its the caller's responsibility to free the array.
+ */
+static void
+get_tablespace_paths(migratorContext *ctx)
+{
+ PGconn *conn = connectToServer(ctx, "template1", CLUSTER_OLD);
+ PGresult *res;
+ int ntups;
+ int tblnum;
+ int i_spclocation;
+
+ res = executeQueryOrDie(ctx, conn,
+ "SELECT spclocation "
+ "FROM pg_catalog.pg_tablespace "
+ "WHERE spcname != 'pg_default' AND "
+ " spcname != 'pg_global'");
+
+ ctx->num_tablespaces = ntups = PQntuples(res);
+ ctx->tablespaces = (char **) pg_malloc(ctx, ntups * sizeof(char *));
+
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ for (tblnum = 0; tblnum < ntups; tblnum++)
+ ctx->tablespaces[tblnum] = pg_strdup(ctx,
+ PQgetvalue(res, tblnum, i_spclocation));
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ return;
+}
+
+
+static void
+set_tablespace_directory_suffix(migratorContext *ctx, Cluster whichCluster)
+{
+ ClusterInfo *cluster = (whichCluster == CLUSTER_OLD) ? &ctx->old : &ctx->new;
+
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 804)
+ cluster->tablespace_suffix = pg_strdup(ctx, "");
+ else
+ {
+ /* This cluster has a version-specific subdirectory */
+ cluster->tablespace_suffix = pg_malloc(ctx, 4 + strlen(cluster->major_version_str) +
+ 10 /* OIDCHARS */ + 1);
+
+ /* The leading slash is needed to start a new directory. */
+ sprintf(cluster->tablespace_suffix, "/PG_%s_%d", cluster->major_version_str,
+ cluster->controldata.cat_ver);
+ }
+}