]> granicus.if.org Git - postgresql/commitdiff
Various utils for WAL
authorVadim B. Mikheev <vadim4o@yahoo.com>
Fri, 13 Oct 2000 12:06:40 +0000 (12:06 +0000)
committerVadim B. Mikheev <vadim4o@yahoo.com>
Fri, 13 Oct 2000 12:06:40 +0000 (12:06 +0000)
src/backend/access/transam/xlogutils.c [new file with mode: 0644]

diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c
new file mode 100644 (file)
index 0000000..8f44fab
--- /dev/null
@@ -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