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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Transaction undo log
  3. (c) 1996 Innobase Oy
  4. Created 3/26/1996 Heikki Tuuri
  5. *******************************************************/
  6. #include "data0type.h"
  7. /***************************************************************************
  8. Builds a roll pointer dulint. */
  9. UNIV_INLINE
  10. dulint
  11. trx_undo_build_roll_ptr(
  12. /*====================*/
  13. /* out: roll pointer */
  14. ibool is_insert, /* in: TRUE if insert undo log */
  15. ulint rseg_id, /* in: rollback segment id */
  16. ulint page_no, /* in: page number */
  17. ulint offset) /* in: offset of the undo entry within page */
  18. {
  19. ut_ad(DATA_ROLL_PTR_LEN == 7);
  20. ut_ad(rseg_id < 128);
  21. return(ut_dulint_create(is_insert * 128 * 256 * 256
  22. + rseg_id * 256 * 256
  23. + (page_no / 256) / 256,
  24. (page_no % (256 * 256)) * 256 * 256
  25. + offset));
  26. }
  27. /***************************************************************************
  28. Decodes a roll pointer dulint. */
  29. UNIV_INLINE
  30. void
  31. trx_undo_decode_roll_ptr(
  32. /*=====================*/
  33. dulint roll_ptr, /* in: roll pointer */
  34. ibool* is_insert, /* out: TRUE if insert undo log */
  35. ulint* rseg_id, /* out: rollback segment id */
  36. ulint* page_no, /* out: page number */
  37. ulint* offset) /* out: offset of the undo entry within page */
  38. {
  39. ulint low;
  40. ulint high;
  41. ut_ad(DATA_ROLL_PTR_LEN == 7);
  42. ut_ad(TRUE == 1);
  43. high = ut_dulint_get_high(roll_ptr);
  44. low = ut_dulint_get_low(roll_ptr);
  45. *offset = low % (256 * 256);
  46. *is_insert = high / (256 * 256 * 128); /* TRUE == 1 */
  47. *rseg_id = (high / (256 * 256)) % 128;
  48. *page_no = (high % (256 * 256)) * 256 * 256
  49.    + (low / 256) / 256;
  50. }
  51. /***************************************************************************
  52. Returns TRUE if the roll pointer is of the insert type. */
  53. UNIV_INLINE
  54. ibool
  55. trx_undo_roll_ptr_is_insert(
  56. /*========================*/
  57. /* out: TRUE if insert undo log */
  58. dulint roll_ptr) /* in: roll pointer */
  59. {
  60. ulint high;
  61. ut_ad(DATA_ROLL_PTR_LEN == 7);
  62. ut_ad(TRUE == 1);
  63. high = ut_dulint_get_high(roll_ptr);
  64. return(high / (256 * 256 * 128));
  65. }
  66. /*********************************************************************
  67. Writes a roll ptr to an index page. In case that the size changes in
  68. some future version, this function should be used instead of
  69. mach_write_... */
  70. UNIV_INLINE
  71. void
  72. trx_write_roll_ptr(
  73. /*===============*/
  74. byte* ptr, /* in: pointer to memory where written */
  75. dulint roll_ptr) /* in: roll ptr */
  76. {
  77. ut_ad(DATA_ROLL_PTR_LEN == 7);
  78. mach_write_to_7(ptr, roll_ptr);
  79. }
  80. /*********************************************************************
  81. Reads a roll ptr from an index page. In case that the roll ptr size
  82. changes in some future version, this function should be used instead of
  83. mach_read_... */
  84. UNIV_INLINE
  85. dulint
  86. trx_read_roll_ptr(
  87. /*==============*/
  88. /* out: roll ptr */
  89. byte* ptr) /* in: pointer to memory from where to read */
  90. {
  91. ut_ad(DATA_ROLL_PTR_LEN == 7);
  92. return(mach_read_from_7(ptr));
  93. }
  94. /**********************************************************************
  95. Gets an undo log page and x-latches it. */
  96. UNIV_INLINE
  97. page_t*
  98. trx_undo_page_get(
  99. /*===============*/
  100. /* out: pointer to page x-latched */
  101. ulint space, /* in: space where placed */
  102. ulint page_no, /* in: page number */
  103. mtr_t* mtr) /* in: mtr */
  104. {
  105. page_t* page;
  106. page = buf_page_get(space, page_no, RW_X_LATCH, mtr);
  107. buf_page_dbg_add_level(page, SYNC_TRX_UNDO_PAGE);
  108. return(page);
  109. }
  110. /**********************************************************************
  111. Gets an undo log page and s-latches it. */
  112. UNIV_INLINE
  113. page_t*
  114. trx_undo_page_get_s_latched(
  115. /*=========================*/
  116. /* out: pointer to page s-latched */
  117. ulint space, /* in: space where placed */
  118. ulint page_no, /* in: page number */
  119. mtr_t* mtr) /* in: mtr */
  120. {
  121. page_t* page;
  122. page = buf_page_get(space, page_no, RW_S_LATCH, mtr);
  123. buf_page_dbg_add_level(page, SYNC_TRX_UNDO_PAGE);
  124. return(page);
  125. }
  126. /**********************************************************************
  127. Returns the start offset of the undo log records of the specified undo
  128. log on the page. */
  129. UNIV_INLINE
  130. ulint
  131. trx_undo_page_get_start(
  132. /*====================*/
  133. /* out: start offset */
  134. page_t* undo_page,/* in: undo log page */
  135. ulint page_no,/* in: undo log header page number */
  136. ulint offset) /* in: undo log header offset on page */
  137. {
  138. ulint start;
  139. if (page_no == buf_frame_get_page_no(undo_page)) {
  140. start = mach_read_from_2(offset + undo_page
  141. + TRX_UNDO_LOG_START);
  142. } else {
  143. start = TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE;
  144. }
  145. return(start);
  146. }
  147. /**********************************************************************
  148. Returns the end offset of the undo log records of the specified undo
  149. log on the page. */
  150. UNIV_INLINE
  151. ulint
  152. trx_undo_page_get_end(
  153. /*==================*/
  154. /* out: end offset */
  155. page_t* undo_page,/* in: undo log page */
  156. ulint page_no,/* in: undo log header page number */
  157. ulint offset) /* in: undo log header offset on page */
  158. {
  159. trx_ulogf_t* log_hdr;
  160. ulint end;
  161. if (page_no == buf_frame_get_page_no(undo_page)) {
  162. log_hdr = undo_page + offset;
  163. end = mach_read_from_2(log_hdr + TRX_UNDO_NEXT_LOG);
  164. if (end == 0) {
  165. end = mach_read_from_2(undo_page + TRX_UNDO_PAGE_HDR
  166. + TRX_UNDO_PAGE_FREE);
  167. }
  168. } else {
  169. end = mach_read_from_2(undo_page + TRX_UNDO_PAGE_HDR
  170. + TRX_UNDO_PAGE_FREE);
  171. }
  172. return(end);
  173. }
  174. /**********************************************************************
  175. Returns the previous undo record on the page in the specified log, or
  176. NULL if none exists. */
  177. UNIV_INLINE
  178. trx_undo_rec_t*
  179. trx_undo_page_get_prev_rec(
  180. /*=======================*/
  181. /* out: pointer to record, NULL if none */
  182. trx_undo_rec_t* rec, /* in: undo log record */
  183. ulint page_no,/* in: undo log header page number */
  184. ulint offset) /* in: undo log header offset on page */
  185. {
  186. page_t* undo_page;
  187. ulint start;
  188. undo_page = buf_frame_align(rec);
  189. start = trx_undo_page_get_start(undo_page, page_no, offset);
  190. if (start + undo_page == rec) {
  191. return(NULL);
  192. }
  193. return(undo_page + mach_read_from_2(rec - 2));
  194. }
  195. /**********************************************************************
  196. Returns the next undo log record on the page in the specified log, or
  197. NULL if none exists. */
  198. UNIV_INLINE
  199. trx_undo_rec_t*
  200. trx_undo_page_get_next_rec(
  201. /*=======================*/
  202. /* out: pointer to record, NULL if none */
  203. trx_undo_rec_t* rec, /* in: undo log record */
  204. ulint page_no,/* in: undo log header page number */
  205. ulint offset) /* in: undo log header offset on page */
  206. {
  207. page_t* undo_page;
  208. ulint end;
  209. ulint next;
  210. undo_page = buf_frame_align(rec);
  211. end = trx_undo_page_get_end(undo_page, page_no, offset);
  212. next = mach_read_from_2(rec);
  213. if (next == end) {
  214. return(NULL);
  215. }
  216. return(undo_page + next);
  217. }
  218. /**********************************************************************
  219. Returns the last undo record on the page in the specified undo log, or
  220. NULL if none exists. */
  221. UNIV_INLINE
  222. trx_undo_rec_t*
  223. trx_undo_page_get_last_rec(
  224. /*=======================*/
  225. /* out: pointer to record, NULL if none */
  226. page_t* undo_page,/* in: undo log page */
  227. ulint page_no,/* in: undo log header page number */
  228. ulint offset) /* in: undo log header offset on page */
  229. {
  230. ulint start;
  231. ulint end;
  232. start = trx_undo_page_get_start(undo_page, page_no, offset);
  233. end = trx_undo_page_get_end(undo_page, page_no, offset);
  234. if (start == end) {
  235. return(NULL);
  236. }
  237. return(undo_page + mach_read_from_2(undo_page + end - 2));
  238. }
  239. /**********************************************************************
  240. Returns the first undo record on the page in the specified undo log, or
  241. NULL if none exists. */
  242. UNIV_INLINE
  243. trx_undo_rec_t*
  244. trx_undo_page_get_first_rec(
  245. /*========================*/
  246. /* out: pointer to record, NULL if none */
  247. page_t* undo_page,/* in: undo log page */
  248. ulint page_no,/* in: undo log header page number */
  249. ulint offset) /* in: undo log header offset on page */
  250. {
  251. ulint start;
  252. ulint end;
  253. start = trx_undo_page_get_start(undo_page, page_no, offset);
  254. end = trx_undo_page_get_end(undo_page, page_no, offset);
  255. if (start == end) {
  256. return(NULL);
  257. }
  258. return(undo_page + start);
  259. }