rec_log
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #include "db_config.h"
  2. #ifndef NO_SYSTEM_INCLUDES
  3. #include <sys/types.h>
  4. #include <string.h>
  5. #endif
  6. #include "db_int.h"
  7. #include "db_page.h"
  8. #include "log.h"
  9. #include "log.h"
  10. /*
  11.  * __log_register1_recover --
  12.  * Recovery function for register1.
  13.  *
  14.  * PUBLIC: int __log_register1_recover
  15.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  16.  */
  17. int
  18. __log_register1_recover(dbenv, dbtp, lsnp, op, info)
  19. DB_ENV *dbenv;
  20. DBT *dbtp;
  21. DB_LSN *lsnp;
  22. db_recops op;
  23. void *info;
  24. {
  25. __log_register1_args *argp;
  26. DB *file_dbp;
  27. DBC *dbc;
  28. DB_MPOOLFILE *mpf;
  29. PAGE *pagep;
  30. int cmp_n, cmp_p, modified, ret;
  31. REC_PRINT(__log_register1_print);
  32. REC_INTRO(__log_register1_read);
  33. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  34. if (DB_REDO(op)) {
  35. if ((ret = memp_fget(mpf,
  36.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  37. goto out;
  38. } else {
  39. *lsnp = argp->prev_lsn;
  40. ret = 0;
  41. goto out;
  42. }
  43. modified = 0;
  44. cmp_n = log_compare(lsnp, &LSN(pagep));
  45. /*
  46.  * Use this when there is something like "pagelsn" in the argp
  47.  * structure.  Sometimes, you might need to compare meta-data
  48.  * lsn's instead.
  49.  *
  50.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  51.  */
  52. if (cmp_p == 0 && DB_REDO(op)) {
  53. /* Need to redo update described. */
  54. modified = 1;
  55. } else if (cmp_n == 0 && !DB_REDO(op)) {
  56. /* Need to undo update described. */
  57. modified = 1;
  58. }
  59. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  60. goto out;
  61. *lsnp = argp->prev_lsn;
  62. ret = 0;
  63. out: REC_CLOSE;
  64. }
  65. /*
  66.  * __log_register_recover --
  67.  * Recovery function for register.
  68.  *
  69.  * PUBLIC: int __log_register_recover
  70.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  71.  */
  72. int
  73. __log_register_recover(dbenv, dbtp, lsnp, op, info)
  74. DB_ENV *dbenv;
  75. DBT *dbtp;
  76. DB_LSN *lsnp;
  77. db_recops op;
  78. void *info;
  79. {
  80. __log_register_args *argp;
  81. DB *file_dbp;
  82. DBC *dbc;
  83. DB_MPOOLFILE *mpf;
  84. PAGE *pagep;
  85. int cmp_n, cmp_p, modified, ret;
  86. REC_PRINT(__log_register_print);
  87. REC_INTRO(__log_register_read);
  88. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  89. if (DB_REDO(op)) {
  90. if ((ret = memp_fget(mpf,
  91.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  92. goto out;
  93. } else {
  94. *lsnp = argp->prev_lsn;
  95. ret = 0;
  96. goto out;
  97. }
  98. modified = 0;
  99. cmp_n = log_compare(lsnp, &LSN(pagep));
  100. /*
  101.  * Use this when there is something like "pagelsn" in the argp
  102.  * structure.  Sometimes, you might need to compare meta-data
  103.  * lsn's instead.
  104.  *
  105.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  106.  */
  107. if (cmp_p == 0 && DB_REDO(op)) {
  108. /* Need to redo update described. */
  109. modified = 1;
  110. } else if (cmp_n == 0 && !DB_REDO(op)) {
  111. /* Need to undo update described. */
  112. modified = 1;
  113. }
  114. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  115. goto out;
  116. *lsnp = argp->prev_lsn;
  117. ret = 0;
  118. out: REC_CLOSE;
  119. }