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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. General row routines
  3. (c) 1996 Innobase Oy
  4. Created 4/20/1996 Heikki Tuuri
  5. *******************************************************/
  6. #include "dict0dict.h"
  7. #include "rem0rec.h"
  8. #include "trx0undo.h"
  9. /*************************************************************************
  10. Reads the trx id or roll ptr field from a clustered index record: this function
  11. is slower than the specialized inline functions. */
  12. dulint
  13. row_get_rec_sys_field(
  14. /*==================*/
  15. /* out: value of the field */
  16. ulint type, /* in: DATA_TRX_ID or DATA_ROLL_PTR */
  17. rec_t* rec, /* in: record */
  18. dict_index_t* index); /* in: clustered index */
  19. /*************************************************************************
  20. Sets the trx id or roll ptr field in a clustered index record: this function
  21. is slower than the specialized inline functions. */
  22. void
  23. row_set_rec_sys_field(
  24. /*==================*/
  25. /* out: value of the field */
  26. ulint type, /* in: DATA_TRX_ID or DATA_ROLL_PTR */
  27. rec_t* rec, /* in: record */
  28. dict_index_t* index, /* in: clustered index */
  29. dulint val); /* in: value to set */
  30. /*************************************************************************
  31. Reads the trx id field from a clustered index record. */
  32. UNIV_INLINE
  33. dulint
  34. row_get_rec_trx_id(
  35. /*===============*/
  36. /* out: value of the field */
  37. rec_t* rec, /* in: record */
  38. dict_index_t* index) /* in: clustered index */
  39. {
  40. ulint offset;
  41. ut_ad(index->type & DICT_CLUSTERED);
  42. offset = index->trx_id_offset;
  43. if (offset) {
  44. return(trx_read_trx_id(rec + offset));
  45. } else {
  46. return(row_get_rec_sys_field(DATA_TRX_ID, rec, index));
  47. }
  48. }
  49. /*************************************************************************
  50. Reads the roll pointer field from a clustered index record. */
  51. UNIV_INLINE
  52. dulint
  53. row_get_rec_roll_ptr(
  54. /*=================*/
  55. /* out: value of the field */
  56. rec_t* rec, /* in: record */
  57. dict_index_t* index) /* in: clustered index */
  58. {
  59. ulint offset;
  60. ut_ad(index->type & DICT_CLUSTERED);
  61. offset = index->trx_id_offset;
  62. if (offset) {
  63. return(trx_read_roll_ptr(rec + offset + DATA_TRX_ID_LEN));
  64. } else {
  65. return(row_get_rec_sys_field(DATA_ROLL_PTR, rec, index));
  66. }
  67. }
  68. /*************************************************************************
  69. Writes the trx id field to a clustered index record. */
  70. UNIV_INLINE
  71. void
  72. row_set_rec_trx_id(
  73. /*===============*/
  74. rec_t* rec, /* in: record */
  75. dict_index_t* index, /* in: clustered index */
  76. dulint trx_id) /* in: value of the field */
  77. {
  78. ulint offset;
  79. ut_ad(index->type & DICT_CLUSTERED);
  80. offset = index->trx_id_offset;
  81. if (offset) {
  82. trx_write_trx_id(rec + offset, trx_id);
  83. } else {
  84. row_set_rec_sys_field(DATA_TRX_ID, rec, index, trx_id);
  85. }
  86. }
  87. /*************************************************************************
  88. Sets the roll pointer field in a clustered index record. */
  89. UNIV_INLINE
  90. void
  91. row_set_rec_roll_ptr(
  92. /*=================*/
  93. rec_t* rec, /* in: record */
  94. dict_index_t* index, /* in: clustered index */
  95. dulint roll_ptr)/* in: value of the field */
  96. {
  97. ulint offset;
  98. ut_ad(index->type & DICT_CLUSTERED);
  99. offset = index->trx_id_offset;
  100. if (offset) {
  101. trx_write_roll_ptr(rec + offset + DATA_TRX_ID_LEN, roll_ptr);
  102. } else {
  103.   row_set_rec_sys_field(DATA_ROLL_PTR, rec, index, roll_ptr);
  104. }
  105. }
  106. /***********************************************************************
  107. Builds from a secondary index record a row reference with which we can
  108. search the clustered index record. */
  109. UNIV_INLINE
  110. void
  111. row_build_row_ref_fast(
  112. /*===================*/
  113. dtuple_t* ref, /* in: typed data tuple where the reference
  114. is built */
  115. ulint* map, /* in: array of field numbers in rec telling
  116. how ref should be built from the fields of
  117. rec */
  118. rec_t* rec) /* in: record in the index; must be preserved
  119. while ref is used, as we do not copy field
  120. values to heap */
  121. {
  122. dfield_t* dfield;
  123. byte* field;
  124. ulint len;
  125. ulint ref_len;
  126. ulint field_no;
  127. ulint i;
  128. ref_len = dtuple_get_n_fields(ref);
  129. for (i = 0; i < ref_len; i++) {
  130. dfield = dtuple_get_nth_field(ref, i);
  131. field_no = *(map + i);
  132. if (field_no != ULINT_UNDEFINED) {
  133. field = rec_get_nth_field(rec, field_no, &len);
  134. dfield_set_data(dfield, field, len);
  135. }
  136. }
  137. }