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

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. void* data, /* in: data */
  82. ulint len) /* in: length or UNIV_SQL_NULL */
  83. {
  84. ut_ad(field);
  85. field->data = 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_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. Tests if dfield data length and content is equal to the given. */
  134. UNIV_INLINE
  135. ibool
  136. dfield_data_is_equal(
  137. /*=================*/
  138. /* out: TRUE if equal */
  139. dfield_t* field, /* in: field */
  140. ulint len, /* in: data length or UNIV_SQL_NULL */
  141. byte* data) /* in: data */
  142. {
  143. if (len != field->len) {
  144. return(FALSE);
  145. }
  146. if ((len != UNIV_SQL_NULL)
  147.     && (0 != ut_memcmp(field->data, data, len))) {
  148.     
  149. return(FALSE);
  150. }
  151. return(TRUE);
  152. }
  153. /*************************************************************************
  154. Gets info bits in a data tuple. */
  155. UNIV_INLINE
  156. ulint
  157. dtuple_get_info_bits(
  158. /*=================*/
  159. /* out: info bits */
  160. dtuple_t*  tuple) /* in: tuple */
  161. {
  162. ut_ad(tuple);
  163. return(tuple->info_bits);
  164. }
  165. /*************************************************************************
  166. Sets info bits in a data tuple. */
  167. UNIV_INLINE
  168. void
  169. dtuple_set_info_bits(
  170. /*=================*/
  171. dtuple_t*  tuple, /* in: tuple */
  172. ulint info_bits) /* in: info bits */
  173. {
  174. ut_ad(tuple);
  175. tuple->info_bits = info_bits;
  176. }
  177. /*************************************************************************
  178. Gets number of fields used in record comparisons. */
  179. UNIV_INLINE
  180. ulint
  181. dtuple_get_n_fields_cmp(
  182. /*====================*/
  183. /* out: number of fields used in comparisons
  184. in rem0cmp.* */
  185. dtuple_t* tuple) /* in: tuple */
  186. {
  187. ut_ad(tuple);
  188. return(tuple->n_fields_cmp);
  189. }
  190. /*************************************************************************
  191. Sets number of fields used in record comparisons. */
  192. UNIV_INLINE
  193. void
  194. dtuple_set_n_fields_cmp(
  195. /*====================*/
  196. dtuple_t* tuple, /* in: tuple */
  197. ulint n_fields_cmp) /* in: number of fields used in
  198. comparisons in rem0cmp.* */
  199. {
  200. ut_ad(tuple);
  201. ut_ad(n_fields_cmp <= tuple->n_fields);
  202. tuple->n_fields_cmp = n_fields_cmp;
  203. }
  204. /*************************************************************************
  205. Gets number of fields in a data tuple. */
  206. UNIV_INLINE
  207. ulint
  208. dtuple_get_n_fields(
  209. /*================*/
  210. /* out: number of fields */
  211. dtuple_t*  tuple) /* in: tuple */
  212. {
  213. ut_ad(tuple);
  214. return(tuple->n_fields);
  215. }
  216. /*************************************************************************
  217. Gets nth field of a tuple. */
  218. UNIV_INLINE
  219. dfield_t* 
  220. dtuple_get_nth_field(
  221. /*=================*/
  222. /* out: nth field */
  223. dtuple_t*  tuple, /* in: tuple */
  224. ulint n) /* in: index of field */
  225. {
  226. ut_ad(tuple);
  227. ut_ad(n < tuple->n_fields);
  228. return(tuple->fields + n);
  229. }
  230. /**************************************************************
  231. Creates a data tuple to a memory heap. The default value for number
  232. of fields used in record comparisons for this tuple is n_fields. */
  233. UNIV_INLINE
  234. dtuple_t*
  235. dtuple_create(
  236. /*==========*/
  237.     /* out, own: created tuple */
  238. mem_heap_t* heap, /* in: memory heap where the tuple
  239. is created */
  240. ulint n_fields) /* in: number of fields */
  241. {
  242. dtuple_t* tuple;
  243. ut_ad(heap);
  244. tuple = (dtuple_t*) mem_heap_alloc(heap, sizeof(dtuple_t)
  245.      + n_fields * sizeof(dfield_t));
  246. tuple->info_bits = 0;
  247. tuple->n_fields = n_fields;
  248. tuple->n_fields_cmp = n_fields;
  249. tuple->fields = (dfield_t*)(((byte*)tuple) + sizeof(dtuple_t));
  250. #ifdef UNIV_DEBUG
  251. tuple->magic_n = DATA_TUPLE_MAGIC_N;
  252. { /* In the debug version, initialize fields to an error value */
  253. ulint i;
  254. for (i = 0; i < n_fields; i++) {
  255. (tuple->fields + i)->data = &data_error;
  256. dfield_get_type(tuple->fields + i)->mtype = DATA_ERROR;
  257. }
  258. }
  259. #endif
  260. return(tuple);
  261. }
  262. /**************************************************************
  263. The following function returns the sum of data lengths of a tuple. The space
  264. occupied by the field structs or the tuple struct is not counted. */
  265. UNIV_INLINE
  266. ulint
  267. dtuple_get_data_size(
  268. /*=================*/
  269. /* out: sum of data lens */
  270. dtuple_t* tuple) /* in: typed data tuple */
  271. {
  272. dfield_t* field;
  273. ulint   n_fields;
  274. ulint   len;
  275. ulint   i;
  276. ulint   sum = 0;
  277. ut_ad(tuple);
  278. ut_ad(dtuple_check_typed(tuple));
  279. ut_ad(tuple->magic_n = DATA_TUPLE_MAGIC_N);
  280. n_fields = tuple->n_fields;
  281. for (i = 0; i < n_fields; i++) {
  282. field = dtuple_get_nth_field(tuple,  i);
  283. len = dfield_get_len(field);
  284. if (len == UNIV_SQL_NULL) {
  285. len = dtype_get_sql_null_size(dfield_get_type(field));
  286. }
  287. sum += len;
  288. }
  289. return(sum);
  290. }
  291. /****************************************************************
  292. Returns TRUE if lengths of two dtuples are equal and respective data fields
  293. in them are equal. */
  294. UNIV_INLINE
  295. ibool
  296. dtuple_datas_are_equal(
  297. /*===================*/
  298. /* out: TRUE if length and datas are equal */
  299. dtuple_t* tuple1, /* in: tuple 1 */
  300. dtuple_t* tuple2) /* in: tuple 2 */
  301. {
  302. dfield_t* field1;
  303. dfield_t* field2;
  304. ulint n_fields;
  305. byte* data1;
  306. byte* data2;
  307. ulint len1;
  308. ulint len2;
  309. ulint i;
  310. ut_ad(tuple1 && tuple2);
  311. ut_ad(tuple1->magic_n = DATA_TUPLE_MAGIC_N);
  312. ut_ad(tuple2->magic_n = DATA_TUPLE_MAGIC_N);
  313. ut_ad(dtuple_check_typed(tuple1));
  314. ut_ad(dtuple_check_typed(tuple2));
  315. n_fields = dtuple_get_n_fields(tuple1);
  316. if (n_fields != dtuple_get_n_fields(tuple2)) {
  317. return(FALSE);
  318. }
  319. for (i = 0; i < n_fields; i++) {
  320. field1 = dtuple_get_nth_field(tuple1, i);
  321. data1 = (byte*) dfield_get_data(field1);
  322. len1 = dfield_get_len(field1);
  323. field2 = dtuple_get_nth_field(tuple2, i);
  324. data2 = (byte*) dfield_get_data(field2);
  325. len2 = dfield_get_len(field2);
  326. if (len1 != len2) {
  327. return(FALSE);
  328. }
  329. if (len1 != UNIV_SQL_NULL) {
  330. if (ut_memcmp(data1, data2, len1) != 0) {
  331. return(FALSE);
  332. }
  333. }
  334. }
  335. return(TRUE);
  336. }
  337. /***********************************************************************
  338. Sets types of fields binary in a tuple. */
  339. UNIV_INLINE
  340. void
  341. dtuple_set_types_binary(
  342. /*====================*/
  343. dtuple_t* tuple, /* in: data tuple */
  344. ulint n) /* in: number of fields to set */
  345. {
  346. dtype_t* dfield_type;
  347. ulint i;
  348. for (i = 0; i < n; i++) {
  349. dfield_type = dfield_get_type(dtuple_get_nth_field(tuple, i));
  350. dtype_set(dfield_type, DATA_BINARY, 0, 0, 0);
  351. }
  352. }
  353. /****************************************************************
  354. Folds a prefix given as the number of fields of a tuple. */
  355. UNIV_INLINE
  356. ulint
  357. dtuple_fold(
  358. /*========*/
  359. /* out: the folded value */
  360. dtuple_t* tuple, /* in: the tuple */
  361. ulint n_fields,/* in: number of complete fields to fold */
  362. ulint n_bytes,/* in: number of bytes to fold in an
  363. incomplete last field */
  364. dulint tree_id)/* in: index tree id */
  365. {
  366. dfield_t* field;
  367. ulint i;
  368. byte* data;
  369. ulint len;
  370. ulint fold;
  371. ut_ad(tuple);
  372. ut_ad(tuple->magic_n = DATA_TUPLE_MAGIC_N);
  373. ut_ad(dtuple_check_typed(tuple));
  374. fold = ut_fold_dulint(tree_id);
  375. for (i = 0; i < n_fields; i++) {
  376. field = dtuple_get_nth_field(tuple, i);
  377. data = (byte*) dfield_get_data(field);
  378. len = dfield_get_len(field);
  379. if (len != UNIV_SQL_NULL) {
  380. fold = ut_fold_ulint_pair(fold, 
  381.   ut_fold_binary(data, len));
  382. }
  383. }
  384. if (n_bytes > 0) {
  385. field = dtuple_get_nth_field(tuple, i);
  386. data = (byte*) dfield_get_data(field);
  387. len = dfield_get_len(field);
  388. if (len != UNIV_SQL_NULL) {
  389. if (len > n_bytes) {
  390. len = n_bytes;
  391. }
  392. fold = ut_fold_ulint_pair(fold, 
  393.   ut_fold_binary(data, len));
  394. }
  395. }
  396. return(fold);
  397. }
  398. /**************************************************************************
  399. Writes an SQL null field full of zeros. */
  400. UNIV_INLINE
  401. void
  402. data_write_sql_null(
  403. /*================*/
  404. byte* data, /* in: pointer to a buffer of size len */
  405. ulint len) /* in: SQL null size in bytes */
  406. {
  407. ulint j;
  408. for (j = 0; j < len; j++) {
  409. data[j] = '';
  410. }
  411. }