diff options
author | Vadim B. Mikheev <vadim4o@yahoo.com> | 2000-10-13 12:06:40 +0000 |
---|---|---|
committer | Vadim B. Mikheev <vadim4o@yahoo.com> | 2000-10-13 12:06:40 +0000 |
commit | b33428d20c4b93869df5f8839433ea82885b9ac4 (patch) | |
tree | 3db41fa55012109247779d641b8574c58ab5dd1e /src/backend/access/transam/xlogutils.c | |
parent | deee783052892fc92711de95066f58a129906099 (diff) | |
download | postgresql-b33428d20c4b93869df5f8839433ea82885b9ac4.tar.gz postgresql-b33428d20c4b93869df5f8839433ea82885b9ac4.zip |
Various utils for WAL
Diffstat (limited to 'src/backend/access/transam/xlogutils.c')
-rw-r--r-- | src/backend/access/transam/xlogutils.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c new file mode 100644 index 00000000000..8f44fabaa54 --- /dev/null +++ b/src/backend/access/transam/xlogutils.c @@ -0,0 +1,120 @@ +/*------------------------------------------------------------------------- + * + * xlog.c + * + * + * Portions Copyright (c) 1996-2000, PostgreSQL, Inc + * Portions Copyright (c) 1994, Regents of the University of California + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "access/xlog.h" +#include "access/xact.h" + +#ifdef XLOG + +/* + * Check if specified heap tuple was inserted by given + * xaction/command and return + * + * - -1 if not + * - 0 if there is no tuple at all + * - 1 if yes + */ +int +XLogIsOwnerOfTuple(RelFileNode hnode, ItemPointer iptr, + TransactionId xid, CommandId cid) +{ + Relation reln; + Buffer buffer; + Page page; + ItemId lp; + HeapTupleHeader htup; + + reln = XLogOpenRelation(false, RM_HEAP_ID, hnode); + if (!RelationIsValid(reln)) + return(0); + + buffer = ReadBuffer(reln, ItemPointerGetBlockNumber(iptr)); + if (!BufferIsValid(buffer)) + return(0); + + LockBuffer(buffer, BUFFER_LOCK_SHARE); + page = (Page) BufferGetPage(buffer); + if (PageIsNew((PageHeader) page) || + ItemPointerGetOffsetNumber(iptr) > PageGetMaxOffsetNumber(page)) + { + UnlockAndReleaseBuffer(buffer); + return(0); + } + lp = PageGetItemId(page, ItemPointerGetOffsetNumber(iptr)); + if (!ItemIdIsUsed(lp) || ItemIdDeleted(lp)) + { + UnlockAndReleaseBuffer(buffer); + return(0); + } + + htup = (HeapTupleHeader) PageGetItem(page, lp); + + if (PageGetSUI(page) != ThisStartUpID || htup->t_xmin != xid || htup->t_cmin != cid) + { + UnlockAndReleaseBuffer(buffer); + return(-1); + } + + UnlockAndReleaseBuffer(buffer); + return(1); +} + +/* + * Check if exists valid (inserted by not aborted xaction) heap tuple + * for given item pointer + */ +bool +XLogIsValidTuple(RelFileNode hnode, ItemPointer iptr) +{ + Relation reln; + Buffer buffer; + Page page; + ItemId lp; + HeapTupleHeader htup; + + reln = XLogOpenRelation(false, RM_HEAP_ID, hnode); + if (!RelationIsValid(reln)) + return(false); + + buffer = ReadBuffer(reln, ItemPointerGetBlockNumber(iptr)); + if (!BufferIsValid(buffer)) + return(false); + + LockBuffer(buffer, BUFFER_LOCK_SHARE); + page = (Page) BufferGetPage(buffer); + if (PageIsNew((PageHeader) page) || + ItemPointerGetOffsetNumber(iptr) > PageGetMaxOffsetNumber(page)) + { + UnlockAndReleaseBuffer(buffer); + return(false); + } + lp = PageGetItemId(page, ItemPointerGetOffsetNumber(iptr)); + if (!ItemIdIsUsed(lp) || ItemIdDeleted(lp)) + { + UnlockAndReleaseBuffer(buffer); + return(false); + } + + htup = (HeapTupleHeader) PageGetItem(page, lp); + + if (XLogIsAborted(PageGetSUI(page), htup->t_xmin)) + { + UnlockAndReleaseBuffer(buffer); + return(false); + } + + UnlockAndReleaseBuffer(buffer); + return(true); +} + +#endif |