diff options
author | Vadim B. Mikheev <vadim4o@yahoo.com> | 1998-12-15 12:47:01 +0000 |
---|---|---|
committer | Vadim B. Mikheev <vadim4o@yahoo.com> | 1998-12-15 12:47:01 +0000 |
commit | 3f7fbf85dc5b42dfd33c803efe6c90533773576a (patch) | |
tree | df8f84075ae7a27fa6b7ec0d063a03898e0b1bbb /src/backend/commands/sequence.c | |
parent | c5a27161a188b235ce3c0afb1b12e8942ac8e963 (diff) | |
download | postgresql-3f7fbf85dc5b42dfd33c803efe6c90533773576a.tar.gz postgresql-3f7fbf85dc5b42dfd33c803efe6c90533773576a.zip |
Initial MVCC code.
New code for locking buffer' context.
Diffstat (limited to 'src/backend/commands/sequence.c')
-rw-r--r-- | src/backend/commands/sequence.c | 42 |
1 files changed, 18 insertions, 24 deletions
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index 9edec5a9dc6..e391936cbf8 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -162,7 +162,7 @@ DefineSequence(CreateSeqStmt *seq) rel = heap_openr(seq->seqname); Assert(RelationIsValid(rel)); - RelationSetLockForWrite(rel); + LockRelation(rel, AccessExclusiveLock); tupDesc = RelationGetDescr(rel); @@ -185,7 +185,7 @@ DefineSequence(CreateSeqStmt *seq) if (WriteBuffer(buf) == STATUS_ERROR) elog(ERROR, "DefineSequence: WriteBuffer failed"); - RelationUnsetLockForWrite(rel); + UnlockRelation(rel, AccessExclusiveLock); heap_close(rel); return; @@ -200,7 +200,6 @@ nextval(struct varlena * seqin) SeqTable elm; Buffer buf; Form_pg_sequence seq; - ItemPointerData iptr; int4 incby, maxv, minv, @@ -209,7 +208,7 @@ nextval(struct varlena * seqin) next, rescnt = 0; - /* open and WIntentLock sequence */ + /* open and AccessShareLock sequence */ elm = init_sequence("nextval", seqname); pfree(seqname); @@ -219,7 +218,7 @@ nextval(struct varlena * seqin) return elm->last; } - seq = read_info("nextval", elm, &buf); /* lock page and read + seq = read_info("nextval", elm, &buf); /* lock page' buffer and read * tuple */ next = result = seq->last_value; @@ -282,12 +281,11 @@ nextval(struct varlena * seqin) seq->last_value = next; /* last fetched number */ seq->is_called = 't'; + LockBuffer(buf, BUFFER_LOCK_UNLOCK); + if (WriteBuffer(buf) == STATUS_ERROR) elog(ERROR, "%s.nextval: WriteBuffer failed", elm->name); - ItemPointerSet(&iptr, 0, FirstOffsetNumber); - RelationUnsetSingleWLockPage(elm->rel, &iptr); - return result; } @@ -300,7 +298,7 @@ currval(struct varlena * seqin) SeqTable elm; int4 result; - /* open and WIntentLock sequence */ + /* open and AccessShareLock sequence */ elm = init_sequence("currval", seqname); pfree(seqname); @@ -320,7 +318,6 @@ setval(struct varlena * seqin, int4 next) SeqTable elm; Buffer buf; Form_pg_sequence seq; - ItemPointerData iptr; #ifndef NO_SECURITY if (pg_aclcheck(seqname, getpgusername(), ACL_WR) != ACLCHECK_OK) @@ -328,9 +325,9 @@ setval(struct varlena * seqin, int4 next) seqname, seqname); #endif - /* open and WIntentLock sequence */ + /* open and AccessShareLock sequence */ elm = init_sequence("setval", seqname); - seq = read_info("setval", elm, &buf); /* lock page and read + seq = read_info("setval", elm, &buf); /* lock page' buffer and read * tuple */ if (seq->cache_value != 1) @@ -353,27 +350,22 @@ setval(struct varlena * seqin, int4 next) seq->last_value = next; /* last fetched number */ seq->is_called = 't'; + LockBuffer(buf, BUFFER_LOCK_UNLOCK); + if (WriteBuffer(buf) == STATUS_ERROR) elog(ERROR, "%s.settval: WriteBuffer failed", seqname); - ItemPointerSet(&iptr, 0, FirstOffsetNumber); - RelationUnsetSingleWLockPage(elm->rel, &iptr); - return next; } static Form_pg_sequence read_info(char *caller, SeqTable elm, Buffer *buf) { - ItemPointerData iptr; - PageHeader page; - ItemId lp; + PageHeader page; + ItemId lp; HeapTupleData tuple; sequence_magic *sm; - Form_pg_sequence seq; - - ItemPointerSet(&iptr, 0, FirstOffsetNumber); - RelationSetSingleWLockPage(elm->rel, &iptr); + Form_pg_sequence seq; if (RelationGetNumberOfBlocks(elm->rel) != 1) elog(ERROR, "%s.%s: invalid number of blocks in sequence", @@ -383,6 +375,8 @@ read_info(char *caller, SeqTable elm, Buffer *buf) if (!BufferIsValid(*buf)) elog(ERROR, "%s.%s: ReadBuffer failed", elm->name, caller); + LockBuffer(*buf, BUFFER_LOCK_EXCLUSIVE); + page = (PageHeader) BufferGetPage(*buf); sm = (sequence_magic *) PageGetSpecialPointer(page); @@ -439,7 +433,7 @@ init_sequence(char *caller, char *name) if (!RelationIsValid(temp->rel)) elog(ERROR, "%s.%s: sequence does not exist", name, caller); - RelationSetWIntentLock(temp->rel); + LockRelation(temp->rel, AccessShareLock); if (temp->rel->rd_rel->relkind != RELKIND_SEQUENCE) elog(ERROR, "%s.%s: %s is not sequence !", name, caller, name); @@ -485,7 +479,7 @@ CloseSequences(void) { rel = elm->rel; elm->rel = (Relation) NULL; - RelationUnsetWIntentLock(rel); + UnlockRelation(rel, AccessShareLock); heap_close(rel); } elm = elm->next; |