#pragma once #include #include #include #include #include namespace DB { /** Implements storage in the RAM. * Suitable for temporary data. * It does not support keys. * Data is stored as a set of blocks and is not stored anywhere else. */ class StorageMemory : public ext::shared_ptr_helper, public IStorage { friend class MemoryBlockInputStream; friend class MemoryBlockOutputStream; friend struct ext::shared_ptr_helper; public: String getName() const override { return "Memory"; } size_t getSize() const { return data.size(); } BlockInputStreams read( const Names & column_names, const SelectQueryInfo & query_info, const Context & context, QueryProcessingStage::Enum processed_stage, size_t max_block_size, unsigned num_streams) override; BlockOutputStreamPtr write(const ASTPtr & query, const Context & context) override; void drop(TableStructureWriteLockHolder &) override; void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; private: /// The data itself. `list` - so that when inserted to the end, the existing iterators are not invalidated. BlocksList data; std::mutex mutex; protected: StorageMemory(const StorageID & table_id_, ColumnsDescription columns_description_, ConstraintsDescription constraints_); }; }