Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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)