1#include "db_config.h" 2 3#include "db_int.h" 4#include "dbinc/db_page.h" 5#include "dbinc/__dbreg.h" 6#include "dbinc/log.h" 7 8/* 9 * __dbreg_register_recover -- 10 * Recovery function for register. 11 * 12 * PUBLIC: int __dbreg_register_recover 13 * PUBLIC: __P((env *, DBT *, DB_LSN *, db_recops, void *)); 14 */ 15int 16__dbreg_register_recover(env, dbtp, lsnp, op, info) 17 env *env; 18 DBT *dbtp; 19 DB_LSN *lsnp; 20 db_recops op; 21 void *info; 22{ 23 __dbreg_register_args *argp; 24 DB *file_dbp; 25 DBC *dbc; 26 DB_MPOOLFILE *mpf; 27 DB_THREAD_INFO *ip; 28 PAGE *pagep; 29 int cmp_n, cmp_p, modified, ret; 30 31 ip = ((DB_TXNHEAD *)info)->thread_info; 32 33 REC_PRINT(__dbreg_register_print); 34 REC_INTRO(__dbreg_register_read, ip, 0); 35 36 if ((ret = mpf->get(mpf, &argp->pgno, 0, &pagep)) != 0) 37 if (DB_REDO(op)) { 38 if ((ret = mpf->get(mpf, 39 &argp->pgno, DB_MPOOL_CREATE, &pagep)) != 0) 40 goto out; 41 } else { 42 *lsnp = argp->prev_lsn; 43 ret = 0; 44 goto out; 45 } 46 47 modified = 0; 48 cmp_n = log_compare(lsnp, &LSN(pagep)); 49 50 /* 51 * Use this when there is something like "pagelsn" in the argp 52 * structure. Sometimes, you might need to compare meta-data 53 * lsn's instead. 54 * 55 * cmp_p = log_compare(&LSN(pagep), argp->pagelsn); 56 */ 57 if (cmp_p == 0 && DB_REDO(op)) { 58 /* Need to redo update described. */ 59 modified = 1; 60 } else if (cmp_n == 0 && !DB_REDO(op)) { 61 /* Need to undo update described. */ 62 modified = 1; 63 } 64 if (ret = mpf->put(mpf, pagep, modified ? DB_MPOOL_DIRTY : 0)) 65 goto out; 66 67 *lsnp = argp->prev_lsn; 68 ret = 0; 69 70out: REC_CLOSE; 71} 72 73