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 if (sp
->state
.undo
== UNDO_SETLINE
) {
72 /* Why the check for ep->l_cur ? (copied from log.c)
74 ret
= (argp
->lno
!= sp
->lno
||
75 (argp
->opcode
== LOG_CURSOR_INIT
&& sp
->ep
->l_cur
== 1))
80 (DB_UNDO(op
) ? LOG_CURSOR_INIT
: LOG_CURSOR_END
)
83 sp
->state
.pos
.lno
= argp
->lno
;
84 sp
->state
.pos
.cno
= argp
->cno
;
92 * __vi_mark_recover --
93 * Recovery function for mark.
95 * PUBLIC: int __vi_mark_recover
96 * PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
99 __vi_mark_recover(dbenv
, dbtp
, lsnp
, op
, info
)
106 __vi_mark_args
*argp
;
111 REC_PRINT(__vi_mark_print
);
112 REC_NOOP_INTRO(__vi_mark_read
);
114 sp
= (SCR
*)dbenv
->app_private
;
115 *lsnp
= argp
->prev_lsn
;
116 m
.lno
= argp
->lmp
.lno
;
117 m
.cno
= argp
->lmp
.cno
;
118 ret
= mark_set(sp
, argp
->lmp
.name
, &m
, 0);
124 * __vi_change_recover --
125 * Recovery function for change.
127 * PUBLIC: int __vi_change_recover
128 * PUBLIC: __P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
131 __vi_change_recover(dbenv
, dbtp
, lsnp
, op
, info
)
138 __vi_change_args
*argp
;
142 REC_PRINT(__vi_change_print
);
143 REC_NOOP_INTRO(__vi_change_read
);
147 sp
= (SCR
*)dbenv
->app_private
;
148 if (DB_UNDO(op
) != (argp
->opcode
& 1))
149 switch (argp
->opcode
) {
150 case LOG_LINE_RESET_B
:
151 case LOG_LINE_RESET_F
:
152 ret
= line_insdel(sp
, LINE_RESET
, argp
->lno
);
153 update_cache(sp
, LINE_RESET
, argp
->lno
);
154 ret
= scr_update(sp
, argp
->lno
, LINE_RESET
, 1) || ret
;
156 case LOG_LINE_APPEND_B
:
157 case LOG_LINE_DELETE_F
:
158 ret
= line_insdel(sp
, LINE_DELETE
, argp
->lno
);
159 update_cache(sp
, LINE_DELETE
, argp
->lno
);
160 ret
= scr_update(sp
, argp
->lno
, LINE_DELETE
, 1) || ret
;
162 case LOG_LINE_DELETE_B
:
163 case LOG_LINE_APPEND_F
:
164 ret
= line_insdel(sp
, LINE_INSERT
, argp
->lno
);
165 update_cache(sp
, LINE_INSERT
, argp
->lno
);
166 ret
= scr_update(sp
, argp
->lno
, LINE_INSERT
, 1) || ret
;
170 *lsnp
= argp
->prev_lsn
;
177 * PUBLIC: int __vi_log_truncate __P((EXF *ep));
180 __vi_log_truncate(EXF
*ep
)
185 return __log_vtruncate(ep
->env
, &ep
->lsn_cur
, &ckplsn
);
186 /*return __log_vtruncate(ep->env, &ep->lsn_cur, &ep->lsn_first);*/
191 * PUBLIC: int __vi_log_dispatch __P((DB_ENV *dbenv, DBT *data, DB_LSN *lsn, db_recops ops));
194 __vi_log_dispatch(DB_ENV
*dbenv
, DBT
*data
, DB_LSN
*lsn
, db_recops ops
)
199 memcpy(&rectype
, data
->data
, sizeof(rectype
));
200 snprintf(s
,100,"%d\n", rectype
);
201 return dbenv
->dtab
[rectype
](dbenv
, data
, lsn
, ops
, NULL
);
205 vi_log_get(SCR
*sp
, DB_LOGC
*logc
, DBT
*data
, u_int32_t which
)
214 BINC_GOTO(sp
, sp
->wp
->l_lp
, sp
->wp
->l_len
, nlen
);
215 memset(data
, 0, sizeof(*data
));
216 data
->data
= sp
->wp
->l_lp
;
217 data
->ulen
= sp
->wp
->l_len
;
218 data
->flags
= DB_DBT_USERMEM
;
219 switch ((sp
->db_error
= logc
->get(logc
, &ep
->lsn_cur
, data
, which
))) {
225 msgq(sp
, M_DBERR
, "logc->get");
236 * PUBLIC: int __vi_log_traverse __P((SCR *sp, undo_t undo, MARK *));
239 __vi_log_traverse(SCR
*sp
, undo_t undo
, MARK
*rp
)
251 F_SET(ep
, F_NOLOG
); /* Turn off logging. */
253 sp
->state
.undo
= undo
;
254 ep
->env
->app_private
= sp
;
255 if ((sp
->db_error
= ep
->env
->log_cursor(ep
->env
, &logc
, 0))
257 msgq(sp
, M_DBERR
, "env->log_cursor");
260 if (vi_log_get(sp
, logc
, &data
, DB_SET
))
262 if (undo
== UNDO_FORWARD
) {
263 ops
= DB_TXN_FORWARD_ROLL
;
265 if (vi_log_get(sp
, logc
, &data
, DB_NEXT
))
268 ops
= DB_TXN_BACKWARD_ROLL
;
273 MEMCPY(&lsn
, &ep
->lsn_cur
, 1);
274 ret
= __vi_log_dispatch(ep
->env
, &data
, &lsn
, ops
);
276 if (ret
== LOG_CURSOR_HIT
)
280 if (vi_log_get(sp
, logc
, &data
, which
))
282 if (undo
== UNDO_SETLINE
&&
283 log_compare(&ep
->lsn_cur
, &ep
->lsn_first
) <= 0) {
284 /* Move to previous record without dispatching. */
285 undo
= UNDO_BACKWARD
;
289 if (undo
== UNDO_BACKWARD
)
290 if (vi_log_get(sp
, logc
, &data
, DB_PREV
))
293 logc
->close(logc
, 0);
295 ep
->env
->app_private
= NULL
;
297 MEMMOVE(rp
, &sp
->state
.pos
, 1);
305 vi_db_init_recover(DB_ENV
*dbenv
)
309 if ((ret
= __db_init_recover(dbenv
)) != 0)
311 if ((ret
= __bam_init_recover(dbenv
)) != 0)