aboutsummaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/catalog/catalog.c57
-rw-r--r--src/backend/catalog/heap.c95
-rw-r--r--src/backend/commands/dbcommands.c24
-rw-r--r--src/backend/commands/rename.c4
-rw-r--r--src/backend/postmaster/postmaster.c9
-rw-r--r--src/backend/storage/buffer/bufmgr.c78
-rw-r--r--src/backend/storage/smgr/md.c48
-rw-r--r--src/backend/storage/smgr/smgr.c53
-rw-r--r--src/backend/utils/cache/relcache.c17
-rw-r--r--src/backend/utils/init/postinit.c15
-rw-r--r--src/backend/utils/misc/database.c12
11 files changed, 355 insertions, 57 deletions
diff --git a/src/backend/catalog/catalog.c b/src/backend/catalog/catalog.c
index dd9c774e2ca..4203a5a15dc 100644
--- a/src/backend/catalog/catalog.c
+++ b/src/backend/catalog/catalog.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/catalog/catalog.c,v 1.33 2000/07/03 20:48:28 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/catalog/catalog.c,v 1.34 2000/10/16 14:52:02 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -22,6 +22,7 @@
#include "miscadmin.h"
#include "utils/syscache.h"
+#ifdef OLD_FILE_NAMING
/*
* relpath - construct path to a relation's file
*
@@ -104,6 +105,60 @@ relpath_blind(const char *dbname, const char *relname,
return path;
}
+#else /* ! OLD_FILE_NAMING */
+
+/*
+ * relpath - construct path to a relation's file
+ *
+ * Result is a palloc'd string.
+ */
+
+char *
+relpath(RelFileNode rnode)
+{
+ char *path;
+
+ if (rnode.tblNode == (Oid) 0) /* "global tablespace" */
+ {
+ /* Shared system relations live in {datadir}/global */
+ path = (char *) palloc(strlen(DataDir) + 8 + sizeof(NameData) + 1);
+ sprintf(path, "%s%cglobal%c%u", DataDir, SEP_CHAR, SEP_CHAR, rnode.relNode);
+ }
+ else
+ {
+ path = (char *) palloc(strlen(DataDir) + 6 + 2 * sizeof(NameData) + 3);
+ sprintf(path, "%s%cbase%c%u%c%u", DataDir, SEP_CHAR, SEP_CHAR,
+ rnode.tblNode, SEP_CHAR, rnode.relNode);
+ }
+ return path;
+}
+
+/*
+ * GetDatabasePath - construct path to a database dir
+ *
+ * Result is a palloc'd string.
+ */
+
+char *
+GetDatabasePath(Oid tblNode)
+{
+ char *path;
+
+ if (tblNode == (Oid) 0) /* "global tablespace" */
+ {
+ /* Shared system relations live in {datadir}/global */
+ path = (char *) palloc(strlen(DataDir) + 8);
+ sprintf(path, "%s%cglobal", DataDir, SEP_CHAR);
+ }
+ else
+ {
+ path = (char *) palloc(strlen(DataDir) + 6 + sizeof(NameData) + 1);
+ sprintf(path, "%s%cbase%c%u", DataDir, SEP_CHAR, SEP_CHAR, tblNode);
+ }
+ return path;
+}
+
+#endif /* OLD_FILE_NAMING */
/*
* IsSystemRelationName
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 5353108b98e..fbdd1ae0cf9 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.148 2000/10/11 21:28:18 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.149 2000/10/16 14:52:02 vadim Exp $
*
*
* INTERFACE ROUTINES
@@ -177,12 +177,13 @@ heap_create(char *relname,
{
static unsigned int uniqueId = 0;
- Oid relid;
- Relation rel;
- bool nailme = false;
- int natts = tupDesc->natts;
- int i;
- MemoryContext oldcxt;
+ Oid relid;
+ Relation rel;
+ bool nailme = false;
+ int natts = tupDesc->natts;
+ int i;
+ MemoryContext oldcxt;
+ Oid tblNode = MyDatabaseId;
/* ----------------
* sanity checks
@@ -203,25 +204,65 @@ heap_create(char *relname,
* descriptor follows.
* ----------------
*/
- if (relname && strcmp(RelationRelationName, relname) == 0)
- {
- relid = RelOid_pg_class;
- nailme = true;
- }
- else if (relname && strcmp(AttributeRelationName, relname) == 0)
- {
- relid = RelOid_pg_attribute;
- nailme = true;
- }
- else if (relname && strcmp(ProcedureRelationName, relname) == 0)
- {
- relid = RelOid_pg_proc;
- nailme = true;
- }
- else if (relname && strcmp(TypeRelationName, relname) == 0)
+ if (relname && IsSystemRelationName(relname))
{
- relid = RelOid_pg_type;
- nailme = true;
+ if (strcmp(TypeRelationName, relname) == 0)
+ {
+ nailme = true;
+ relid = RelOid_pg_type;
+ }
+ else if (strcmp(AttributeRelationName, relname) == 0)
+ {
+ nailme = true;
+ relid = RelOid_pg_attribute;
+ }
+ else if (strcmp(ProcedureRelationName, relname) == 0)
+ {
+ nailme = true;
+ relid = RelOid_pg_proc;
+ }
+ else if (strcmp(RelationRelationName, relname) == 0)
+ {
+ nailme = true;
+ relid = RelOid_pg_class;
+ }
+ else if (strcmp(ShadowRelationName, relname) == 0)
+ {
+ tblNode = InvalidOid;
+ relid = RelOid_pg_shadow;
+ }
+ else if (strcmp(GroupRelationName, relname) == 0)
+ {
+ tblNode = InvalidOid;
+ relid = RelOid_pg_group;
+ }
+ else if (strcmp(DatabaseRelationName, relname) == 0)
+ {
+ tblNode = InvalidOid;
+ relid = RelOid_pg_database;
+ }
+ else if (strcmp(VariableRelationName, relname) == 0)
+ {
+ tblNode = InvalidOid;
+ relid = RelOid_pg_variable;
+ }
+ else if (strcmp(LogRelationName, relname) == 0)
+ {
+ tblNode = InvalidOid;
+ relid = RelOid_pg_log;
+ }
+ else if (strcmp(AttrDefaultRelationName, relname) == 0)
+ relid = RelOid_pg_attrdef;
+ else if (strcmp(RelCheckRelationName, relname) == 0)
+ relid = RelOid_pg_relcheck;
+ else if (strcmp(TriggerRelationName, relname) == 0)
+ relid = RelOid_pg_trigger;
+ else
+ {
+ relid = newoid();
+ if (IsSharedSystemRelationName(relname))
+ tblNode = InvalidOid;
+ }
}
else
relid = newoid();
@@ -290,6 +331,10 @@ heap_create(char *relname,
rel->rd_rel->reltype = relid;
}
+ rel->rd_node.tblNode = tblNode;
+ rel->rd_node.relNode = relid;
+ rel->rd_rel->relfilenode = relid;
+
/* ----------------
* done building relcache entry.
* ----------------
diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c
index f320979af99..f12ce4e56c7 100644
--- a/src/backend/commands/dbcommands.c
+++ b/src/backend/commands/dbcommands.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.60 2000/09/06 14:15:16 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.61 2000/10/16 14:52:03 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -25,6 +25,7 @@
#include "access/heapam.h"
#include "catalog/catname.h"
+#include "catalog/catalog.h"
#include "catalog/pg_database.h"
#include "catalog/pg_shadow.h"
#include "commands/comment.h"
@@ -76,6 +77,7 @@ createdb(const char *dbname, const char *dbpath, int encoding)
if (IsTransactionBlock())
elog(ERROR, "CREATE DATABASE: may not be called in a transaction block");
+#ifdef OLD_FILE_NAMING
/* Generate directory name for the new database */
if (dbpath == NULL || strcmp(dbpath, dbname) == 0)
strcpy(locbuf, dbname);
@@ -89,6 +91,7 @@ createdb(const char *dbname, const char *dbpath, int encoding)
"The database path '%s' is invalid. "
"This may be due to a character that is not allowed or because the chosen "
"path isn't permitted for databases", dbpath);
+#endif
/*
* Insert a new tuple into pg_database
@@ -111,6 +114,10 @@ createdb(const char *dbname, const char *dbpath, int encoding)
*/
heap_insert(pg_database_rel, tuple);
+#ifndef OLD_FILE_NAMING
+ loc = GetDatabasePath(tuple->t_data->t_oid);
+#endif
+
/*
* Update indexes (there aren't any currently)
*/
@@ -140,8 +147,19 @@ createdb(const char *dbname, const char *dbpath, int encoding)
if (mkdir(loc, S_IRWXU) != 0)
elog(ERROR, "CREATE DATABASE: unable to create database directory '%s': %s", loc, strerror(errno));
+#ifdef OLD_FILE_NAMING
snprintf(buf, sizeof(buf), "cp %s%cbase%ctemplate1%c* '%s'",
DataDir, SEP_CHAR, SEP_CHAR, SEP_CHAR, loc);
+#else
+ {
+ char *tmpl = GetDatabasePath(TemplateDbOid);
+
+ snprintf(buf, sizeof(buf), "cp %s%c* '%s'",
+ tmpl, SEP_CHAR, loc);
+ pfree(tmpl);
+ }
+#endif
+
ret = system(buf);
/* Some versions of SunOS seem to return ECHILD after a system() call */
#if defined(sun)
@@ -204,12 +222,16 @@ dropdb(const char *dbname)
if (GetUserId() != db_owner && !use_super)
elog(ERROR, "DROP DATABASE: Permission denied");
+#ifdef OLD_FILE_NAMING
path = ExpandDatabasePath(dbpath);
if (path == NULL)
elog(ERROR,
"The database path '%s' is invalid. "
"This may be due to a character that is not allowed or because the chosen "
"path isn't permitted for databases", path);
+#else
+ path = GetDatabasePath(db_id);
+#endif
/*
* Obtain exclusive lock on pg_database. We need this to ensure that
diff --git a/src/backend/commands/rename.c b/src/backend/commands/rename.c
index 0519df323da..7fcf2e333f6 100644
--- a/src/backend/commands/rename.c
+++ b/src/backend/commands/rename.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.47 2000/09/06 14:15:16 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.48 2000/10/16 14:52:03 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -311,6 +311,7 @@ renamerel(const char *oldrelname, const char *newrelname)
if (relkind != RELKIND_INDEX)
TypeRename(oldrelname, newrelname);
+#ifdef OLD_FILE_NAMING
/*
* Perform physical rename of files. If this fails, we haven't yet
* done anything irreversible. NOTE that this MUST be the last step;
@@ -340,4 +341,5 @@ renamerel(const char *oldrelname, const char *newrelname)
toldpath, tnewpath);
}
}
+#endif
}
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 2f4c2a19fc3..6f9a16af355 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.171 2000/10/11 17:58:01 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.172 2000/10/16 14:52:08 vadim Exp $
*
* NOTES
*
@@ -60,6 +60,7 @@
#include "getopt.h"
#endif
+#include "catalog/pg_database.h"
#include "commands/async.h"
#include "lib/dllist.h"
#include "libpq/auth.h"
@@ -278,8 +279,14 @@ checkDataDir(const char *DataDir)
exit(2);
}
+#ifdef OLD_FILE_NAMING
snprintf(path, sizeof(path), "%s%cbase%ctemplate1%cpg_class",
DataDir, SEP_CHAR, SEP_CHAR, SEP_CHAR);
+#else
+ snprintf(path, sizeof(path), "%s%cbase%c%u%c%u",
+ DataDir, SEP_CHAR, SEP_CHAR,
+ TemplateDbOid, SEP_CHAR, RelOid_pg_class);
+#endif
fp = AllocateFile(path, PG_BINARY_R);
if (fp == NULL)
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index 24a70d61885..d5badefd084 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.85 2000/09/29 03:55:45 inoue Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/buffer/bufmgr.c,v 1.86 2000/10/16 14:52:09 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -614,6 +614,9 @@ BufferAlloc(Relation reln,
/* record the database name and relation name for this buffer */
strcpy(buf->blind.dbname, DatabaseName);
strcpy(buf->blind.relname, RelationGetPhysicalRelationName(reln));
+#ifndef OLD_FILE_NAMING
+ buf->blind.rnode = reln->rd_node;
+#endif
INIT_BUFFERTAG(&(buf->tag), reln, blockNum);
if (!BufTableInsert(buf))
@@ -779,10 +782,12 @@ FlushBuffer(Buffer buffer, bool release)
Assert(PrivateRefCount[buffer - 1] > 0); /* else caller didn't pin */
bufHdr = &BufferDescriptors[buffer - 1];
+
bufdb = bufHdr->tag.relId.dbId;
Assert(bufdb == MyDatabaseId || bufdb == (Oid) NULL);
bufrel = RelationIdCacheGetRelation(bufHdr->tag.relId.relId);
+
Assert(bufrel != (Relation) NULL);
SharedBufferChanged = true;
@@ -962,12 +967,18 @@ SetBufferDirtiedByMe(Buffer buffer, BufferDesc *bufHdr)
if (reln == (Relation) NULL)
{
+#ifdef OLD_FILE_NAMING
+ status = smgrblindmarkdirty(DEFAULT_SMGR,
+ BufferBlindLastDirtied[buffer - 1].dbname,
+ BufferBlindLastDirtied[buffer - 1].relname,
+ tagLastDirtied->relId.dbId,
+ tagLastDirtied->relId.relId,
+ tagLastDirtied->blockNum);
+#else
status = smgrblindmarkdirty(DEFAULT_SMGR,
- BufferBlindLastDirtied[buffer - 1].dbname,
- BufferBlindLastDirtied[buffer - 1].relname,
- tagLastDirtied->relId.dbId,
- tagLastDirtied->relId.relId,
- tagLastDirtied->blockNum);
+ BufferBlindLastDirtied[buffer - 1].rnode,
+ tagLastDirtied->blockNum);
+#endif
}
else
{
@@ -1017,10 +1028,10 @@ ClearBufferDirtiedByMe(Buffer buffer, BufferDesc *bufHdr)
* the data we just wrote. This is unlikely, but possible if some
* other backend replaced the buffer contents since we set our flag.
*/
- if (bufHdr->tag.relId.dbId == tagLastDirtied->relId.dbId &&
- bufHdr->tag.relId.relId == tagLastDirtied->relId.relId &&
- bufHdr->tag.blockNum == tagLastDirtied->blockNum)
- BufferDirtiedByMe[buffer - 1] = false;
+ if (bufHdr->tag.relId.dbId == tagLastDirtied->relId.dbId &&
+ bufHdr->tag.relId.relId == tagLastDirtied->relId.relId &&
+ bufHdr->tag.blockNum == tagLastDirtied->blockNum)
+ BufferDirtiedByMe[buffer - 1] = false;
}
/*
@@ -1136,13 +1147,21 @@ BufferSync()
*/
if (reln == (Relation) NULL)
{
+#ifdef OLD_FILE_NAMING
status = smgrblindwrt(DEFAULT_SMGR,
- bufHdr->blind.dbname,
- bufHdr->blind.relname,
- bufdb, bufrel,
- bufHdr->tag.blockNum,
- (char *) MAKE_PTR(bufHdr->data),
- true); /* must fsync */
+ bufHdr->blind.dbname,
+ bufHdr->blind.relname,
+ bufdb, bufrel,
+ bufHdr->tag.blockNum,
+ (char *) MAKE_PTR(bufHdr->data),
+ true); /* must fsync */
+#else
+ status = smgrblindwrt(DEFAULT_SMGR,
+ bufHdr->blind.rnode,
+ bufHdr->tag.blockNum,
+ (char *) MAKE_PTR(bufHdr->data),
+ true); /* must fsync */
+#endif
}
else
{
@@ -1202,12 +1221,18 @@ BufferSync()
reln = RelationIdCacheGetRelation(BufferTagLastDirtied[i].relId.relId);
if (reln == (Relation) NULL)
{
+#ifdef OLD_FILE_NAMING
status = smgrblindmarkdirty(DEFAULT_SMGR,
- BufferBlindLastDirtied[i].dbname,
- BufferBlindLastDirtied[i].relname,
- BufferTagLastDirtied[i].relId.dbId,
- BufferTagLastDirtied[i].relId.relId,
- BufferTagLastDirtied[i].blockNum);
+ BufferBlindLastDirtied[i].dbname,
+ BufferBlindLastDirtied[i].relname,
+ BufferTagLastDirtied[i].relId.dbId,
+ BufferTagLastDirtied[i].relId.relId,
+ BufferTagLastDirtied[i].blockNum);
+#else
+ status = smgrblindmarkdirty(DEFAULT_SMGR,
+ BufferBlindLastDirtied[i].rnode,
+ BufferTagLastDirtied[i].blockNum);
+#endif
}
else
{
@@ -1556,11 +1581,18 @@ BufferReplace(BufferDesc *bufHdr)
}
else
{
+#ifdef OLD_FILE_NAMING
status = smgrblindwrt(DEFAULT_SMGR, bufHdr->blind.dbname,
bufHdr->blind.relname, bufdb, bufrel,
bufHdr->tag.blockNum,
(char *) MAKE_PTR(bufHdr->data),
false); /* no fsync */
+#else
+ status = smgrblindwrt(DEFAULT_SMGR, bufHdr->blind.rnode,
+ bufHdr->tag.blockNum,
+ (char *) MAKE_PTR(bufHdr->data),
+ false); /* no fsync */
+#endif
}
LockBuffer(BufferDescriptorGetBuffer(bufHdr), BUFFER_LOCK_UNLOCK);
@@ -1784,8 +1816,8 @@ blockNum=%d, flags=0x%x, refcount=%d %ld)",
for (i = 0; i < NBuffers; ++i, ++buf)
{
printf("[%-2d] (%s, %d) flags=0x%x, refcnt=%d %ld)\n",
- i, buf->blind.relname, buf->tag.blockNum,
- buf->flags, buf->refcount, PrivateRefCount[i]);
+ i, buf->blind.relname, buf->tag.blockNum,
+ buf->flags, buf->refcount, PrivateRefCount[i]);
}
}
}
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c
index 2207af4fa19..23551044c25 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.74 2000/07/17 03:05:11 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.75 2000/10/16 14:52:12 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -75,8 +75,14 @@ static void mdclose_fd(int fd);
static int _mdfd_getrelnfd(Relation reln);
static MdfdVec *_mdfd_openseg(Relation reln, int segno, int oflags);
static MdfdVec *_mdfd_getseg(Relation reln, int blkno);
+
+#ifdef OLD_FILE_NAMING
static int _mdfd_blind_getseg(char *dbname, char *relname,
Oid dbid, Oid relid, int blkno);
+#else
+static int _mdfd_blind_getseg(RelFileNode rnode, int blkno);
+#endif
+
static int _fdvec_alloc(void);
static void _fdvec_free(int);
static BlockNumber _mdnblocks(File file, Size blcksz);
@@ -128,7 +134,11 @@ mdcreate(Relation reln)
Assert(reln->rd_unlinked && reln->rd_fd < 0);
+#ifdef OLD_FILE_NAMING
path = relpath(RelationGetPhysicalRelationName(reln));
+#else
+ path = relpath(reln->rd_node);
+#endif
fd = FileNameOpenFile(path, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, 0600);
/*
@@ -326,7 +336,11 @@ mdopen(Relation reln)
int vfd;
Assert(reln->rd_fd < 0);
+#ifdef OLD_FILE_NAMING
path = relpath(RelationGetPhysicalRelationName(reln));
+#else
+ path = relpath(reln->rd_node);
+#endif
fd = FileNameOpenFile(path, O_RDWR | PG_BINARY, 0600);
if (fd < 0)
@@ -565,6 +579,7 @@ mdflush(Relation reln, BlockNumber blocknum, char *buffer)
* the file, making it more like mdflush().
*/
int
+#ifdef OLD_FILE_NAMING
mdblindwrt(char *dbname,
char *relname,
Oid dbid,
@@ -572,12 +587,22 @@ mdblindwrt(char *dbname,
BlockNumber blkno,
char *buffer,
bool dofsync)
+#else
+mdblindwrt(RelFileNode rnode,
+ BlockNumber blkno,
+ char *buffer,
+ bool dofsync)
+#endif
{
int status;
long seekpos;
int fd;
+#ifdef OLD_FILE_NAMING
fd = _mdfd_blind_getseg(dbname, relname, dbid, relid, blkno);
+#else
+ fd = _mdfd_blind_getseg(rnode, blkno);
+#endif
if (fd < 0)
return SM_FAIL;
@@ -651,16 +676,25 @@ mdmarkdirty(Relation reln, BlockNumber blkno)
* rather than building md/fd datastructures to postpone it till later.
*/
int
+#ifdef OLD_FILE_NAMING
mdblindmarkdirty(char *dbname,
char *relname,
Oid dbid,
Oid relid,
BlockNumber blkno)
+#else
+mdblindmarkdirty(RelFileNode rnode,
+ BlockNumber blkno)
+#endif
{
int status;
int fd;
+#ifdef OLD_FILE_NAMING
fd = _mdfd_blind_getseg(dbname, relname, dbid, relid, blkno);
+#else
+ fd = _mdfd_blind_getseg(rnode, blkno);
+#endif
if (fd < 0)
return SM_FAIL;
@@ -969,7 +1003,11 @@ _mdfd_openseg(Relation reln, int segno, int oflags)
*fullpath;
/* be sure we have enough space for the '.segno', if any */
+#ifdef OLD_FILE_NAMING
path = relpath(RelationGetPhysicalRelationName(reln));
+#else
+ path = relpath(reln->rd_node);
+#endif
if (segno > 0)
{
@@ -1084,8 +1122,12 @@ _mdfd_getseg(Relation reln, int blkno)
*/
static int
+#ifdef OLD_FILE_NAMING
_mdfd_blind_getseg(char *dbname, char *relname, Oid dbid, Oid relid,
int blkno)
+#else
+_mdfd_blind_getseg(RelFileNode rnode, int blkno)
+#endif
{
char *path;
int fd;
@@ -1095,8 +1137,12 @@ _mdfd_blind_getseg(char *dbname, char *relname, Oid dbid, Oid relid,
#endif
+#ifdef OLD_FILE_NAMING
/* construct the path to the relation */
path = relpath_blind(dbname, relname, dbid, relid);
+#else
+ path = relpath(rnode);
+#endif
#ifndef LET_OS_MANAGE_FILESIZE
/* append the '.segno', if needed */
diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c
index 1eb17a60b2e..8bcb13fd4e2 100644
--- a/src/backend/storage/smgr/smgr.c
+++ b/src/backend/storage/smgr/smgr.c
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.39 2000/10/02 21:45:33 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.40 2000/10/16 14:52:12 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -36,14 +36,23 @@ typedef struct f_smgr
char *buffer);
int (*smgr_flush) (Relation reln, BlockNumber blocknum,
char *buffer);
+#ifdef OLD_FILE_NAMING
int (*smgr_blindwrt) (char *dbname, char *relname,
Oid dbid, Oid relid,
BlockNumber blkno, char *buffer,
bool dofsync);
+#else
+ int (*smgr_blindwrt) (RelFileNode rnode, BlockNumber blkno,
+ char *buffer, bool dofsync);
+#endif
int (*smgr_markdirty) (Relation reln, BlockNumber blkno);
+#ifdef OLD_FILE_NAMING
int (*smgr_blindmarkdirty) (char *dbname, char *relname,
Oid dbid, Oid relid,
BlockNumber blkno);
+#else
+ int (*smgr_blindmarkdirty) (RelFileNode, BlockNumber blkno);
+#endif
int (*smgr_nblocks) (Relation reln);
int (*smgr_truncate) (Relation reln, int nblocks);
int (*smgr_commit) (void); /* may be NULL */
@@ -301,6 +310,7 @@ smgrflush(int16 which, Relation reln, BlockNumber blocknum, char *buffer)
* this page down to stable storage in this circumstance. The
* write should be synchronous if dofsync is true.
*/
+#ifdef OLD_FILE_NAMING
int
smgrblindwrt(int16 which,
char *dbname,
@@ -332,6 +342,27 @@ smgrblindwrt(int16 which,
return status;
}
+#else
+
+int
+smgrblindwrt(int16 which,
+ RelFileNode rnode,
+ BlockNumber blkno,
+ char *buffer,
+ bool dofsync)
+{
+ int status;
+
+ status = (*(smgrsw[which].smgr_blindwrt)) (rnode, blkno, buffer, dofsync);
+
+ if (status == SM_FAIL)
+ elog(ERROR, "cannot write block %d of %u/%u blind: %m",
+ blkno, rnode.tblNode, rnode.relNode);
+
+ return status;
+}
+#endif
+
/*
* smgrmarkdirty() -- Mark a page dirty (needs fsync).
*
@@ -363,6 +394,7 @@ smgrmarkdirty(int16 which,
*
* Just like smgrmarkdirty, except we don't have a reldesc.
*/
+#ifdef OLD_FILE_NAMING
int
smgrblindmarkdirty(int16 which,
char *dbname,
@@ -393,6 +425,25 @@ smgrblindmarkdirty(int16 which,
return status;
}
+#else
+
+int
+smgrblindmarkdirty(int16 which,
+ RelFileNode rnode,
+ BlockNumber blkno)
+{
+ int status;
+
+ status = (*(smgrsw[which].smgr_blindmarkdirty)) (rnode, blkno);
+
+ if (status == SM_FAIL)
+ elog(ERROR, "cannot mark block %d of %u/%u blind: %m",
+ blkno, rnode.tblNode, rnode.relNode);
+
+ return status;
+}
+#endif
+
/*
* smgrnblocks() -- Calculate the number of POSTGRES blocks in the
* supplied relation.
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index e39f1cfd12d..755359e2514 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.111 2000/09/12 04:49:13 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.112 2000/10/16 14:52:13 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1017,6 +1017,12 @@ RelationBuildDesc(RelationBuildDescInfo buildinfo,
*/
RelationInitLockInfo(relation); /* see lmgr.c */
+ if (IsSharedSystemRelationName(NameStr(relation->rd_rel->relname)))
+ relation->rd_node.tblNode = InvalidOid;
+ else
+ relation->rd_node.tblNode = MyDatabaseId;
+ relation->rd_node.relNode = relation->rd_rel->relfilenode;
+
/* ----------------
* open the relation and assign the file descriptor returned
* by the storage manager code to rd_fd.
@@ -1192,6 +1198,13 @@ formrdesc(char *relationName,
*/
RelationCacheInsert(relation);
+ if (IsSharedSystemRelationName(relationName))
+ relation->rd_node.tblNode = InvalidOid;
+ else
+ relation->rd_node.tblNode = MyDatabaseId;
+ relation->rd_node.relNode =
+ relation->rd_rel->relfilenode = RelationGetRelid(relation);
+
/*
* Determining this requires a scan on pg_class, but to do the scan
* the rdesc for pg_class must already exist. Therefore we must do
@@ -2438,6 +2451,8 @@ init_irels(void)
/* the file descriptor is not yet opened */
ird->rd_fd = -1;
+ ird->rd_node.tblNode = MyDatabaseId;
+
/* next, read the access method tuple form */
if ((nread = FileRead(fd, (char *) &len, sizeof(len))) != sizeof(len))
{
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
index cc3a3825c40..cee8dfaac90 100644
--- a/src/backend/utils/init/postinit.c
+++ b/src/backend/utils/init/postinit.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.67 2000/10/02 19:42:54 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.68 2000/10/16 14:52:15 vadim Exp $
*
*
*-------------------------------------------------------------------------
@@ -21,6 +21,10 @@
#include <math.h>
#include <unistd.h>
+#ifndef OLD_FILE_NAMING
+#include "catalog/catalog.h"
+#endif
+
#include "access/heapam.h"
#include "catalog/catname.h"
#include "catalog/pg_database.h"
@@ -242,7 +246,12 @@ InitPostgres(const char *dbname, const char *username)
*/
if (bootstrap)
{
+ MyDatabaseId = TemplateDbOid;
+#ifdef OLD_FILE_NAMING
SetDatabasePath(ExpandDatabasePath(dbname));
+#else
+ SetDatabasePath(GetDatabasePath(MyDatabaseId));
+#endif
LockDisable(true);
}
else
@@ -276,9 +285,13 @@ InitPostgres(const char *dbname, const char *username)
"Database \"%s\" does not exist in the system catalog.",
dbname);
+#ifdef OLD_FILE_NAMING
fullpath = ExpandDatabasePath(datpath);
if (!fullpath)
elog(FATAL, "Database path could not be resolved.");
+#else
+ fullpath = GetDatabasePath(MyDatabaseId);
+#endif
/* Verify the database path */
diff --git a/src/backend/utils/misc/database.c b/src/backend/utils/misc/database.c
index 4be24e164f1..f415e5aee18 100644
--- a/src/backend/utils/misc/database.c
+++ b/src/backend/utils/misc/database.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/misc/Attic/database.c,v 1.39 2000/07/03 20:48:42 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/misc/Attic/database.c,v 1.40 2000/10/16 14:52:19 vadim Exp $
*
*-------------------------------------------------------------------------
*/
@@ -22,6 +22,7 @@
#include "access/xact.h"
#include "catalog/catname.h"
+#include "catalog/catalog.h"
#include "catalog/pg_database.h"
#include "miscadmin.h"
#include "utils/syscache.h"
@@ -143,8 +144,17 @@ GetRawDatabaseInfo(const char *name, Oid *db_id, char *path)
char *dbfname;
Form_pg_database tup_db;
+#ifdef OLD_FILE_NAMING
dbfname = (char *) palloc(strlen(DataDir) + 8 + strlen(DatabaseRelationName) + 2);
sprintf(dbfname, "%s/global/%s", DataDir, DatabaseRelationName);
+#else
+ {
+ RelFileNode rnode;
+ rnode.tblNode = 0;
+ rnode.relNode = RelOid_pg_database;
+ dbfname = relpath(rnode);
+ }
+#endif
if ((dbfd = open(dbfname, O_RDONLY | PG_BINARY, 0)) < 0)
elog(FATAL, "cannot open %s: %s", dbfname, strerror(errno));