trx0undo.ic
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小: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. #ifdef UNIV_SYNC_DEBUG
  108. buf_page_dbg_add_level(page, SYNC_TRX_UNDO_PAGE);
  109. #endif /* UNIV_SYNC_DEBUG */
  110. return(page);
  111. }
  112. /**********************************************************************
  113. Gets an undo log page and s-latches it. */
  114. UNIV_INLINE
  115. page_t*
  116. trx_undo_page_get_s_latched(
  117. /*=========================*/
  118. /* out: pointer to page s-latched */
  119. ulint space, /* in: space where placed */
  120. ulint page_no, /* in: page number */
  121. mtr_t* mtr) /* in: mtr */
  122. {
  123. page_t* page;
  124. page = buf_page_get(space, page_no, RW_S_LATCH, mtr);
  125. #ifdef UNIV_SYNC_DEBUG
  126. buf_page_dbg_add_level(page, SYNC_TRX_UNDO_PAGE);
  127. #endif /* UNIV_SYNC_DEBUG */
  128. return(page);
  129. }
  130. /**********************************************************************
  131. Returns the start offset of the undo log records of the specified undo
  132. log on the page. */
  133. UNIV_INLINE
  134. ulint
  135. trx_undo_page_get_start(
  136. /*====================*/
  137. /* out: start offset */
  138. page_t* undo_page,/* in: undo log page */
  139. ulint page_no,/* in: undo log header page number */
  140. ulint offset) /* in: undo log header offset on page */
  141. {
  142. ulint start;
  143. if (page_no == buf_frame_get_page_no(undo_page)) {
  144. start = mach_read_from_2(offset + undo_page
  145. + TRX_UNDO_LOG_START);
  146. } else {
  147. start = TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_HDR_SIZE;
  148. }
  149. return(start);
  150. }
  151. /**********************************************************************
  152. Returns the end offset of the undo log records of the specified undo
  153. log on the page. */
  154. UNIV_INLINE
  155. ulint
  156. trx_undo_page_get_end(
  157. /*==================*/
  158. /* out: end offset */
  159. page_t* undo_page,/* in: undo log page */
  160. ulint page_no,/* in: undo log header page number */
  161. ulint offset) /* in: undo log header offset on page */
  162. {
  163. trx_ulogf_t* log_hdr;
  164. ulint end;
  165. if (page_no == buf_frame_get_page_no(undo_page)) {
  166. log_hdr = undo_page + offset;
  167. end = mach_read_from_2(log_hdr + TRX_UNDO_NEXT_LOG);
  168. if (end == 0) {
  169. end = mach_read_from_2(undo_page + TRX_UNDO_PAGE_HDR
  170. + TRX_UNDO_PAGE_FREE);
  171. }
  172. } else {
  173. end = mach_read_from_2(undo_page + TRX_UNDO_PAGE_HDR
  174. + TRX_UNDO_PAGE_FREE);
  175. }
  176. return(end);
  177. }
  178. /**********************************************************************
  179. Returns the previous undo record on the page in the specified log, or
  180. NULL if none exists. */
  181. UNIV_INLINE
  182. trx_undo_rec_t*
  183. trx_undo_page_get_prev_rec(
  184. /*=======================*/
  185. /* out: pointer to record, NULL if none */
  186. trx_undo_rec_t* rec, /* in: undo log record */
  187. ulint page_no,/* in: undo log header page number */
  188. ulint offset) /* in: undo log header offset on page */
  189. {
  190. page_t* undo_page;
  191. ulint start;
  192. undo_page = buf_frame_align(rec);
  193. start = trx_undo_page_get_start(undo_page, page_no, offset);
  194. if (start + undo_page == rec) {
  195. return(NULL);
  196. }
  197. return(undo_page + mach_read_from_2(rec - 2));
  198. }
  199. /**********************************************************************
  200. Returns the next undo log record on the page in the specified log, or
  201. NULL if none exists. */
  202. UNIV_INLINE
  203. trx_undo_rec_t*
  204. trx_undo_page_get_next_rec(
  205. /*=======================*/
  206. /* out: pointer to record, NULL if none */
  207. trx_undo_rec_t* rec, /* in: undo log record */
  208. ulint page_no,/* in: undo log header page number */
  209. ulint offset) /* in: undo log header offset on page */
  210. {
  211. page_t* undo_page;
  212. ulint end;
  213. ulint next;
  214. undo_page = buf_frame_align(rec);
  215. end = trx_undo_page_get_end(undo_page, page_no, offset);
  216. next = mach_read_from_2(rec);
  217. if (next == end) {
  218. return(NULL);
  219. }
  220. return(undo_page + next);
  221. }
  222. /**********************************************************************
  223. Returns the last undo record on the page in the specified undo log, or
  224. NULL if none exists. */
  225. UNIV_INLINE
  226. trx_undo_rec_t*
  227. trx_undo_page_get_last_rec(
  228. /*=======================*/
  229. /* out: pointer to record, NULL if none */
  230. page_t* undo_page,/* in: undo log page */
  231. ulint page_no,/* in: undo log header page number */
  232. ulint offset) /* in: undo log header offset on page */
  233. {
  234. ulint start;
  235. ulint end;
  236. start = trx_undo_page_get_start(undo_page, page_no, offset);
  237. end = trx_undo_page_get_end(undo_page, page_no, offset);
  238. if (start == end) {
  239. return(NULL);
  240. }
  241. return(undo_page + mach_read_from_2(undo_page + end - 2));
  242. }
  243. /**********************************************************************
  244. Returns the first undo record on the page in the specified undo log, or
  245. NULL if none exists. */
  246. UNIV_INLINE
  247. trx_undo_rec_t*
  248. trx_undo_page_get_first_rec(
  249. /*========================*/
  250. /* out: pointer to record, NULL if none */
  251. page_t* undo_page,/* in: undo log page */
  252. ulint page_no,/* in: undo log header page number */
  253. ulint offset) /* in: undo log header offset on page */
  254. {
  255. ulint start;
  256. ulint end;
  257. start = trx_undo_page_get_start(undo_page, page_no, offset);
  258. end = trx_undo_page_get_end(undo_page, page_no, offset);
  259. if (start == end) {
  260. return(NULL);
  261. }
  262. return(undo_page + start);
  263. }