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