diff options
author | Vadim B. Mikheev | 2000-10-16 14:52:28 +0000 |
---|---|---|
committer | Vadim B. Mikheev | 2000-10-16 14:52:28 +0000 |
commit | 2c7de17b075baf7be270acf4d541bd4b17047e4c (patch) | |
tree | c9b7aff45678be41380551d87b6168f317064934 /src/backend | |
parent | 07a55ebf646eb244f52afc11fcca189b0d006970 (diff) |
New file naming. Database OID is used as "tablespace" id and
relation OID is used as file node on creation but may be changed later
if required. Regression Tests Approved (c) -:)))
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)); |