data0data.ic
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:10k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /************************************************************************
  2. SQL data field and tuple
  3. (c) 1994-1996 Innobase Oy
  4. Created 5/30/1994 Heikki Tuuri
  5. *************************************************************************/
  6. #include "mem0mem.h"
  7. #include "ut0rnd.h"
  8. extern byte data_error;
  9. /*************************************************************************
  10. Gets pointer to the type struct of SQL data field. */
  11. UNIV_INLINE
  12. dtype_t*
  13. dfield_get_type(
  14. /*============*/
  15. /* out: pointer to the type struct */
  16. dfield_t* field) /* in: SQL data field */
  17. {
  18. ut_ad(field);
  19. return(&(field->type));
  20. }
  21. /*************************************************************************
  22. Sets the type struct of SQL data field. */
  23. UNIV_INLINE
  24. void
  25. dfield_set_type(
  26. /*============*/
  27. dfield_t* field, /* in: SQL data field */
  28. dtype_t* type) /* in: pointer to data type struct */
  29. {
  30. ut_ad(field && type);
  31. field->type = *type;
  32. }
  33. /*************************************************************************
  34. Gets pointer to the data in a field. */
  35. UNIV_INLINE
  36. void* 
  37. dfield_get_data(
  38. /*============*/
  39. /* out: pointer to data */
  40. dfield_t* field) /* in: field */
  41. {
  42. ut_ad(field);
  43. ut_ad((field->len == UNIV_SQL_NULL)
  44.       || (field->data != &data_error)); 
  45. return(field->data);
  46. }
  47. /*************************************************************************
  48. Gets length of field data. */
  49. UNIV_INLINE
  50. ulint
  51. dfield_get_len(
  52. /*===========*/
  53. /* out: length of data; UNIV_SQL_NULL if 
  54. SQL null data */
  55. dfield_t* field) /* in: field */
  56. {
  57. ut_ad(field);
  58. ut_ad((field->len == UNIV_SQL_NULL)
  59.       || (field->data != &data_error));
  60. return(field->len);
  61. }
  62. /*************************************************************************
  63. Sets length in a field. */
  64. UNIV_INLINE
  65. void 
  66. dfield_set_len(
  67. /*===========*/
  68. dfield_t*  field, /* in: field */
  69. ulint len) /* in: length or UNIV_SQL_NULL */
  70. {
  71. ut_ad(field);
  72. field->len = len;
  73. }
  74. /*************************************************************************
  75. Sets pointer to the data and length in a field. */
  76. UNIV_INLINE
  77. void 
  78. dfield_set_data(
  79. /*============*/
  80. dfield_t*  field, /* in: field */
  81. const void* data, /* in: data */
  82. ulint len) /* in: length or UNIV_SQL_NULL */
  83. {
  84. ut_ad(field);
  85. field->data = (void*) data;
  86. field->len = len;
  87. }
  88. /*************************************************************************
  89. Copies the data and len fields. */
  90. UNIV_INLINE
  91. void 
  92. dfield_copy_data(
  93. /*=============*/
  94. dfield_t*  field1, /* in: field to copy to */
  95. dfield_t* field2) /* in: field to copy from */
  96. {
  97. ut_ad(field1 && field2);
  98. field1->data = field2->data;
  99. field1->len = field2->len;
  100. }
  101. /*************************************************************************
  102. Copies a data field to another. */
  103. UNIV_INLINE
  104. void
  105. dfield_copy(
  106. /*========*/
  107. dfield_t* field1, /* in: field to copy to */
  108. dfield_t* field2) /* in: field to copy from */
  109. {
  110. *field1 = *field2;
  111. }
  112. /*************************************************************************
  113. Tests if data length and content is equal for two dfields. */
  114. UNIV_INLINE
  115. ibool
  116. dfield_datas_are_binary_equal(
  117. /*==========================*/
  118. /* out: TRUE if equal */
  119. dfield_t* field1, /* in: field */
  120. dfield_t* field2) /* in: field */
  121. {
  122. ulint len;
  123. len = field1->len;
  124. if ((len != field2->len)
  125.     || ((len != UNIV_SQL_NULL)
  126.         && (0 != ut_memcmp(field1->data, field2->data, len)))) {
  127.     
  128. return(FALSE);
  129. }
  130. return(TRUE);
  131. }
  132. /*************************************************************************
  133. Gets info bits in a data tuple. */
  134. UNIV_INLINE
  135. ulint
  136. dtuple_get_info_bits(
  137. /*=================*/
  138. /* out: info bits */
  139. dtuple_t*  tuple) /* in: tuple */
  140. {
  141. ut_ad(tuple);
  142. return(tuple->info_bits);
  143. }
  144. /*************************************************************************
  145. Sets info bits in a data tuple. */
  146. UNIV_INLINE
  147. void
  148. dtuple_set_info_bits(
  149. /*=================*/
  150. dtuple_t*  tuple, /* in: tuple */
  151. ulint info_bits) /* in: info bits */
  152. {
  153. ut_ad(tuple);
  154. tuple->info_bits = info_bits;
  155. }
  156. /*************************************************************************
  157. Gets number of fields used in record comparisons. */
  158. UNIV_INLINE
  159. ulint
  160. dtuple_get_n_fields_cmp(
  161. /*====================*/
  162. /* out: number of fields used in comparisons
  163. in rem0cmp.* */
  164. dtuple_t* tuple) /* in: tuple */
  165. {
  166. ut_ad(tuple);
  167. return(tuple->n_fields_cmp);
  168. }
  169. /*************************************************************************
  170. Sets number of fields used in record comparisons. */
  171. UNIV_INLINE
  172. void
  173. dtuple_set_n_fields_cmp(
  174. /*====================*/
  175. dtuple_t* tuple, /* in: tuple */
  176. ulint n_fields_cmp) /* in: number of fields used in
  177. comparisons in rem0cmp.* */
  178. {
  179. ut_ad(tuple);
  180. ut_ad(n_fields_cmp <= tuple->n_fields);
  181. tuple->n_fields_cmp = n_fields_cmp;
  182. }
  183. /*************************************************************************
  184. Gets number of fields in a data tuple. */
  185. UNIV_INLINE
  186. ulint
  187. dtuple_get_n_fields(
  188. /*================*/
  189. /* out: number of fields */
  190. dtuple_t*  tuple) /* in: tuple */
  191. {
  192. ut_ad(tuple);
  193. return(tuple->n_fields);
  194. }
  195. /*************************************************************************
  196. Gets nth field of a tuple. */
  197. UNIV_INLINE
  198. dfield_t* 
  199. dtuple_get_nth_field(
  200. /*=================*/
  201. /* out: nth field */
  202. dtuple_t*  tuple, /* in: tuple */
  203. ulint n) /* in: index of field */
  204. {
  205. ut_ad(tuple);
  206. ut_ad(n < tuple->n_fields);
  207. return(tuple->fields + n);
  208. }
  209. /**************************************************************
  210. Creates a data tuple to a memory heap. The default value for number
  211. of fields used in record comparisons for this tuple is n_fields. */
  212. UNIV_INLINE
  213. dtuple_t*
  214. dtuple_create(
  215. /*==========*/
  216.     /* out, own: created tuple */
  217. mem_heap_t* heap, /* in: memory heap where the tuple
  218. is created */
  219. ulint n_fields) /* in: number of fields */
  220. {
  221. dtuple_t* tuple;
  222. ut_ad(heap);
  223. tuple = (dtuple_t*) mem_heap_alloc(heap, sizeof(dtuple_t)
  224.      + n_fields * sizeof(dfield_t));
  225. tuple->info_bits = 0;
  226. tuple->n_fields = n_fields;
  227. tuple->n_fields_cmp = n_fields;
  228. tuple->fields = (dfield_t*)(((byte*)tuple) + sizeof(dtuple_t));
  229. #ifdef UNIV_DEBUG
  230. tuple->magic_n = DATA_TUPLE_MAGIC_N;
  231. { /* In the debug version, initialize fields to an error value */
  232. ulint i;
  233. for (i = 0; i < n_fields; i++) {
  234. (tuple->fields + i)->data = &data_error;
  235. dfield_get_type(tuple->fields + i)->mtype = DATA_ERROR;
  236. }
  237. }
  238. #endif
  239. return(tuple);
  240. }
  241. /**************************************************************
  242. The following function returns the sum of data lengths of a tuple. The space
  243. occupied by the field structs or the tuple struct is not counted. Neither
  244. is possible space in externally stored parts of the field. */
  245. UNIV_INLINE
  246. ulint
  247. dtuple_get_data_size(
  248. /*=================*/
  249. /* out: sum of data lengths */
  250. dtuple_t* tuple) /* in: typed data tuple */
  251. {
  252. dfield_t* field;
  253. ulint   n_fields;
  254. ulint   len;
  255. ulint   i;
  256. ulint   sum = 0;
  257. ut_ad(tuple);
  258. ut_ad(dtuple_check_typed(tuple));
  259. ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N);
  260. n_fields = tuple->n_fields;
  261. for (i = 0; i < n_fields; i++) {
  262. field = dtuple_get_nth_field(tuple,  i);
  263. len = dfield_get_len(field);
  264. if (len == UNIV_SQL_NULL) {
  265. len = dtype_get_sql_null_size(dfield_get_type(field));
  266. }
  267. sum += len;
  268. }
  269. return(sum);
  270. }
  271. /***********************************************************************
  272. Sets types of fields binary in a tuple. */
  273. UNIV_INLINE
  274. void
  275. dtuple_set_types_binary(
  276. /*====================*/
  277. dtuple_t* tuple, /* in: data tuple */
  278. ulint n) /* in: number of fields to set */
  279. {
  280. dtype_t* dfield_type;
  281. ulint i;
  282. for (i = 0; i < n; i++) {
  283. dfield_type = dfield_get_type(dtuple_get_nth_field(tuple, i));
  284. dtype_set(dfield_type, DATA_BINARY, 0, 0, 0);
  285. }
  286. }
  287. /****************************************************************
  288. Folds a prefix given as the number of fields of a tuple. */
  289. UNIV_INLINE
  290. ulint
  291. dtuple_fold(
  292. /*========*/
  293. /* out: the folded value */
  294. dtuple_t* tuple, /* in: the tuple */
  295. ulint n_fields,/* in: number of complete fields to fold */
  296. ulint n_bytes,/* in: number of bytes to fold in an
  297. incomplete last field */
  298. dulint tree_id)/* in: index tree id */
  299. {
  300. dfield_t* field;
  301. ulint i;
  302. byte* data;
  303. ulint len;
  304. ulint fold;
  305. ut_ad(tuple);
  306. ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N);
  307. ut_ad(dtuple_check_typed(tuple));
  308. fold = ut_fold_dulint(tree_id);
  309. for (i = 0; i < n_fields; i++) {
  310. field = dtuple_get_nth_field(tuple, i);
  311. data = (byte*) dfield_get_data(field);
  312. len = dfield_get_len(field);
  313. if (len != UNIV_SQL_NULL) {
  314. fold = ut_fold_ulint_pair(fold, 
  315.   ut_fold_binary(data, len));
  316. }
  317. }
  318. if (n_bytes > 0) {
  319. field = dtuple_get_nth_field(tuple, i);
  320. data = (byte*) dfield_get_data(field);
  321. len = dfield_get_len(field);
  322. if (len != UNIV_SQL_NULL) {
  323. if (len > n_bytes) {
  324. len = n_bytes;
  325. }
  326. fold = ut_fold_ulint_pair(fold, 
  327.   ut_fold_binary(data, len));
  328. }
  329. }
  330. return(fold);
  331. }
  332. /**************************************************************************
  333. Writes an SQL null field full of zeros. */
  334. UNIV_INLINE
  335. void
  336. data_write_sql_null(
  337. /*================*/
  338. byte* data, /* in: pointer to a buffer of size len */
  339. ulint len) /* in: SQL null size in bytes */
  340. {
  341. ulint j;
  342. for (j = 0; j < len; j++) {
  343. data[j] = '';
  344. }
  345. }
  346. /**************************************************************************
  347. Checks if a dtuple contains an SQL null value. */
  348. UNIV_INLINE
  349. ibool
  350. dtuple_contains_null(
  351. /*=================*/
  352. /* out: TRUE if some field is SQL null */
  353. dtuple_t* tuple) /* in: dtuple */
  354. {
  355. ulint n;
  356. ulint i;
  357. n = dtuple_get_n_fields(tuple);
  358. for (i = 0; i < n; i++) {
  359. if (dfield_get_len(dtuple_get_nth_field(tuple, i))
  360.     == UNIV_SQL_NULL) {
  361. return(TRUE);
  362. }
  363. }
  364. return(FALSE);
  365. }