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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * heapam.h
  4.  *   POSTGRES heap access method definitions.
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: heapam.h,v 1.43.2.1 1999/07/30 18:26:58 scrappy Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef HEAPAM_H
  14. #define HEAPAM_H
  15. #include <time.h>
  16. #include "access/htup.h"
  17. #include "access/relscan.h"
  18. #include "access/tupmacs.h"
  19. #include "storage/block.h"
  20. #include "utils/rel.h"
  21. #include "utils/tqual.h"
  22. /* ----------------------------------------------------------------
  23.  * heap access method statistics
  24.  * ----------------------------------------------------------------
  25.  */
  26. typedef struct HeapAccessStatisticsData
  27. {
  28. time_t init_global_timestamp; /* time global statistics started */
  29. time_t local_reset_timestamp; /* last time local reset was done */
  30. time_t last_request_timestamp; /* last time stats were requested */
  31. int global_open;
  32. int global_openr;
  33. int global_close;
  34. int global_beginscan;
  35. int global_rescan;
  36. int global_endscan;
  37. int global_getnext;
  38. int global_fetch;
  39. int global_insert;
  40. int global_delete;
  41. int global_replace;
  42. int global_mark4update;
  43. int global_markpos;
  44. int global_restrpos;
  45. int global_BufferGetRelation;
  46. int global_RelationIdGetRelation;
  47. int global_RelationIdGetRelation_Buf;
  48. int global_RelationNameGetRelation;
  49. int global_getreldesc;
  50. int global_heapgettup;
  51. int global_RelationPutHeapTuple;
  52. int global_RelationPutLongHeapTuple;
  53. int local_open;
  54. int local_openr;
  55. int local_close;
  56. int local_beginscan;
  57. int local_rescan;
  58. int local_endscan;
  59. int local_getnext;
  60. int local_fetch;
  61. int local_insert;
  62. int local_delete;
  63. int local_replace;
  64. int local_mark4update;
  65. int local_markpos;
  66. int local_restrpos;
  67. int local_BufferGetRelation;
  68. int local_RelationIdGetRelation;
  69. int local_RelationIdGetRelation_Buf;
  70. int local_RelationNameGetRelation;
  71. int local_getreldesc;
  72. int local_heapgettup;
  73. int local_RelationPutHeapTuple;
  74. int local_RelationPutLongHeapTuple;
  75. } HeapAccessStatisticsData;
  76. typedef HeapAccessStatisticsData *HeapAccessStatistics;
  77. #define IncrHeapAccessStat(x) 
  78. (heap_access_stats == NULL ? 0 : (heap_access_stats->x)++)
  79. /* ----------------
  80.  * fastgetattr
  81.  *
  82.  * This gets called many times, so we macro the cacheable and NULL
  83.  * lookups, and call noncachegetattr() for the rest.
  84.  *
  85.  * ----------------
  86.  */
  87. extern Datum nocachegetattr(HeapTuple tup, int attnum,
  88.    TupleDesc att, bool *isnull);
  89. #if !defined(DISABLE_COMPLEX_MACRO)
  90. #define fastgetattr(tup, attnum, tupleDesc, isnull) 
  91. AssertMacro((attnum) > 0), 
  92. ((isnull) ? (*(isnull) = false) : (dummyret)NULL), 
  93. HeapTupleNoNulls(tup) ? 
  94. ((tupleDesc)->attrs[(attnum)-1]->attcacheoff != -1 || 
  95.  (attnum) == 1) ? 
  96. (Datum)fetchatt(&((tupleDesc)->attrs[(attnum)-1]), 
  97. (char *) (tup)->t_data + (tup)->t_data->t_hoff + 
  98. ((attnum) != 1) ? 
  99. (tupleDesc)->attrs[(attnum)-1]->attcacheoff 
  100. nocachegetattr((tup), (attnum), (tupleDesc), (isnull)) 
  101. att_isnull((attnum)-1, (tup)->t_data->t_bits) ? 
  102. ((isnull) ? (*(isnull) = true) : (dummyret)NULL), 
  103. (Datum)NULL 
  104. nocachegetattr((tup), (attnum), (tupleDesc), (isnull)) 
  105. )
  106. #else /* !defined(DISABLE_COMPLEX_MACRO) */
  107. static Datum
  108. fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,
  109. bool *isnull)
  110. {
  111. return (
  112. (attnum) > 0 ?
  113. (
  114.  ((isnull) ? (*(isnull) = false) : (dummyret) NULL),
  115.  HeapTupleNoNulls(tup) ?
  116.  (
  117.   ((tupleDesc)->attrs[(attnum) - 1]->attcacheoff != -1 ||
  118.    (attnum) == 1) ?
  119.   (
  120.    (Datum) fetchatt(&((tupleDesc)->attrs[(attnum) - 1]),
  121.  (char *) (tup)->t_data + (tup)->t_data->t_hoff +
  122. (
  123.  ((attnum) != 1) ?
  124. (tupleDesc)->attrs[(attnum) - 1]->attcacheoff
  125.  :
  126.  0
  127.  )
  128. )
  129.    )
  130.   :
  131.   nocachegetattr((tup), (attnum), (tupleDesc), (isnull))
  132.   )
  133.  :
  134.  (
  135.   att_isnull((attnum) - 1, (tup)->t_data->t_bits) ?
  136.   (
  137.    ((isnull) ? (*(isnull) = true) : (dummyret) NULL),
  138.    (Datum) NULL
  139.    )
  140.   :
  141.   (
  142.    nocachegetattr((tup), (attnum), (tupleDesc), (isnull))
  143.    )
  144.   )
  145.  )
  146. :
  147. (
  148.  (Datum) NULL
  149.  )
  150. );
  151. }
  152. #endif
  153. /* ----------------
  154.  * heap_getattr
  155.  *
  156.  * Find a particular field in a row represented as a heap tuple.
  157.  * We return a pointer into that heap tuple, which points to the
  158.  * first byte of the value of the field in question.
  159.  *
  160.  * If the field in question has a NULL value, we return a null
  161.  * pointer and return <*isnull> == true.  Otherwise, we return
  162.  * <*isnull> == false.
  163.  *
  164.  * <tup> is the pointer to the heap tuple.  <attnum> is the attribute
  165.  * number of the column (field) caller wants. <tupleDesc> is a
  166.  * pointer to the structure describing the row and all its fields.
  167.  *
  168.  * Because this macro is often called with constants, it generates
  169.  * compiler warnings about 'left-hand comma expression has no effect.
  170.  *
  171.  * ----------------
  172.  */
  173. #define heap_getattr(tup, attnum, tupleDesc, isnull) 
  174. AssertMacro((tup) != NULL && 
  175. (attnum) > FirstLowInvalidHeapAttributeNumber && 
  176. (attnum) != 0), 
  177. ((attnum) > (int) (tup)->t_data->t_natts) ? 
  178. ((isnull) ? (*(isnull) = true) : (dummyret)NULL), 
  179. (Datum)NULL 
  180. ((attnum) > 0) ? 
  181. fastgetattr((tup), (attnum), (tupleDesc), (isnull)) 
  182. ((isnull) ? (*(isnull) = false) : (dummyret)NULL), 
  183. ((attnum) == SelfItemPointerAttributeNumber) ? 
  184. (Datum)((char *)&((tup)->t_self)) 
  185. (Datum)*(unsigned int *) 
  186. ((char *)(tup)->t_data + heap_sysoffset[-(attnum)-1]) 
  187. )
  188. extern HeapAccessStatistics heap_access_stats; /* in stats.c */
  189. /* ----------------
  190.  * function prototypes for heap access method
  191.  * ----------------
  192.  */
  193. /* heap_create, heap_creatr, and heap_destroy are declared in catalog/heap.h */
  194. /* heapam.c */
  195. extern Relation heap_open(Oid relationId);
  196. extern Relation heap_openr(char *relationName);
  197. extern void heap_close(Relation relation);
  198. extern HeapScanDesc heap_beginscan(Relation relation, int atend,
  199.    Snapshot snapshot, unsigned nkeys, ScanKey key);
  200. extern void heap_rescan(HeapScanDesc scan, bool scanFromEnd, ScanKey key);
  201. extern void heap_endscan(HeapScanDesc scan);
  202. extern HeapTuple heap_getnext(HeapScanDesc scandesc, int backw);
  203. extern void heap_fetch(Relation relation, Snapshot snapshot, HeapTuple tup, Buffer *userbuf);
  204. extern Oid heap_insert(Relation relation, HeapTuple tup);
  205. extern int heap_delete(Relation relation, ItemPointer tid, ItemPointer ctid);
  206. extern int heap_replace(Relation relation, ItemPointer otid, HeapTuple tup,
  207.  ItemPointer ctid);
  208. extern int heap_mark4update(Relation relation, HeapTuple tup, Buffer *userbuf);
  209. extern void heap_markpos(HeapScanDesc scan);
  210. extern void heap_restrpos(HeapScanDesc scan);
  211. /* in common/heaptuple.c */
  212. extern Size ComputeDataSize(TupleDesc tupleDesc, Datum *value, char *nulls);
  213. extern void DataFill(char *data, TupleDesc tupleDesc,
  214.  Datum *value, char *nulls, uint16 *infomask,
  215.  bits8 *bit);
  216. extern int heap_attisnull(HeapTuple tup, int attnum);
  217. extern int heap_sysattrlen(AttrNumber attno);
  218. extern bool heap_sysattrbyval(AttrNumber attno);
  219. extern Datum nocachegetattr(HeapTuple tup, int attnum,
  220.    TupleDesc att, bool *isnull);
  221. extern HeapTuple heap_copytuple(HeapTuple tuple);
  222. extern void heap_copytuple_with_tuple(HeapTuple src, HeapTuple dest);
  223. extern HeapTuple heap_formtuple(TupleDesc tupleDescriptor,
  224.    Datum *value, char *nulls);
  225. extern HeapTuple heap_modifytuple(HeapTuple tuple,
  226. Relation relation, Datum *replValue, char *replNull, char *repl);
  227. HeapTuple heap_addheader(uint32 natts, int structlen, char *structure);
  228. /* in common/heap/stats.c */
  229. extern void PrintHeapAccessStatistics(HeapAccessStatistics stats);
  230. extern void initam(void);
  231. #endif  /* HEAPAM_H */