Various utils for WAL
authorVadim B. Mikheev
Fri, 13 Oct 2000 12:06:40 +0000 (12:06 +0000)
committerVadim B. Mikheev
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