]> granicus.if.org Git - postgresql/blob - src/include/storage/itemptr.h
Centralize definition of integer limits.
[postgresql] / src / include / storage / itemptr.h
1 /*-------------------------------------------------------------------------
2  *
3  * itemptr.h
4  *        POSTGRES disk item pointer definitions.
5  *
6  *
7  * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  * src/include/storage/itemptr.h
11  *
12  *-------------------------------------------------------------------------
13  */
14 #ifndef ITEMPTR_H
15 #define ITEMPTR_H
16
17 #include "storage/block.h"
18 #include "storage/off.h"
19
20 /*
21  * ItemPointer:
22  *
23  * This is a pointer to an item within a disk page of a known file
24  * (for example, a cross-link from an index to its parent table).
25  * blkid tells us which block, posid tells us which entry in the linp
26  * (ItemIdData) array we want.
27  *
28  * Note: because there is an item pointer in each tuple header and index
29  * tuple header on disk, it's very important not to waste space with
30  * structure padding bytes.  The struct is designed to be six bytes long
31  * (it contains three int16 fields) but a few compilers will pad it to
32  * eight bytes unless coerced.  We apply appropriate persuasion where
33  * possible, and to cope with unpersuadable compilers, we try to use
34  * "SizeOfIptrData" rather than "sizeof(ItemPointerData)" when computing
35  * on-disk sizes.
36  */
37 typedef struct ItemPointerData
38 {
39         BlockIdData ip_blkid;
40         OffsetNumber ip_posid;
41 }
42
43 #ifdef __arm__
44 pg_attribute_packed                     /* Appropriate whack upside the head for ARM */
45 #endif
46 ItemPointerData;
47
48 #define SizeOfIptrData  \
49         (offsetof(ItemPointerData, ip_posid) + sizeof(OffsetNumber))
50
51 typedef ItemPointerData *ItemPointer;
52
53 /* ----------------
54  *              support macros
55  * ----------------
56  */
57
58 /*
59  * ItemPointerIsValid
60  *              True iff the disk item pointer is not NULL.
61  */
62 #define ItemPointerIsValid(pointer) \
63         ((bool) (PointerIsValid(pointer) && ((pointer)->ip_posid != 0)))
64
65 /*
66  * ItemPointerGetBlockNumber
67  *              Returns the block number of a disk item pointer.
68  */
69 #define ItemPointerGetBlockNumber(pointer) \
70 ( \
71         AssertMacro(ItemPointerIsValid(pointer)), \
72         BlockIdGetBlockNumber(&(pointer)->ip_blkid) \
73 )
74
75 /*
76  * ItemPointerGetOffsetNumber
77  *              Returns the offset number of a disk item pointer.
78  */
79 #define ItemPointerGetOffsetNumber(pointer) \
80 ( \
81         AssertMacro(ItemPointerIsValid(pointer)), \
82         (pointer)->ip_posid \
83 )
84
85 /*
86  * ItemPointerSet
87  *              Sets a disk item pointer to the specified block and offset.
88  */
89 #define ItemPointerSet(pointer, blockNumber, offNum) \
90 ( \
91         AssertMacro(PointerIsValid(pointer)), \
92         BlockIdSet(&((pointer)->ip_blkid), blockNumber), \
93         (pointer)->ip_posid = offNum \
94 )
95
96 /*
97  * ItemPointerSetBlockNumber
98  *              Sets a disk item pointer to the specified block.
99  */
100 #define ItemPointerSetBlockNumber(pointer, blockNumber) \
101 ( \
102         AssertMacro(PointerIsValid(pointer)), \
103         BlockIdSet(&((pointer)->ip_blkid), blockNumber) \
104 )
105
106 /*
107  * ItemPointerSetOffsetNumber
108  *              Sets a disk item pointer to the specified offset.
109  */
110 #define ItemPointerSetOffsetNumber(pointer, offsetNumber) \
111 ( \
112         AssertMacro(PointerIsValid(pointer)), \
113         (pointer)->ip_posid = (offsetNumber) \
114 )
115
116 /*
117  * ItemPointerCopy
118  *              Copies the contents of one disk item pointer to another.
119  *
120  * Should there ever be padding in an ItemPointer this would need to be handled
121  * differently as it's used as hash key.
122  */
123 #define ItemPointerCopy(fromPointer, toPointer) \
124 ( \
125         AssertMacro(PointerIsValid(toPointer)), \
126         AssertMacro(PointerIsValid(fromPointer)), \
127         *(toPointer) = *(fromPointer) \
128 )
129
130 /*
131  * ItemPointerSetInvalid
132  *              Sets a disk item pointer to be invalid.
133  */
134 #define ItemPointerSetInvalid(pointer) \
135 ( \
136         AssertMacro(PointerIsValid(pointer)), \
137         BlockIdSet(&((pointer)->ip_blkid), InvalidBlockNumber), \
138         (pointer)->ip_posid = InvalidOffsetNumber \
139 )
140
141 /* ----------------
142  *              externs
143  * ----------------
144  */
145
146 extern bool ItemPointerEquals(ItemPointer pointer1, ItemPointer pointer2);
147 extern int32 ItemPointerCompare(ItemPointer arg1, ItemPointer arg2);
148
149 #endif   /* ITEMPTR_H */