Skip to content

Commit b33428d

Browse files
committed
Various utils for WAL
1 parent deee783 commit b33428d

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/*-------------------------------------------------------------------------
2+
*
3+
* xlog.c
4+
*
5+
*
6+
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
7+
* Portions Copyright (c) 1994, Regents of the University of California
8+
*
9+
*-------------------------------------------------------------------------
10+
*/
11+
12+
#include "postgres.h"
13+
14+
#include "access/xlog.h"
15+
#include "access/xact.h"
16+
17+
#ifdef XLOG
18+
19+
/*
20+
* Check if specified heap tuple was inserted by given
21+
* xaction/command and return
22+
*
23+
* - -1 if not
24+
* - 0 if there is no tuple at all
25+
* - 1 if yes
26+
*/
27+
int
28+
XLogIsOwnerOfTuple(RelFileNode hnode, ItemPointer iptr,
29+
TransactionId xid, CommandId cid)
30+
{
31+
Relation reln;
32+
Buffer buffer;
33+
Page page;
34+
ItemId lp;
35+
HeapTupleHeader htup;
36+
37+
reln = XLogOpenRelation(false, RM_HEAP_ID, hnode);
38+
if (!RelationIsValid(reln))
39+
return(0);
40+
41+
buffer = ReadBuffer(reln, ItemPointerGetBlockNumber(iptr));
42+
if (!BufferIsValid(buffer))
43+
return(0);
44+
45+
LockBuffer(buffer, BUFFER_LOCK_SHARE);
46+
page = (Page) BufferGetPage(buffer);
47+
if (PageIsNew((PageHeader) page) ||
48+
ItemPointerGetOffsetNumber(iptr) > PageGetMaxOffsetNumber(page))
49+
{
50+
UnlockAndReleaseBuffer(buffer);
51+
return(0);
52+
}
53+
lp = PageGetItemId(page, ItemPointerGetOffsetNumber(iptr));
54+
if (!ItemIdIsUsed(lp) || ItemIdDeleted(lp))
55+
{
56+
UnlockAndReleaseBuffer(buffer);
57+
return(0);
58+
}
59+
60+
htup = (HeapTupleHeader) PageGetItem(page, lp);
61+
62+
if (PageGetSUI(page) != ThisStartUpID || htup->t_xmin != xid || htup->t_cmin != cid)
63+
{
64+
UnlockAndReleaseBuffer(buffer);
65+
return(-1);
66+
}
67+
68+
UnlockAndReleaseBuffer(buffer);
69+
return(1);
70+
}
71+
72+
/*
73+
* Check if exists valid (inserted by not aborted xaction) heap tuple
74+
* for given item pointer
75+
*/
76+
bool
77+
XLogIsValidTuple(RelFileNode hnode, ItemPointer iptr)
78+
{
79+
Relation reln;
80+
Buffer buffer;
81+
Page page;
82+
ItemId lp;
83+
HeapTupleHeader htup;
84+
85+
reln = XLogOpenRelation(false, RM_HEAP_ID, hnode);
86+
if (!RelationIsValid(reln))
87+
return(false);
88+
89+
buffer = ReadBuffer(reln, ItemPointerGetBlockNumber(iptr));
90+
if (!BufferIsValid(buffer))
91+
return(false);
92+
93+
LockBuffer(buffer, BUFFER_LOCK_SHARE);
94+
page = (Page) BufferGetPage(buffer);
95+
if (PageIsNew((PageHeader) page) ||
96+
ItemPointerGetOffsetNumber(iptr) > PageGetMaxOffsetNumber(page))
97+
{
98+
UnlockAndReleaseBuffer(buffer);
99+
return(false);
100+
}
101+
lp = PageGetItemId(page, ItemPointerGetOffsetNumber(iptr));
102+
if (!ItemIdIsUsed(lp) || ItemIdDeleted(lp))
103+
{
104+
UnlockAndReleaseBuffer(buffer);
105+
return(false);
106+
}
107+
108+
htup = (HeapTupleHeader) PageGetItem(page, lp);
109+
110+
if (XLogIsAborted(PageGetSUI(page), htup->t_xmin))
111+
{
112+
UnlockAndReleaseBuffer(buffer);
113+
return(false);
114+
}
115+
116+
UnlockAndReleaseBuffer(buffer);
117+
return(true);
118+
}
119+
120+
#endif

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy