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

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * __PREF_FUNC_recover --
  3.  * Recovery function for FUNC.
  4.  *
  5.  * PUBLIC: int __PREF_FUNC_recover
  6.  * PUBLIC:   __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
  7.  */
  8. int
  9. __PREF_FUNC_recover(dbenv, dbtp, lsnp, op, info)
  10. DB_ENV *dbenv;
  11. DBT *dbtp;
  12. DB_LSN *lsnp;
  13. db_recops op;
  14. void *info;
  15. {
  16. __PREF_FUNC_args *argp;
  17. DB *file_dbp;
  18. DBC *dbc;
  19. DB_MPOOLFILE *mpf;
  20. PAGE *pagep;
  21. int cmp_n, cmp_p, modified, ret;
  22. REC_PRINT(__PREF_FUNC_print);
  23. REC_INTRO(__PREF_FUNC_read);
  24. if ((ret = memp_fget(mpf, &argp->pgno, 0, &pagep)) != 0)
  25. if (DB_REDO(op)) {
  26. if ((ret = memp_fget(mpf,
  27.     &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0)
  28. goto out;
  29. } else {
  30. *lsnp = argp->prev_lsn;
  31. ret = 0;
  32. goto out;
  33. }
  34. modified = 0;
  35. cmp_n = log_compare(lsnp, &LSN(pagep));
  36. /*
  37.  * Use this when there is something like "pagelsn" in the argp
  38.  * structure.  Sometimes, you might need to compare meta-data
  39.  * lsn's instead.
  40.  *
  41.  * cmp_p = log_compare(&LSN(pagep), argp->pagelsn);
  42.  */
  43. if (cmp_p == 0 && DB_REDO(op)) {
  44. /* Need to redo update described. */
  45. modified = 1;
  46. } else if (cmp_n == 0 && !DB_REDO(op)) {
  47. /* Need to undo update described. */
  48. modified = 1;
  49. }
  50. if (ret = memp_fput(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0))
  51. goto out;
  52. *lsnp = argp->prev_lsn;
  53. ret = 0;
  54. out: REC_CLOSE;
  55. }