| /*------------------------------------------------------------------------- |
| * |
| * itemptr.h |
| * POSTGRES disk item pointer definitions. |
| * |
| * |
| * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group |
| * Portions Copyright (c) 1994, Regents of the University of California |
| * |
| * $PostgreSQL: pgsql/src/include/storage/itemptr.h,v 1.32 2009/01/01 17:24:01 momjian Exp $ |
| * |
| *------------------------------------------------------------------------- |
| */ |
| #ifndef ITEMPTR_H |
| #define ITEMPTR_H |
| |
| #include "storage/block.h" |
| #include "storage/off.h" |
| |
| /* |
| * ItemPointer: |
| * |
| * This is a pointer to an item within a disk page of a known file |
| * (for example, a cross-link from an index to its parent table). |
| * blkid tells us which block, posid tells us which entry in the linp |
| * (ItemIdData) array we want. |
| * |
| * Note: because there is an item pointer in each tuple header and index |
| * tuple header on disk, it's very important not to waste space with |
| * structure padding bytes. The struct is designed to be six bytes long |
| * (it contains three int16 fields) but a few compilers will pad it to |
| * eight bytes unless coerced. We apply appropriate persuasion where |
| * possible, and to cope with unpersuadable compilers, we try to use |
| * "SizeOfIptrData" rather than "sizeof(ItemPointerData)" when computing |
| * on-disk sizes. |
| */ |
| typedef struct ItemPointerData |
| { |
| BlockIdData ip_blkid; |
| OffsetNumber ip_posid; |
| } |
| |
| #ifdef __arm__ |
| __attribute__((packed)) /* Appropriate whack upside the head for ARM */ |
| #endif |
| ItemPointerData; |
| |
| #define SizeOfIptrData \ |
| (offsetof(ItemPointerData, ip_posid) + sizeof(OffsetNumber)) |
| |
| typedef ItemPointerData *ItemPointer; |
| |
| /* ---------------- |
| * support macros |
| * ---------------- |
| */ |
| |
| /* |
| * ItemPointerIsValid |
| * True iff the disk item pointer is not NULL. |
| */ |
| #define ItemPointerIsValid(pointer) \ |
| ((bool) (PointerIsValid(pointer) && ((pointer)->ip_posid != 0))) |
| |
| /* |
| * ItemPointerGetBlockNumber |
| * Returns the block number of a disk item pointer. |
| */ |
| #define ItemPointerGetBlockNumber(pointer) \ |
| ( \ |
| AssertMacro(ItemPointerIsValid(pointer)), \ |
| BlockIdGetBlockNumber(&(pointer)->ip_blkid) \ |
| ) |
| |
| /* |
| * ItemPointerGetOffsetNumber |
| * Returns the offset number of a disk item pointer. |
| */ |
| #define ItemPointerGetOffsetNumber(pointer) \ |
| ( \ |
| AssertMacro(ItemPointerIsValid(pointer)), \ |
| (pointer)->ip_posid \ |
| ) |
| |
| /* |
| * ItemPointerSet |
| * Sets a disk item pointer to the specified block and offset. |
| */ |
| #define ItemPointerSet(pointer, blockNumber, offNum) \ |
| ( \ |
| AssertMacro(PointerIsValid(pointer)), \ |
| BlockIdSet(&((pointer)->ip_blkid), blockNumber), \ |
| (pointer)->ip_posid = offNum \ |
| ) |
| |
| /* |
| * ItemPointerSetBlockNumber |
| * Sets a disk item pointer to the specified block. |
| */ |
| #define ItemPointerSetBlockNumber(pointer, blockNumber) \ |
| ( \ |
| AssertMacro(PointerIsValid(pointer)), \ |
| BlockIdSet(&((pointer)->ip_blkid), blockNumber) \ |
| ) |
| |
| /* |
| * ItemPointerSetOffsetNumber |
| * Sets a disk item pointer to the specified offset. |
| */ |
| #define ItemPointerSetOffsetNumber(pointer, offsetNumber) \ |
| ( \ |
| AssertMacro(PointerIsValid(pointer)), \ |
| (pointer)->ip_posid = (offsetNumber) \ |
| ) |
| |
| /* |
| * ItemPointerCopy |
| * Copies the contents of one disk item pointer to another. |
| */ |
| #define ItemPointerCopy(fromPointer, toPointer) \ |
| ( \ |
| AssertMacro(PointerIsValid(toPointer)), \ |
| AssertMacro(PointerIsValid(fromPointer)), \ |
| *(toPointer) = *(fromPointer) \ |
| ) |
| |
| /* |
| * ItemPointerSetInvalid |
| * Sets a disk item pointer to be invalid. |
| */ |
| #define ItemPointerSetInvalid(pointer) \ |
| ( \ |
| AssertMacro(PointerIsValid(pointer)), \ |
| BlockIdSet(&((pointer)->ip_blkid), InvalidBlockNumber), \ |
| (pointer)->ip_posid = InvalidOffsetNumber \ |
| ) |
| |
| /* ---------------- |
| * externs |
| * ---------------- |
| */ |
| |
| extern bool ItemPointerEquals(ItemPointer pointer1, ItemPointer pointer2); |
| extern int32 ItemPointerCompare(ItemPointer arg1, ItemPointer arg2); |
| extern char *ItemPointerToString(ItemPointer tid); |
| extern char *ItemPointerToString2(ItemPointer tid); |
| |
| #endif /* ITEMPTR_H */ |