/* * __txn_op_log -- * Log an operation for the current transaction. */ static int __txn_op_log(WT_SESSION_IMPL *session, WT_ITEM *logrec, WT_TXN_OP *op, WT_CURSOR_BTREE *cbt) { WT_DECL_RET; WT_ITEM key, value; WT_UPDATE *upd; uint64_t recno; WT_CLEAR(key); upd = op->u.upd; value.data = WT_UPDATE_DATA(upd); value.size = upd->size; /* * Log the operation. It must be one of the following: * 1) column store remove; * 2) column store insert/update; * 3) row store remove; or * 4) row store insert/update. */ if (cbt->btree->type == BTREE_ROW) { WT_ERR(__wt_cursor_row_leaf_key(cbt, &key)); if (WT_UPDATE_DELETED_ISSET(upd)) WT_ERR(__wt_logop_row_remove_pack(session, logrec, op->fileid, &key)); else WT_ERR(__wt_logop_row_put_pack(session, logrec, op->fileid, &key, &value)); } else { recno = WT_INSERT_RECNO(cbt->ins); WT_ASSERT(session, recno != WT_RECNO_OOB); if (WT_UPDATE_DELETED_ISSET(upd)) WT_ERR(__wt_logop_col_remove_pack(session, logrec, op->fileid, recno)); else WT_ERR(__wt_logop_col_put_pack(session, logrec, op->fileid, recno, &value)); } err: __wt_buf_free(session, &key); return (ret); }
/* * __txn_op_log -- * Log an operation for the current transaction. */ static int __txn_op_log(WT_SESSION_IMPL *session, WT_ITEM *logrec, WT_TXN_OP *op) { WT_ITEM value; uint64_t recno; value.data = WT_UPDATE_DATA(op->u.op.upd); value.size = op->u.op.upd->size; /* * Log the operation. It must be one of the following: * 1) column store remove; * 2) column store insert/update; * 3) row store remove; or * 4) row store insert/update. */ if (op->u.op.key.data == NULL) { WT_ASSERT(session, op->u.op.ins != NULL); recno = op->u.op.ins->u.recno; if (WT_UPDATE_DELETED_ISSET(op->u.op.upd)) WT_RET(__wt_logop_col_remove_pack(session, logrec, op->fileid, recno)); else WT_RET(__wt_logop_col_put_pack(session, logrec, op->fileid, recno, &value)); } else { if (WT_UPDATE_DELETED_ISSET(op->u.op.upd)) WT_RET(__wt_logop_row_remove_pack(session, logrec, op->fileid, &op->u.op.key)); else WT_RET(__wt_logop_row_put_pack(session, logrec, op->fileid, &op->u.op.key, &value)); } return (0); }
/* * __txn_op_log -- * Log an operation for the current transaction. */ static int __txn_op_log(WT_SESSION_IMPL *session, WT_ITEM *logrec, WT_TXN_OP *op, WT_CURSOR_BTREE *cbt) { WT_CURSOR *cursor; WT_ITEM value; WT_UPDATE *upd; uint64_t recno; cursor = &cbt->iface; upd = op->u.upd; value.data = upd->data; value.size = upd->size; /* * Log the row- or column-store insert, modify, remove or update. Our * caller doesn't log reserve operations, we shouldn't see them here. */ if (cbt->btree->type == BTREE_ROW) { #ifdef HAVE_DIAGNOSTIC __txn_op_log_row_key_check(session, cbt); #endif switch (upd->type) { case WT_UPDATE_DELETED: WT_RET(__wt_logop_row_remove_pack( session, logrec, op->fileid, &cursor->key)); break; case WT_UPDATE_MODIFIED: WT_RET(__wt_logop_row_modify_pack( session, logrec, op->fileid, &cursor->key, &value)); break; case WT_UPDATE_STANDARD: WT_RET(__wt_logop_row_put_pack( session, logrec, op->fileid, &cursor->key, &value)); break; WT_ILLEGAL_VALUE(session); } } else { recno = WT_INSERT_RECNO(cbt->ins); WT_ASSERT(session, recno != WT_RECNO_OOB); switch (upd->type) { case WT_UPDATE_DELETED: WT_RET(__wt_logop_col_remove_pack( session, logrec, op->fileid, recno)); break; case WT_UPDATE_MODIFIED: WT_RET(__wt_logop_col_modify_pack( session, logrec, op->fileid, recno, &value)); break; case WT_UPDATE_STANDARD: WT_RET(__wt_logop_col_put_pack( session, logrec, op->fileid, recno, &value)); break; WT_ILLEGAL_VALUE(session); } } return (0); }