/* * Copyright (C) 2018-present ScyllaDB */ /* * SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0 */ #pragma once #include "exceptions.hh" #include #include #include #include #include #include #include #include "seastarx.hh" #include "sstables/checksum_utils.hh" namespace sstables { class random_access_reader { std::unique_ptr > _in; protected: virtual input_stream open_at(uint64_t pos) = 0; void set(input_stream in) { parse_assert(!_in); _in = std::make_unique>(std::move(in)); } public: virtual future > read_exactly(size_t n) noexcept; virtual future<> seek(uint64_t pos) noexcept; bool eof() const noexcept { return _in->eof(); } virtual future<> close() noexcept; virtual ~random_access_reader() {} }; class file_random_access_reader : public random_access_reader { file _file; size_t _buffer_size; unsigned _read_ahead; protected: uint64_t _file_size; public: virtual input_stream open_at(uint64_t pos) override; explicit file_random_access_reader(file f, uint64_t file_size, size_t buffer_size = 8192, unsigned read_ahead = 4); virtual future<> close() noexcept override; }; class digest_file_random_access_reader : public file_random_access_reader { std::optional _digest; uint64_t _pos = 0; public: digest_file_random_access_reader(file f, uint64_t file_size, size_t buffer_size = 8192, unsigned read_ahead = 4); virtual future> read_exactly(size_t n) noexcept override; virtual future<> seek(uint64_t pos) noexcept override; std::optional digest() const noexcept { if (_pos != _file_size) { return std::nullopt; } return _digest; } }; }