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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Mini-transaction log routines
  3. (c) 1995 Innobase Oy
  4. Created 12/7/1995 Heikki Tuuri
  5. *******************************************************/
  6. #include "mtr0log.h"
  7. #ifdef UNIV_NONINL
  8. #include "mtr0log.ic"
  9. #endif
  10. #include "buf0buf.h"
  11. #include "dict0boot.h"
  12. /************************************************************
  13. Catenates n bytes to the mtr log. */
  14. void
  15. mlog_catenate_string(
  16. /*=================*/
  17. mtr_t* mtr, /* in: mtr */
  18. byte* str, /* in: string to write */
  19. ulint len) /* in: string length */
  20. {
  21. dyn_array_t* mlog;
  22. if (mtr_get_log_mode(mtr) == MTR_LOG_NONE) {
  23. return;
  24. }
  25. mlog = &(mtr->log);
  26. dyn_push_string(mlog, str, len);
  27. }
  28. /************************************************************
  29. Writes the initial part of a log record consisting of one-byte item
  30. type and four-byte space and page numbers. Also pushes info
  31. to the mtr memo that a buffer page has been modified. */
  32. void
  33. mlog_write_initial_log_record(
  34. /*==========================*/
  35. byte* ptr, /* in: pointer to (inside) a buffer frame holding the
  36. file page where modification is made */
  37. byte type, /* in: log item type: MLOG_1BYTE, ... */
  38. mtr_t* mtr) /* in: mini-transaction handle */
  39. {
  40. byte* log_ptr;
  41. ut_ad(type <= MLOG_BIGGEST_TYPE);
  42. log_ptr = mlog_open(mtr, 20);
  43. /* If no logging is requested, we may return now */
  44. if (log_ptr == NULL) {
  45. return;
  46. }
  47. log_ptr = mlog_write_initial_log_record_fast(ptr, type, log_ptr, mtr);
  48. mlog_close(mtr, log_ptr);
  49. }
  50. /************************************************************
  51. Parses an initial log record written by mlog_write_initial_log_record. */
  52. byte*
  53. mlog_parse_initial_log_record(
  54. /*==========================*/
  55. /* out: parsed record end, NULL if not a complete
  56. record */
  57. byte* ptr, /* in: buffer */
  58. byte* end_ptr,/* in: buffer end */
  59. byte* type, /* out: log record type: MLOG_1BYTE, ... */
  60. ulint* space, /* out: space id */
  61. ulint* page_no)/* out: page number */
  62. {
  63. if (end_ptr < ptr + 1) {
  64. return(NULL);
  65. }
  66. *type = (byte)((ulint)*ptr & ~MLOG_SINGLE_REC_FLAG);
  67. ptr++;
  68. if (end_ptr < ptr + 2) {
  69. return(NULL);
  70. }
  71. ptr = mach_parse_compressed(ptr, end_ptr, space);
  72. if (ptr == NULL) {
  73. return(NULL);
  74. }
  75. ptr = mach_parse_compressed(ptr, end_ptr, page_no);
  76. return(ptr);
  77. }
  78. /************************************************************
  79. Parses a log record written by mlog_write_ulint or mlog_write_dulint. */
  80. byte*
  81. mlog_parse_nbytes(
  82. /*==============*/
  83. /* out: parsed record end, NULL if not a complete
  84. record */
  85. ulint type, /* in: log record type: MLOG_1BYTE, ... */
  86. byte* ptr, /* in: buffer */
  87. byte* end_ptr,/* in: buffer end */
  88. byte* page) /* in: page where to apply the log record, or NULL */
  89. {
  90. ulint offset;
  91. ulint val;
  92. dulint dval;
  93. ut_a(type <= MLOG_8BYTES);
  94. if (end_ptr < ptr + 2) {
  95. return(NULL);
  96. }
  97. offset = mach_read_from_2(ptr);
  98. ptr += 2;
  99. if (type == MLOG_8BYTES) {
  100. ptr = mach_dulint_parse_compressed(ptr, end_ptr, &dval);
  101. if (ptr == NULL) {
  102. return(NULL);
  103. }
  104. if (page) {
  105. mach_write_to_8(page + offset, dval);
  106. }
  107. return(ptr);
  108. }
  109. ptr = mach_parse_compressed(ptr, end_ptr, &val);
  110. if (ptr == NULL) {
  111. return(NULL);
  112. }
  113. if (page) {
  114. if (type == MLOG_1BYTE) {
  115. mach_write_to_1(page + offset, val);
  116. } else if (type == MLOG_2BYTES) {
  117. mach_write_to_2(page + offset, val);
  118. } else {
  119. ut_ad(type == MLOG_4BYTES);
  120. mach_write_to_4(page + offset, val);
  121. }
  122. }
  123. return(ptr);
  124. }
  125. /************************************************************
  126. Writes 1 - 4 bytes to a file page buffered in the buffer pool.
  127. Writes the corresponding log record to the mini-transaction log. */
  128. void
  129. mlog_write_ulint(
  130. /*=============*/
  131. byte* ptr, /* in: pointer where to write */
  132. ulint val, /* in: value to write */
  133. byte type, /* in: MLOG_1BYTE, MLOG_2BYTES, MLOG_4BYTES */
  134. mtr_t* mtr) /* in: mini-transaction handle */
  135. {
  136. byte* log_ptr;
  137. if (type == MLOG_1BYTE) {
  138. mach_write_to_1(ptr, val);
  139. } else if (type == MLOG_2BYTES) {
  140. mach_write_to_2(ptr, val);
  141. } else {
  142. ut_ad(type == MLOG_4BYTES);
  143. mach_write_to_4(ptr, val);
  144. }
  145. log_ptr = mlog_open(mtr, 30);
  146. /* If no logging is requested, we may return now */
  147. if (log_ptr == NULL) {
  148. return;
  149. }
  150. log_ptr = mlog_write_initial_log_record_fast(ptr, type, log_ptr, mtr);
  151. mach_write_to_2(log_ptr, ptr - buf_frame_align(ptr));
  152. log_ptr += 2;
  153. log_ptr += mach_write_compressed(log_ptr, val);
  154. mlog_close(mtr, log_ptr);
  155. }
  156. /************************************************************
  157. Writes 8 bytes to a file page buffered in the buffer pool.
  158. Writes the corresponding log record to the mini-transaction log. */
  159. void
  160. mlog_write_dulint(
  161. /*==============*/
  162. byte* ptr, /* in: pointer where to write */
  163. dulint val, /* in: value to write */
  164. byte type, /* in: MLOG_8BYTES */
  165. mtr_t* mtr) /* in: mini-transaction handle */
  166. {
  167. byte* log_ptr;
  168. ut_ad(ptr && mtr);
  169. ut_ad(type == MLOG_8BYTES);
  170. mach_write_to_8(ptr, val);
  171. log_ptr = mlog_open(mtr, 30);
  172. /* If no logging is requested, we may return now */
  173. if (log_ptr == NULL) {
  174. return;
  175. }
  176. log_ptr = mlog_write_initial_log_record_fast(ptr, type, log_ptr, mtr);
  177. mach_write_to_2(log_ptr, ptr - buf_frame_align(ptr));
  178. log_ptr += 2;
  179. log_ptr += mach_dulint_write_compressed(log_ptr, val);
  180. mlog_close(mtr, log_ptr);
  181. }
  182. /************************************************************
  183. Writes a string to a file page buffered in the buffer pool. Writes the
  184. corresponding log record to the mini-transaction log. */
  185. void
  186. mlog_write_string(
  187. /*==============*/
  188. byte* ptr, /* in: pointer where to write */
  189. byte* str, /* in: string to write */
  190. ulint len, /* in: string length */
  191. mtr_t* mtr) /* in: mini-transaction handle */
  192. {
  193. byte* log_ptr;
  194. ut_ad(ptr && mtr);
  195. ut_ad(len < UNIV_PAGE_SIZE);
  196. ut_memcpy(ptr, str, len);
  197. log_ptr = mlog_open(mtr, 30);
  198. /* If no logging is requested, we may return now */
  199. if (log_ptr == NULL) {
  200. return;
  201. }
  202. log_ptr = mlog_write_initial_log_record_fast(ptr, MLOG_WRITE_STRING,
  203. log_ptr, mtr);
  204. mach_write_to_2(log_ptr, ptr - buf_frame_align(ptr));
  205. log_ptr += 2;
  206. mach_write_to_2(log_ptr, len);
  207. log_ptr += 2;
  208. mlog_close(mtr, log_ptr);
  209. mlog_catenate_string(mtr, str, len);
  210. }
  211. /************************************************************
  212. Parses a log record written by mlog_write_string. */
  213. byte*
  214. mlog_parse_string(
  215. /*==============*/
  216. /* out: parsed record end, NULL if not a complete
  217. record */
  218. byte* ptr, /* in: buffer */
  219. byte* end_ptr,/* in: buffer end */
  220. byte* page) /* in: page where to apply the log record, or NULL */
  221. {
  222. ulint offset;
  223. ulint len;
  224. if (end_ptr < ptr + 4) {
  225. return(NULL);
  226. }
  227. offset = mach_read_from_2(ptr);
  228. ptr += 2;
  229. len = mach_read_from_2(ptr);
  230. ptr += 2;
  231. if (end_ptr < ptr + len) {
  232. return(NULL);
  233. }
  234. if (page) {
  235. ut_memcpy(page + offset, ptr, len);
  236. }
  237. return(ptr + len);
  238. }