aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/sequence.c
diff options
context:
space:
mode:
authorVadim B. Mikheev <vadim4o@yahoo.com>1998-12-15 12:47:01 +0000
committerVadim B. Mikheev <vadim4o@yahoo.com>1998-12-15 12:47:01 +0000
commit3f7fbf85dc5b42dfd33c803efe6c90533773576a (patch)
treedf8f84075ae7a27fa6b7ec0d063a03898e0b1bbb /src/backend/commands/sequence.c
parentc5a27161a188b235ce3c0afb1b12e8942ac8e963 (diff)
downloadpostgresql-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.c42
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;