//===----------------------------------------------------------------------===// // DuckDB // // duckdb/transaction/undo_buffer.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/common/common.hpp" #include "duckdb/common/enums/undo_flags.hpp" #include "duckdb/storage/arena_allocator.hpp" namespace duckdb { class WriteAheadLog; //! The undo buffer of a transaction is used to hold previous versions of tuples //! that might be required in the future (because of rollbacks or previous //! transactions accessing them) class UndoBuffer { public: struct IteratorState { ArenaChunk *current; data_ptr_t start; data_ptr_t end; }; public: UndoBuffer(ClientContext &context); //! Reserve space for an entry of the specified type and length in the undo //! buffer data_ptr_t CreateEntry(UndoFlags type, idx_t len); bool ChangesMade(); idx_t EstimatedSize(); //! Cleanup the undo buffer void Cleanup(); //! Commit the changes made in the UndoBuffer: should be called on commit void Commit(UndoBuffer::IteratorState &iterator_state, optional_ptr log, transaction_t commit_id); //! Revert committed changes made in the UndoBuffer up until the currently committed state void RevertCommit(UndoBuffer::IteratorState &iterator_state, transaction_t transaction_id); //! Rollback the changes made in this UndoBuffer: should be called on //! rollback void Rollback() noexcept; private: ClientContext &context; ArenaAllocator allocator; private: template void IterateEntries(UndoBuffer::IteratorState &state, T &&callback); template void IterateEntries(UndoBuffer::IteratorState &state, UndoBuffer::IteratorState &end_state, T &&callback); template void ReverseIterateEntries(T &&callback); }; } // namespace duckdb