codekingpro/portable-devtools
115k
1/*-------------------------------------------------------------------------2 *3 * block.h4 * POSTGRES disk block definitions.5 *6 *7 * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group8 * Portions Copyright (c) 1994, Regents of the University of California9 *10 * src/include/storage/block.h11 *12 *-------------------------------------------------------------------------13 */14#ifndef BLOCK_H15#define BLOCK_H16 17/*18 * BlockNumber:19 *20 * each data file (heap or index) is divided into postgres disk blocks21 * (which may be thought of as the unit of i/o -- a postgres buffer22 * contains exactly one disk block). the blocks are numbered23 * sequentially, 0 to 0xFFFFFFFE.24 *25 * InvalidBlockNumber is the same thing as P_NEW in bufmgr.h.26 *27 * the access methods, the buffer manager and the storage manager are28 * more or less the only pieces of code that should be accessing disk29 * blocks directly.30 */31typedef uint32 BlockNumber;32 33#define InvalidBlockNumber ((BlockNumber) 0xFFFFFFFF)34 35#define MaxBlockNumber ((BlockNumber) 0xFFFFFFFE)36 37/*38 * BlockId:39 *40 * this is a storage type for BlockNumber. in other words, this type41 * is used for on-disk structures (e.g., in HeapTupleData) whereas42 * BlockNumber is the type on which calculations are performed (e.g.,43 * in access method code).44 *45 * there doesn't appear to be any reason to have separate types except46 * for the fact that BlockIds can be SHORTALIGN'd (and therefore any47 * structures that contains them, such as ItemPointerData, can also be48 * SHORTALIGN'd). this is an important consideration for reducing the49 * space requirements of the line pointer (ItemIdData) array on each50 * page and the header of each heap or index tuple, so it doesn't seem51 * wise to change this without good reason.52 */53typedef struct BlockIdData54{55 uint16 bi_hi;56 uint16 bi_lo;57} BlockIdData;58 59typedef BlockIdData *BlockId; /* block identifier */60 61/* ----------------62 * support functions63 * ----------------64 */65 66/*67 * BlockNumberIsValid68 * True iff blockNumber is valid.69 */70static inline bool71BlockNumberIsValid(BlockNumber blockNumber)72{73 return blockNumber != InvalidBlockNumber;74}75 76/*77 * BlockIdSet78 * Sets a block identifier to the specified value.79 */80static inline void81BlockIdSet(BlockIdData *blockId, BlockNumber blockNumber)82{83 blockId->bi_hi = blockNumber >> 16;84 blockId->bi_lo = blockNumber & 0xffff;85}86 87/*88 * BlockIdEquals89 * Check for block number equality.90 */91static inline bool92BlockIdEquals(const BlockIdData *blockId1, const BlockIdData *blockId2)93{94 return (blockId1->bi_hi == blockId2->bi_hi &&95 blockId1->bi_lo == blockId2->bi_lo);96}97 98/*99 * BlockIdGetBlockNumber100 * Retrieve the block number from a block identifier.101 */102static inline BlockNumber103BlockIdGetBlockNumber(const BlockIdData *blockId)104{105 return (((BlockNumber) blockId->bi_hi) << 16) | ((BlockNumber) blockId->bi_lo);106}107 108#endif /* BLOCK_H */109 