block.h
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:3k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * block.h
  4.  *   POSTGRES disk block definitions.
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: block.h,v 1.9 1999/05/25 16:14:36 momjian Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef BLOCK_H
  14. #define BLOCK_H
  15. /*
  16.  * BlockNumber:
  17.  *
  18.  * each data file (heap or index) is divided into postgres disk blocks
  19.  * (which may be thought of as the unit of i/o -- a postgres buffer
  20.  * contains exactly one disk block).  the blocks are numbered
  21.  * sequentially, 0 to 0xFFFFFFFE.
  22.  *
  23.  * InvalidBlockNumber is the same thing as P_NEW in buf.h.
  24.  *
  25.  * the access methods, the buffer manager and the storage manager are
  26.  * more or less the only pieces of code that should be accessing disk
  27.  * blocks directly.
  28.  */
  29. typedef uint32 BlockNumber;
  30. #define InvalidBlockNumber ((BlockNumber) 0xFFFFFFFF)
  31. /*
  32.  * BlockId:
  33.  *
  34.  * this is a storage type for BlockNumber. in other words, this type
  35.  * is used for on-disk structures (e.g., in HeapTupleData) whereas
  36.  * BlockNumber is the type on which calculations are performed (e.g.,
  37.  * in access method code).
  38.  *
  39.  * there doesn't appear to be any reason to have separate types except
  40.  * for the fact that BlockIds can be SHORTALIGN'd (and therefore any
  41.  * structures that contains them, such as ItemPointerData, can also be
  42.  * SHORTALIGN'd).  this is an important consideration for reducing the
  43.  * space requirements of the line pointer (ItemIdData) array on each
  44.  * page and the header of each heap or index tuple, so it doesn't seem
  45.  * wise to change this without good reason.
  46.  */
  47. typedef struct BlockIdData
  48. {
  49. uint16 bi_hi;
  50. uint16 bi_lo;
  51. } BlockIdData;
  52. typedef BlockIdData *BlockId; /* block identifier */
  53. /* ----------------
  54.  * support macros
  55.  * ----------------
  56.  */
  57. /*
  58.  * BlockNumberIsValid
  59.  * True iff blockNumber is valid.
  60.  */
  61. #define BlockNumberIsValid(blockNumber) 
  62. ((bool) ((int32) (blockNumber) != InvalidBlockNumber))
  63. /*
  64.  * BlockIdIsValid
  65.  * True iff the block identifier is valid.
  66.  */
  67. #define BlockIdIsValid(blockId) 
  68. ((bool) PointerIsValid(blockId))
  69. /*
  70.  * BlockIdSet
  71.  * Sets a block identifier to the specified value.
  72.  */
  73. #define BlockIdSet(blockId, blockNumber) 
  74. AssertMacro(PointerIsValid(blockId)), 
  75. (blockId)->bi_hi = (blockNumber) >> 16, 
  76. (blockId)->bi_lo = (blockNumber) & 0xffff 
  77. )
  78. /*
  79.  * BlockIdCopy
  80.  * Copy a block identifier.
  81.  */
  82. #define BlockIdCopy(toBlockId, fromBlockId) 
  83. AssertMacro(PointerIsValid(toBlockId)), 
  84. AssertMacro(PointerIsValid(fromBlockId)), 
  85. (toBlockId)->bi_hi = (fromBlockId)->bi_hi, 
  86. (toBlockId)->bi_lo = (fromBlockId)->bi_lo 
  87. )
  88. /*
  89.  * BlockIdEquals
  90.  * Check for block number equality.
  91.  */
  92. #define BlockIdEquals(blockId1, blockId2) 
  93. ((blockId1)->bi_hi == (blockId2)->bi_hi && 
  94.  (blockId1)->bi_lo == (blockId2)->bi_lo)
  95. /*
  96.  * BlockIdGetBlockNumber
  97.  * Retrieve the block number from a block identifier.
  98.  */
  99. #define BlockIdGetBlockNumber(blockId) 
  100. AssertMacro(BlockIdIsValid(blockId)), 
  101. (BlockNumber) (((blockId)->bi_hi << 16) | ((uint16) (blockId)->bi_lo)) 
  102. )
  103. #endif  /* BLOCK_H */