//===----------------------------------------------------------------------===// // DuckDB // // duckdb/storage/checkpoint/string_checkpoint_state.hpp // // //===----------------------------------------------------------------------===// #pragma once #include "duckdb/common/common.hpp" #include "duckdb/storage/storage_info.hpp" #include "duckdb/storage/buffer/block_handle.hpp" #include "duckdb/function/compression_function.hpp" namespace duckdb { class OverflowStringWriter { public: virtual ~OverflowStringWriter() { } virtual void WriteString(string_t string, block_id_t &result_block, int32_t &result_offset) = 0; }; struct StringBlock { shared_ptr block; idx_t offset; idx_t size; unique_ptr next; }; struct string_location_t { string_location_t(block_id_t block_id, int32_t offset) : block_id(block_id), offset(offset) { } string_location_t() { } bool IsValid() { return offset < Storage::BLOCK_SIZE && (block_id == INVALID_BLOCK || block_id >= MAXIMUM_BLOCK); } block_id_t block_id; int32_t offset; }; struct UncompressedStringSegmentState : public CompressedSegmentState { ~UncompressedStringSegmentState(); //! The string block holding strings that do not fit in the main block //! FIXME: this should be replaced by a heap that also allows freeing of unused strings unique_ptr head; //! Overflow string writer (if any), if not set overflow strings will be written to memory blocks unique_ptr overflow_writer; //! Map of block id to string block unordered_map overflow_blocks; }; } // namespace duckdb