rem0rec.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:11k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /************************************************************************
  2. Record manager
  3. (c) 1994-1996 Innobase Oy
  4. Created 5/30/1994 Heikki Tuuri
  5. *************************************************************************/
  6. #ifndef rem0rec_h
  7. #define rem0rec_h
  8. #include "univ.i"
  9. #include "data0data.h"
  10. #include "rem0types.h"
  11. /* Maximum values for various fields (for non-blob tuples) */
  12. #define REC_MAX_N_FIELDS (1024 - 1)
  13. #define REC_MAX_HEAP_NO (2 * 8192 - 1)
  14. #define REC_MAX_N_OWNED (16 - 1)
  15. /* Flag denoting the predefined minimum record: this bit is ORed in the 4
  16. info bits of a record */
  17. #define REC_INFO_MIN_REC_FLAG 0x10
  18. /* Number of extra bytes in a record, in addition to the data and the
  19. offsets */
  20. #define REC_N_EXTRA_BYTES 6
  21. /**********************************************************
  22. The following function is used to get the offset of the
  23. next chained record on the same page. */
  24. UNIV_INLINE
  25. ulint 
  26. rec_get_next_offs(
  27. /*==============*/
  28. /* out: the page offset of the next 
  29. chained record */
  30. rec_t* rec); /* in: physical record */
  31. /**********************************************************
  32. The following function is used to set the next record offset field
  33. of the record. */
  34. UNIV_INLINE
  35. void
  36. rec_set_next_offs(
  37. /*==============*/
  38. rec_t* rec, /* in: physical record */
  39. ulint next); /* in: offset of the next record */
  40. /**********************************************************
  41. The following function is used to get the number of fields
  42. in the record. */
  43. UNIV_INLINE
  44. ulint
  45. rec_get_n_fields(
  46. /*=============*/
  47. /* out: number of data fields */
  48. rec_t* rec); /* in: physical record */
  49. /**********************************************************
  50. The following function is used to get the number of records
  51. owned by the previous directory record. */
  52. UNIV_INLINE
  53. ulint
  54. rec_get_n_owned(
  55. /*============*/
  56. /* out: number of owned records */
  57. rec_t* rec); /* in: physical record */
  58. /**********************************************************
  59. The following function is used to set the number of owned
  60. records. */
  61. UNIV_INLINE
  62. void
  63. rec_set_n_owned(
  64. /*============*/
  65. rec_t* rec, /* in: physical record */
  66. ulint n_owned); /* in: the number of owned */
  67. /**********************************************************
  68. The following function is used to retrieve the info bits of
  69. a record. */
  70. UNIV_INLINE
  71. ulint
  72. rec_get_info_bits(
  73. /*==============*/
  74. /* out: info bits */
  75. rec_t* rec); /* in: physical record */
  76. /**********************************************************
  77. The following function is used to set the info bits of a record. */
  78. UNIV_INLINE
  79. void
  80. rec_set_info_bits(
  81. /*==============*/
  82. rec_t* rec, /* in: physical record */
  83. ulint bits); /* in: info bits */
  84. /**********************************************************
  85. Gets the value of the deleted falg in info bits. */
  86. UNIV_INLINE
  87. ibool
  88. rec_info_bits_get_deleted_flag(
  89. /*===========================*/
  90. /* out: TRUE if deleted flag set */
  91. ulint info_bits); /* in: info bits from a record */
  92. /**********************************************************
  93. The following function tells if record is delete marked. */
  94. UNIV_INLINE
  95. ibool
  96. rec_get_deleted_flag(
  97. /*=================*/
  98. /* out: TRUE if delete marked */
  99. rec_t* rec); /* in: physical record */
  100. /**********************************************************
  101. The following function is used to set the deleted bit. */
  102. UNIV_INLINE
  103. void
  104. rec_set_deleted_flag(
  105. /*=================*/
  106. rec_t* rec, /* in: physical record */
  107. ibool flag); /* in: TRUE if delete marked */
  108. /**********************************************************
  109. The following function is used to get the order number
  110. of the record in the heap of the index page. */
  111. UNIV_INLINE
  112. ulint
  113. rec_get_heap_no(
  114. /*=============*/
  115. /* out: heap order number */
  116. rec_t* rec); /* in: physical record */
  117. /**********************************************************
  118. The following function is used to set the heap number
  119. field in the record. */
  120. UNIV_INLINE
  121. void
  122. rec_set_heap_no(
  123. /*=============*/
  124. rec_t* rec, /* in: physical record */
  125. ulint heap_no);/* in: the heap number */
  126. /**********************************************************
  127. The following function is used to test whether the data offsets
  128. in the record are stored in one-byte or two-byte format. */
  129. UNIV_INLINE
  130. ibool
  131. rec_get_1byte_offs_flag(
  132. /*====================*/
  133. /* out: TRUE if 1-byte form */
  134. rec_t* rec); /* in: physical record */
  135. /****************************************************************
  136. The following function is used to get a pointer to the nth
  137. data field in the record. */
  138. byte*
  139. rec_get_nth_field(
  140. /*==============*/
  141.   /* out: pointer to the field, NULL if SQL null */
  142.   rec_t* rec,  /* in: record */
  143.   ulint n, /* in: index of the field */
  144. ulint* len); /* out: length of the field; UNIV_SQL_NULL 
  145. if SQL null */
  146. /****************************************************************
  147. Gets the physical size of a field. Also an SQL null may have a field of
  148. size > 0, if the data type is of a fixed size. */
  149. UNIV_INLINE
  150. ulint
  151. rec_get_nth_field_size(
  152. /*===================*/
  153. /* out: field size in bytes */
  154.   rec_t* rec,  /* in: record */
  155.   ulint n); /* in: index of the field */
  156. /****************************************************************
  157. The following function is used to get a copy of the nth
  158. data field in the record to a buffer. */
  159. UNIV_INLINE
  160. void
  161. rec_copy_nth_field(
  162. /*===============*/
  163.   void* buf, /* in: pointer to the buffer */
  164.   rec_t* rec,  /* in: record */
  165.   ulint n, /* in: index of the field */
  166. ulint* len); /* out: length of the field; UNIV_SQL_NULL if SQL 
  167. null */
  168. /*************************************************************** 
  169. This is used to modify the value of an already existing field in 
  170. a physical record. The previous value must have exactly the same 
  171. size as the new value. If len is UNIV_SQL_NULL then the field is 
  172. treated as SQL null. */
  173. UNIV_INLINE
  174. void
  175. rec_set_nth_field(
  176. /*==============*/
  177. rec_t* rec,  /* in: record */
  178. ulint n, /* in: index of the field */
  179. void* data, /* in: pointer to the data if not SQL null */
  180. ulint len); /* in: length of the data or UNIV_SQL_NULL. 
  181. If not SQL null, must have the same length as the
  182. previous value. If SQL null, previous value must be
  183. SQL null. */
  184. /************************************************************** 
  185. The following function returns the data size of a physical
  186. record, that is the sum of field lengths. SQL null fields
  187. are counted as length 0 fields. The value returned by the function
  188. is the distance from record origin to record end in bytes. */
  189. UNIV_INLINE
  190. ulint
  191. rec_get_data_size(
  192. /*==============*/
  193. /* out: size */
  194. rec_t* rec); /* in: physical record */
  195. /************************************************************** 
  196. Returns the total size of record minus data size of record.
  197. The value returned by the function is the distance from record 
  198. start to record origin in bytes. */
  199. UNIV_INLINE
  200. ulint
  201. rec_get_extra_size(
  202. /*===============*/
  203. /* out: size */
  204. rec_t* rec); /* in: physical record */
  205. /************************************************************** 
  206. Returns the total size of a physical record.  */
  207. UNIV_INLINE
  208. ulint
  209. rec_get_size(
  210. /*=========*/
  211. /* out: size */
  212. rec_t* rec); /* in: physical record */
  213. /**************************************************************
  214. Returns a pointer to the start of the record. */
  215. UNIV_INLINE
  216. byte*
  217. rec_get_start(
  218. /*==========*/
  219. /* out: pointer to start */
  220. rec_t* rec); /* in: pointer to record */
  221. /**************************************************************
  222. Returns a pointer to the end of the record. */
  223. UNIV_INLINE
  224. byte*
  225. rec_get_end(
  226. /*========*/
  227. /* out: pointer to end */
  228. rec_t* rec); /* in: pointer to record */
  229. /*******************************************************************
  230. Copies a physical record to a buffer. */
  231. UNIV_INLINE
  232. rec_t*
  233. rec_copy(
  234. /*=====*/
  235. /* out: pointer to the origin of the copied record */
  236. void* buf, /* in: buffer */
  237. rec_t* rec); /* in: physical record */
  238. /******************************************************************
  239. Copies the first n fields of a physical record to a new physical record in
  240. a buffer. */
  241. rec_t*
  242. rec_copy_prefix_to_buf(
  243. /*===================*/
  244. /* out, own: copied record */
  245. rec_t* rec, /* in: physical record */
  246. ulint n_fields, /* in: number of fields to copy */
  247. byte** buf, /* in/out: memory buffer for the copied prefix,
  248. or NULL */
  249. ulint* buf_size); /* in/out: buffer size */
  250. /****************************************************************
  251. Folds a prefix of a physical record to a ulint. */
  252. UNIV_INLINE
  253. ulint
  254. rec_fold(
  255. /*=====*/
  256. /* out: the folded value */
  257. rec_t* rec, /* in: the physical record */
  258. ulint n_fields, /* in: number of complete fields to fold */
  259. ulint n_bytes, /* in: number of bytes to fold in an
  260. incomplete last field */
  261. dulint tree_id); /* in: index tree id */
  262. /*************************************************************
  263. Builds a physical record out of a data tuple and stores it beginning from
  264. address destination. */
  265. UNIV_INLINE
  266. rec_t* 
  267. rec_convert_dtuple_to_rec(
  268. /*======================*/
  269. /* out: pointer to the origin of physical
  270. record */
  271. byte* destination, /* in: start address of the physical record */
  272. dtuple_t* dtuple); /* in: data tuple */
  273. /*************************************************************
  274. Builds a physical record out of a data tuple and stores it beginning from
  275. address destination. */
  276. rec_t* 
  277. rec_convert_dtuple_to_rec_low(
  278. /*==========================*/
  279. /* out: pointer to the origin of physical
  280. record */
  281. byte* destination, /* in: start address of the physical record */
  282. dtuple_t* dtuple, /* in: data tuple */
  283. ulint data_size); /* in: data size of dtuple */
  284. /**************************************************************
  285. Returns the extra size of a physical record if we know its
  286. data size and number of fields. */
  287. UNIV_INLINE
  288. ulint
  289. rec_get_converted_extra_size(
  290. /*=========================*/
  291. /* out: extra size */
  292. ulint data_size, /* in: data size */
  293. ulint n_fields); /* in: number of fields */
  294. /**************************************************************
  295. The following function returns the size of a data tuple when converted to
  296. a physical record. */
  297. UNIV_INLINE
  298. ulint
  299. rec_get_converted_size(
  300. /*===================*/
  301. /* out: size */
  302. dtuple_t* dtuple);/* in: data tuple */
  303. /******************************************************************
  304. Copies the first n fields of a physical record to a data tuple.
  305. The fields are copied to the memory heap. */
  306. void
  307. rec_copy_prefix_to_dtuple(
  308. /*======================*/
  309. dtuple_t* tuple, /* in: data tuple */
  310. rec_t* rec, /* in: physical record */
  311. ulint n_fields, /* in: number of fields to copy */
  312. mem_heap_t* heap); /* in: memory heap */
  313. /*******************************************************************
  314. Validates the consistency of a physical record. */
  315. ibool
  316. rec_validate(
  317. /*=========*/
  318. /* out: TRUE if ok */
  319. rec_t* rec); /* in: physical record */
  320. /*******************************************************************
  321. Prints a physical record. */
  322. void
  323. rec_print(
  324. /*======*/
  325. rec_t* rec); /* in: physical record */
  326. /*******************************************************************
  327. Prints a physical record to a buffer. */
  328. ulint
  329. rec_sprintf(
  330. /*========*/
  331. /* out: printed length in bytes */
  332. char* buf, /* in: buffer to print to */
  333. ulint buf_len,/* in: buffer length */
  334. rec_t* rec); /* in: physical record */
  335. #define REC_INFO_BITS 6 /* This is single byte bit-field */
  336. #ifndef UNIV_NONINL
  337. #include "rem0rec.ic"
  338. #endif
  339. #endif