aboutsummaryrefslogtreecommitdiff
path: root/src/backend/catalog/catalog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/catalog/catalog.c')
-rw-r--r--src/backend/catalog/catalog.c62
1 files changed, 48 insertions, 14 deletions
diff --git a/src/backend/catalog/catalog.c b/src/backend/catalog/catalog.c
index afea81a976c..32d4d33d89a 100644
--- a/src/backend/catalog/catalog.c
+++ b/src/backend/catalog/catalog.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/catalog/catalog.c,v 1.51 2004/01/06 18:07:31 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/catalog/catalog.c,v 1.52 2004/06/18 06:13:19 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -20,30 +20,48 @@
#include "catalog/catalog.h"
#include "catalog/catname.h"
#include "catalog/pg_namespace.h"
+#include "catalog/pg_tablespace.h"
#include "miscadmin.h"
+#define OIDCHARS 10 /* max chars printed by %u */
+
+
/*
* relpath - construct path to a relation's file
*
* Result is a palloc'd string.
*/
-
char *
relpath(RelFileNode rnode)
{
+ int pathlen;
char *path;
- if (rnode.tblNode == (Oid) 0) /* "global tablespace" */
+ if (rnode.spcNode == GLOBALTABLESPACE_OID)
{
/* Shared system relations live in {datadir}/global */
- path = (char *) palloc(strlen(DataDir) + 8 + sizeof(NameData) + 1);
- sprintf(path, "%s/global/%u", DataDir, rnode.relNode);
+ Assert(rnode.dbNode == 0);
+ pathlen = strlen(DataDir) + 8 + OIDCHARS + 1;
+ path = (char *) palloc(pathlen);
+ snprintf(path, pathlen, "%s/global/%u",
+ DataDir, rnode.relNode);
+ }
+ else if (rnode.spcNode == DEFAULTTABLESPACE_OID)
+ {
+ /* The default tablespace is {datadir}/base */
+ pathlen = strlen(DataDir) + 6 + OIDCHARS + 1 + OIDCHARS + 1;
+ path = (char *) palloc(pathlen);
+ snprintf(path, pathlen, "%s/base/%u/%u",
+ DataDir, rnode.dbNode, rnode.relNode);
}
else
{
- path = (char *) palloc(strlen(DataDir) + 6 + 2 * sizeof(NameData) + 3);
- sprintf(path, "%s/base/%u/%u", DataDir, rnode.tblNode, rnode.relNode);
+ /* All other tablespaces are accessed via symlinks */
+ pathlen = strlen(DataDir) + 16 + OIDCHARS + 1 + OIDCHARS + 1 + OIDCHARS + 1;
+ path = (char *) palloc(pathlen);
+ snprintf(path, pathlen, "%s/pg_tablespaces/%u/%u/%u",
+ DataDir, rnode.spcNode, rnode.dbNode, rnode.relNode);
}
return path;
}
@@ -52,23 +70,39 @@ relpath(RelFileNode rnode)
* GetDatabasePath - construct path to a database dir
*
* Result is a palloc'd string.
+ *
+ * XXX this must agree with relpath()!
*/
-
char *
-GetDatabasePath(Oid tblNode)
+GetDatabasePath(Oid dbNode, Oid spcNode)
{
+ int pathlen;
char *path;
- if (tblNode == (Oid) 0) /* "global tablespace" */
+ if (spcNode == GLOBALTABLESPACE_OID)
{
/* Shared system relations live in {datadir}/global */
- path = (char *) palloc(strlen(DataDir) + 8);
- sprintf(path, "%s/global", DataDir);
+ Assert(dbNode == 0);
+ pathlen = strlen(DataDir) + 7 + 1;
+ path = (char *) palloc(pathlen);
+ snprintf(path, pathlen, "%s/global",
+ DataDir);
+ }
+ else if (spcNode == DEFAULTTABLESPACE_OID)
+ {
+ /* The default tablespace is {datadir}/base */
+ pathlen = strlen(DataDir) + 6 + OIDCHARS + 1;
+ path = (char *) palloc(pathlen);
+ snprintf(path, pathlen, "%s/base/%u",
+ DataDir, dbNode);
}
else
{
- path = (char *) palloc(strlen(DataDir) + 6 + sizeof(NameData) + 1);
- sprintf(path, "%s/base/%u", DataDir, tblNode);
+ /* All other tablespaces are accessed via symlinks */
+ pathlen = strlen(DataDir) + 16 + OIDCHARS + 1 + OIDCHARS + 1;
+ path = (char *) palloc(pathlen);
+ snprintf(path, pathlen, "%s/pg_tablespaces/%u/%u",
+ DataDir, spcNode, dbNode);
}
return path;
}