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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Mini-transaction logging routines
  3. (c) 1995 Innobase Oy
  4. Created 12/7/1995 Heikki Tuuri
  5. *******************************************************/
  6. #include "mach0data.h"
  7. #include "ut0lst.h"
  8. #include "buf0buf.h"
  9. /************************************************************
  10. Opens a buffer to mlog. It must be closed with mlog_close. */
  11. UNIV_INLINE
  12. byte*
  13. mlog_open(
  14. /*======*/
  15. /* out: buffer, NULL if log mode MTR_LOG_NONE */
  16. mtr_t* mtr, /* in: mtr */
  17. ulint size) /* in: buffer size in bytes */
  18. {
  19. dyn_array_t* mlog;
  20. mtr->modifications = TRUE;
  21. if (mtr_get_log_mode(mtr) == MTR_LOG_NONE) {
  22. return(NULL);
  23. }
  24. mlog = &(mtr->log);
  25. return(dyn_array_open(mlog, size));
  26. }
  27. /************************************************************
  28. Closes a buffer opened to mlog. */
  29. UNIV_INLINE
  30. void
  31. mlog_close(
  32. /*=======*/
  33. mtr_t* mtr, /* in: mtr */
  34. byte* ptr) /* in: buffer space from ptr up was not used */
  35. {
  36. dyn_array_t* mlog;
  37. ut_ad(mtr_get_log_mode(mtr) != MTR_LOG_NONE);
  38. mlog = &(mtr->log);
  39. dyn_array_close(mlog, ptr);
  40. }
  41. /************************************************************
  42. Catenates 1 - 4 bytes to the mtr log. The value is not compressed. */
  43. UNIV_INLINE
  44. void
  45. mlog_catenate_ulint(
  46. /*================*/
  47. mtr_t* mtr, /* in: mtr */
  48. ulint val, /* in: value to write */
  49. ulint type) /* in: MLOG_1BYTE, MLOG_2BYTES, MLOG_4BYTES */
  50. {
  51. dyn_array_t* mlog;
  52. byte* ptr;
  53. if (mtr_get_log_mode(mtr) == MTR_LOG_NONE) {
  54. return;
  55. }
  56. mlog = &(mtr->log);
  57. ut_ad(MLOG_1BYTE == 1);
  58. ut_ad(MLOG_2BYTES == 2);
  59. ut_ad(MLOG_4BYTES == 4);
  60. ptr = dyn_array_push(mlog, type);
  61. if (type == MLOG_4BYTES) {
  62. mach_write_to_4(ptr, val);
  63. } else if (type == MLOG_2BYTES) {
  64. mach_write_to_2(ptr, val);
  65. } else {
  66. ut_ad(type == MLOG_1BYTE);
  67. mach_write_to_1(ptr, val);
  68.   }
  69. }
  70. /************************************************************
  71. Catenates a compressed ulint to mlog. */
  72. UNIV_INLINE
  73. void
  74. mlog_catenate_ulint_compressed(
  75. /*===========================*/
  76. mtr_t* mtr, /* in: mtr */
  77. ulint val) /* in: value to write */
  78. {
  79. byte* log_ptr;
  80. log_ptr = mlog_open(mtr, 10);
  81. /* If no logging is requested, we may return now */
  82. if (log_ptr == NULL) {
  83. return;
  84. }
  85. log_ptr += mach_write_compressed(log_ptr, val);
  86. mlog_close(mtr, log_ptr);
  87. }
  88. /************************************************************
  89. Catenates a compressed dulint to mlog. */
  90. UNIV_INLINE
  91. void
  92. mlog_catenate_dulint_compressed(
  93. /*============================*/
  94. mtr_t* mtr, /* in: mtr */
  95. dulint val) /* in: value to write */
  96. {
  97. byte* log_ptr;
  98. log_ptr = mlog_open(mtr, 15);
  99. /* If no logging is requested, we may return now */
  100. if (log_ptr == NULL) {
  101. return;
  102. }
  103. log_ptr += mach_dulint_write_compressed(log_ptr, val);
  104. mlog_close(mtr, log_ptr);
  105. }
  106. /************************************************************
  107. Writes the initial part of a log record. */
  108. UNIV_INLINE
  109. byte*
  110. mlog_write_initial_log_record_fast(
  111. /*===============================*/
  112. /* out: new value of log_ptr */
  113. byte* ptr, /* in: pointer to (inside) a buffer frame holding the
  114. file page where modification is made */
  115. byte type, /* in: log item type: MLOG_1BYTE, ... */
  116. byte* log_ptr,/* in: pointer to mtr log which has been opened */
  117. mtr_t* mtr) /* in: mtr */
  118. {
  119. buf_block_t* block;
  120. ulint space;
  121. ulint offset;
  122. ut_ad(mtr_memo_contains(mtr, buf_block_align(ptr), 
  123. MTR_MEMO_PAGE_X_FIX));
  124. ut_ad(type <= MLOG_BIGGEST_TYPE);
  125. ut_ad(ptr && log_ptr);
  126. block = buf_block_align(ptr);
  127. space = buf_block_get_space(block);
  128. offset = buf_block_get_page_no(block);
  129. mach_write_to_1(log_ptr, type);
  130. log_ptr++;
  131. log_ptr += mach_write_compressed(log_ptr, space);
  132. log_ptr += mach_write_compressed(log_ptr, offset);
  133. mtr->n_log_recs++;
  134. #ifdef UNIV_LOG_DEBUG
  135. /* printf("Adding to mtr log record type %lu space %lu page no %lun",
  136. type, space, offset); */
  137. #endif
  138. #ifdef UNIV_DEBUG
  139. /* We now assume that all x-latched pages have been modified! */
  140. if (!mtr_memo_contains(mtr, block, MTR_MEMO_MODIFY)) {
  141. mtr_memo_push(mtr, block, MTR_MEMO_MODIFY);
  142. }
  143. #endif
  144. return(log_ptr);
  145. }