diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/catalog/catalog.c | 57 | ||||
-rw-r--r-- | src/backend/catalog/heap.c | 95 | ||||
-rw-r--r-- | src/backend/commands/dbcommands.c | 24 | ||||
-rw-r--r-- | src/backend/commands/rename.c | 4 | ||||
-rw-r--r-- | src/backend/postmaster/postmaster.c | 9 | ||||
-rw-r--r-- | src/backend/storage/buffer/bufmgr.c | 78 | ||||
-rw-r--r-- | src/backend/storage/smgr/md.c | 48 | ||||
-rw-r--r-- | src/backend/storage/smgr/smgr.c | 53 | ||||
-rw-r--r-- | src/backend/utils/cache/relcache.c | 17 | ||||
-rw-r--r-- | src/backend/utils/init/postinit.c | 15 | ||||
-rw-r--r-- | src/backend/utils/misc/database.c | 12 |
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)); |