📄 log.c
字号:
key.data = &ep->l_cur; key.size = sizeof(recno_t); data.data = ep->l_lp; data.size = sizeof(u_char) + sizeof(LMARK); if (ep->log->put(ep->log, &key, &data, 0) == -1) LOG_ERR;#if defined(DEBUG) && 0 TRACE(sp, "%lu: mark %c: %lu/%u\n", ep->l_cur, lmp->name, lmp->lno, lmp->cno);#endif /* Reset high water mark. */ ep->l_high = ++ep->l_cur; return (0);}/* * Log_backward -- * Roll the log backward one operation. */intlog_backward(sp, ep, rp) SCR *sp; EXF *ep; MARK *rp;{ DBT key, data; LMARK lm; MARK m; recno_t lno; int didop; u_char *p; if (F_ISSET(ep, F_NOLOG)) { msgq(sp, M_ERR, "Logging not being performed, undo not possible."); return (1); } if (ep->l_cur == 1) { msgq(sp, M_BERR, "No changes to undo."); return (1); } F_SET(ep, F_NOLOG); /* Turn off logging. */ key.data = &ep->l_cur; /* Initialize db request. */ key.size = sizeof(recno_t); for (didop = 0;;) { --ep->l_cur; if (ep->log->get(ep->log, &key, &data, 0)) LOG_ERR;#if defined(DEBUG) && 0 log_trace(sp, "log_backward", ep->l_cur, data.data);#endif switch (*(p = (u_char *)data.data)) { case LOG_CURSOR_INIT: if (didop) { memmove(rp, p + sizeof(u_char), sizeof(MARK)); F_CLR(ep, F_NOLOG); return (0); } break; case LOG_CURSOR_END: break; case LOG_LINE_APPEND: case LOG_LINE_INSERT: didop = 1; memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); if (file_dline(sp, ep, lno)) goto err; ++sp->rptlines[L_DELETED]; break; case LOG_LINE_DELETE: didop = 1; memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); if (file_iline(sp, ep, lno, p + sizeof(u_char) + sizeof(recno_t), data.size - sizeof(u_char) - sizeof(recno_t))) goto err; ++sp->rptlines[L_ADDED]; break; case LOG_LINE_RESET_F: break; case LOG_LINE_RESET_B: didop = 1; memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); if (file_sline(sp, ep, lno, p + sizeof(u_char) + sizeof(recno_t), data.size - sizeof(u_char) - sizeof(recno_t))) goto err; ++sp->rptlines[L_CHANGED]; break; case LOG_MARK: didop = 1; memmove(&lm, p + sizeof(u_char), sizeof(LMARK)); m.lno = lm.lno; m.cno = lm.cno; if (mark_set(sp, ep, lm.name, &m, 0)) goto err; break; default: abort(); } }err: F_CLR(ep, F_NOLOG); return (1);}/* * Log_setline -- * Reset the line to its original appearance. * * XXX * There's a bug in this code due to our not logging cursor movements * unless a change was made. If you do a change, move off the line, * then move back on and do a 'U', the line will be restored to the way * it was before the original change. */intlog_setline(sp, ep) SCR *sp; EXF *ep;{ DBT key, data; LMARK lm; MARK m; recno_t lno; u_char *p; if (F_ISSET(ep, F_NOLOG)) { msgq(sp, M_ERR, "Logging not being performed, undo not possible."); return (1); } if (ep->l_cur == 1) return (1); F_SET(ep, F_NOLOG); /* Turn off logging. */ key.data = &ep->l_cur; /* Initialize db request. */ key.size = sizeof(recno_t); for (;;) { --ep->l_cur; if (ep->log->get(ep->log, &key, &data, 0)) LOG_ERR;#if defined(DEBUG) && 0 log_trace(sp, "log_setline", ep->l_cur, data.data);#endif switch (*(p = (u_char *)data.data)) { case LOG_CURSOR_INIT: memmove(&m, p + sizeof(u_char), sizeof(MARK)); if (m.lno != sp->lno || ep->l_cur == 1) { F_CLR(ep, F_NOLOG); return (0); } break; case LOG_CURSOR_END: memmove(&m, p + sizeof(u_char), sizeof(MARK)); if (m.lno != sp->lno) { ++ep->l_cur; F_CLR(ep, F_NOLOG); return (0); } break; case LOG_LINE_APPEND: case LOG_LINE_INSERT: case LOG_LINE_DELETE: case LOG_LINE_RESET_F: break; case LOG_LINE_RESET_B: memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); if (lno == sp->lno && file_sline(sp, ep, lno, p + sizeof(u_char) + sizeof(recno_t), data.size - sizeof(u_char) - sizeof(recno_t))) goto err; ++sp->rptlines[L_CHANGED]; case LOG_MARK: memmove(&lm, p + sizeof(u_char), sizeof(LMARK)); m.lno = lm.lno; m.cno = lm.cno; if (mark_set(sp, ep, lm.name, &m, 0)) goto err; break; default: abort(); } }err: F_CLR(ep, F_NOLOG); return (1);}/* * Log_forward -- * Roll the log forward one operation. */intlog_forward(sp, ep, rp) SCR *sp; EXF *ep; MARK *rp;{ DBT key, data; LMARK lm; MARK m; recno_t lno; int didop; u_char *p; if (F_ISSET(ep, F_NOLOG)) { msgq(sp, M_ERR, "Logging not being performed, roll-forward not possible."); return (1); } if (ep->l_cur == ep->l_high) { msgq(sp, M_BERR, "No changes to re-do."); return (1); } F_SET(ep, F_NOLOG); /* Turn off logging. */ key.data = &ep->l_cur; /* Initialize db request. */ key.size = sizeof(recno_t); for (didop = 0;;) { ++ep->l_cur; if (ep->log->get(ep->log, &key, &data, 0)) LOG_ERR;#if defined(DEBUG) && 0 log_trace(sp, "log_forward", ep->l_cur, data.data);#endif switch (*(p = (u_char *)data.data)) { case LOG_CURSOR_END: if (didop) { ++ep->l_cur; memmove(rp, p + sizeof(u_char), sizeof(MARK)); F_CLR(ep, F_NOLOG); return (0); } break; case LOG_CURSOR_INIT: break; case LOG_LINE_APPEND: case LOG_LINE_INSERT: didop = 1; memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); if (file_iline(sp, ep, lno, p + sizeof(u_char) + sizeof(recno_t), data.size - sizeof(u_char) - sizeof(recno_t))) goto err; ++sp->rptlines[L_ADDED]; break; case LOG_LINE_DELETE: didop = 1; memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); if (file_dline(sp, ep, lno)) goto err; ++sp->rptlines[L_DELETED]; break; case LOG_LINE_RESET_B: break; case LOG_LINE_RESET_F: didop = 1; memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); if (file_sline(sp, ep, lno, p + sizeof(u_char) + sizeof(recno_t), data.size - sizeof(u_char) - sizeof(recno_t))) goto err; ++sp->rptlines[L_CHANGED]; break; case LOG_MARK: didop = 1; memmove(&lm, p + sizeof(u_char), sizeof(LMARK)); m.lno = lm.lno; m.cno = lm.cno; if (mark_set(sp, ep, lm.name, &m, 0)) goto err; break; default: abort(); } }err: F_CLR(ep, F_NOLOG); return (1);}#if defined(DEBUG) && 0static voidlog_trace(sp, msg, rno, p) SCR *sp; char *msg; recno_t rno; u_char *p;{ LMARK lm; MARK m; recno_t lno; switch (*p) { case LOG_CURSOR_INIT: memmove(&m, p + sizeof(u_char), sizeof(MARK)); TRACE(sp, "%lu: %s: C_INIT: %u/%u\n", rno, msg, m.lno, m.cno); break; case LOG_CURSOR_END: memmove(&m, p + sizeof(u_char), sizeof(MARK)); TRACE(sp, "%lu: %s: C_END: %u/%u\n", rno, msg, m.lno, m.cno); break; case LOG_LINE_APPEND: memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); TRACE(sp, "%lu: %s: APPEND: %lu\n", rno, msg, lno); break; case LOG_LINE_INSERT: memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); TRACE(sp, "%lu: %s: INSERT: %lu\n", rno, msg, lno); break; case LOG_LINE_DELETE: memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); TRACE(sp, "%lu: %s: DELETE: %lu\n", rno, msg, lno); break; case LOG_LINE_RESET_F: memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); TRACE(sp, "%lu: %s: RESET_F: %lu\n", rno, msg, lno); break; case LOG_LINE_RESET_B: memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); TRACE(sp, "%lu: %s: RESET_B: %lu\n", rno, msg, lno); break; case LOG_MARK: memmove(&lm, p + sizeof(u_char), sizeof(LMARK)); TRACE(sp, "%lu: %s: MARK: %u/%u\n", rno, msg, lm.lno, lm.cno); break; default: abort(); }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -