#pragma once #include #include #include #include #include #include #include namespace DB { class StorageFileBlockInputStream; class StorageFileBlockOutputStream; class StorageFile : public ext::shared_ptr_helper, public IStorage { friend struct ext::shared_ptr_helper; public: std::string getName() const override { return "File"; } 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 rename(const String & new_path_to_table_data, const String & new_database_name, const String & new_table_name, TableStructureWriteLockHolder &) override; Strings getDataPaths() const override; struct CommonArguments { const StorageID & table_id; const std::string & format_name; const ColumnsDescription & columns; const ConstraintsDescription & constraints; const Context & context; const std::string & compression_method; }; protected: friend class StorageFileBlockInputStream; friend class StorageFileBlockOutputStream; /// From file descriptor StorageFile(int table_fd_, CommonArguments args); /// From user's file StorageFile(const std::string & table_path_, const std::string & user_files_absolute_path, CommonArguments args); /// From table in database StorageFile(const std::string & relative_table_dir_path, CommonArguments args); private: explicit StorageFile(CommonArguments args); std::string format_name; const Context & context_global; int table_fd = -1; String compression_method; std::vector paths; bool is_db_table = true; /// Table is stored in real database, not user's file bool use_table_fd = false; /// Use table_fd instead of path std::atomic table_fd_was_used{false}; /// To detect repeating reads from stdin off_t table_fd_init_offset = -1; /// Initial position of fd, used for repeating reads mutable std::shared_mutex rwlock; Logger * log = &Logger::get("StorageFile"); }; }