3 #ifndef NO_SYSTEM_INCLUDES
17 #define LOG_CURSOR_HIT -1000
20 * __vi_marker_recover --
21 * Recovery function for marker.
23 * PUBLIC: int __vi_marker_recover
24 * PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
27 __vi_marker_recover(dbenv
, dbtp
, lsnp
, op
, info
)
34 __vi_marker_args
*argp
;
37 REC_PRINT(__vi_marker_print
);
38 REC_NOOP_INTRO(__vi_marker_read
);
40 *lsnp
= argp
->prev_lsn
;
47 * __vi_cursor_recover --
48 * Recovery function for cursor.
50 * PUBLIC: int __vi_cursor_recover
51 * PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
54 __vi_cursor_recover(dbenv
, dbtp
, lsnp
, op
, info
)
61 __vi_cursor_args
*argp
;
65 REC_PRINT(__vi_cursor_print
);
66 REC_NOOP_INTRO(__vi_cursor_read
);
68 sp
= (SCR
*)dbenv
->app_private
;
70 *lsnp
= argp
->prev_lsn
;
71 ret
= argp
->opcode
== (DB_UNDO(op
) ? LOG_CURSOR_INIT
: LOG_CURSOR_END
)
74 sp
->state
.pos
.lno
= argp
->lno
;
75 sp
->state
.pos
.cno
= argp
->cno
;
82 * __vi_mark_recover --
83 * Recovery function for mark.
85 * PUBLIC: int __vi_mark_recover
86 * PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
89 __vi_mark_recover(dbenv
, dbtp
, lsnp
, op
, info
)
101 REC_PRINT(__vi_mark_print
);
102 REC_NOOP_INTRO(__vi_mark_read
);
104 sp
= (SCR
*)dbenv
->app_private
;
105 *lsnp
= argp
->prev_lsn
;
106 m
.lno
= argp
->lmp
.lno
;
107 m
.cno
= argp
->lmp
.cno
;
108 ret
= mark_set(sp
, argp
->lmp
.name
, &m
, 0);
114 * __vi_change_recover --
115 * Recovery function for change.
117 * PUBLIC: int __vi_change_recover
118 * PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
121 __vi_change_recover(dbenv
, dbtp
, lsnp
, op
, info
)
128 __vi_change_args
*argp
;
132 REC_PRINT(__vi_change_print
);
133 REC_NOOP_INTRO(__vi_change_read
);
137 sp
= (SCR
*)dbenv
->app_private
;
138 if (DB_UNDO(op
) != (argp
->opcode
& 1))
139 switch (argp
->opcode
) {
140 case LOG_LINE_RESET_B
:
141 case LOG_LINE_RESET_F
:
142 ret
= line_insdel(sp
, LINE_RESET
, argp
->lno
);
143 ret
= scr_update(sp
, argp
->lno
, LINE_RESET
, 1) || ret
;
145 case LOG_LINE_APPEND_B
:
146 case LOG_LINE_DELETE_F
:
147 ret
= line_insdel(sp
, LINE_DELETE
, argp
->lno
);
148 ret
= scr_update(sp
, argp
->lno
, LINE_DELETE
, 1) || ret
;
150 case LOG_LINE_DELETE_B
:
151 case LOG_LINE_APPEND_F
:
152 ret
= line_insdel(sp
, LINE_INSERT
, argp
->lno
);
153 ret
= scr_update(sp
, argp
->lno
, LINE_INSERT
, 1) || ret
;
157 *lsnp
= argp
->prev_lsn
;
164 * PUBLIC: int __vi_log_truncate __P((EXF *ep));
167 __vi_log_truncate(EXF
*ep
)
172 return __log_vtruncate(ep
->env
, &ep
->lsn_cur
, &ckplsn
);
173 /*return __log_vtruncate(ep->env, &ep->lsn_cur, &ep->lsn_first);*/
178 * PUBLIC: int __vi_log_dispatch __P((DB_ENV *dbenv, DBT *data, DB_LSN *lsn, db_recops ops));
181 __vi_log_dispatch(DB_ENV
*dbenv
, DBT
*data
, DB_LSN
*lsn
, db_recops ops
)
186 memcpy(&rectype
, data
->data
, sizeof(rectype
));
187 snprintf(s
,100,"%d\n", rectype
);
188 return dbenv
->dtab
[rectype
](dbenv
, data
, lsn
, ops
, NULL
);
192 vi_log_get(SCR
*sp
, DB_LOGC
*logc
, DBT
*data
, u_int32_t which
)
201 BINC_GOTO(sp
, sp
->wp
->l_lp
, sp
->wp
->l_len
, nlen
);
202 memset(data
, 0, sizeof(*data
));
203 data
->data
= sp
->wp
->l_lp
;
204 data
->ulen
= sp
->wp
->l_len
;
205 data
->flags
= DB_DBT_USERMEM
;
206 switch ((sp
->db_error
= logc
->get(logc
, &ep
->lsn_cur
, data
, which
))) {
212 msgq(sp
, M_DBERR
, "logc->get");
223 * PUBLIC: int __vi_log_traverse __P((SCR *sp, db_recops ops, MARK *));
226 __vi_log_traverse(SCR
*sp
, db_recops ops
, MARK
*rp
)
237 F_SET(ep
, F_NOLOG
); /* Turn off logging. */
239 ep
->env
->app_private
= sp
;
240 if ((sp
->db_error
= ep
->env
->log_cursor(ep
->env
, &logc
, 0))
242 msgq(sp
, M_DBERR
, "env->log_cursor");
245 if (vi_log_get(sp
, logc
, &data
, DB_SET
))
247 if (ops
== DB_TXN_BACKWARD_ROLL
) {
251 if (vi_log_get(sp
, logc
, &data
, DB_NEXT
))
256 MEMCPY(&lsn
, &ep
->lsn_cur
, 1);
257 ret
= __vi_log_dispatch(ep
->env
, &data
, &lsn
, ops
);
259 if (ret
== LOG_CURSOR_HIT
)
263 if (vi_log_get(sp
, logc
, &data
, which
))
266 if (ops
== DB_TXN_BACKWARD_ROLL
)
267 if (vi_log_get(sp
, logc
, &data
, DB_PREV
))
270 logc
->close(logc
, 0);
272 ep
->env
->app_private
= NULL
;
274 MEMMOVE(rp
, &sp
->state
.pos
, 1);
282 vi_db_init_recover(DB_ENV
*dbenv
)
286 if ((ret
= __db_init_recover(dbenv
)) != 0)
288 if ((ret
= __bam_init_recover(dbenv
)) != 0)