crdel_rec.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: crdel_rec.c,v 11.64 2002/08/14 20:27:34 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #include <string.h>
  14. #endif
  15. #include "db_int.h"
  16. #include "dbinc/db_page.h"
  17. #include "dbinc/hash.h"
  18. #include "dbinc/log.h"
  19. /*
  20.  * __crdel_metasub_recover --
  21.  * Recovery function for metasub.
  22.  *
  23.  * PUBLIC: int __crdel_metasub_recover
  24.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  25.  */
  26. int
  27. __crdel_metasub_recover(dbenv, dbtp, lsnp, op, info)
  28. DB_ENV *dbenv;
  29. DBT *dbtp;
  30. DB_LSN *lsnp;
  31. db_recops op;
  32. void *info;
  33. {
  34. __crdel_metasub_args *argp;
  35. DB *file_dbp;
  36. DBC *dbc;
  37. DB_MPOOLFILE *mpf;
  38. PAGE *pagep;
  39. int cmp_p, modified, ret;
  40. pagep = NULL;
  41. COMPQUIET(info, NULL);
  42. REC_PRINT(__crdel_metasub_print);
  43. REC_INTRO(__crdel_metasub_read, 0);
  44. if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0) {
  45. if (DB_REDO(op)) {
  46. if ((ret = mpf->get(mpf,
  47.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  48. goto out;
  49. } else {
  50. *lsnp = argp->prev_lsn;
  51. ret = 0;
  52. goto out;
  53. }
  54. }
  55. modified = 0;
  56. cmp_p = log_compare(&LSN(pagep), &argp->lsn);
  57. CHECK_LSN(op, cmp_p, &LSN(pagep), &argp->lsn);
  58. if (cmp_p == 0 && DB_REDO(op)) {
  59. memcpy(pagep, argp->page.data, argp->page.size);
  60. LSN(pagep) = *lsnp;
  61. modified = 1;
  62. } else if (DB_UNDO(op)) {
  63. /*
  64.  * We want to undo this page creation.  The page creation
  65.  * happened in two parts.  First, we called __bam_new which
  66.  * was logged separately. Then we wrote the meta-data onto
  67.  * the page.  So long as we restore the LSN, then the recovery
  68.  * for __bam_new will do everything else.
  69.  * Don't bother checking the lsn on the page.  If we
  70.  * are rolling back the next thing is that this page
  71.  * will get freed.  Opening the subdb will have reinitialized
  72.  * the page, but not the lsn.
  73.  */
  74. LSN(pagep) = argp->lsn;
  75. modified = 1;
  76. }
  77. if ((ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) != 0)
  78. goto out;
  79. pagep = NULL;
  80. done: *lsnp = argp->prev_lsn;
  81. ret = 0;
  82. out: if (pagep != NULL)
  83. (void)mpf->put(mpf, pagep, 0);
  84. REC_CLOSE;
  85. }