// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). #pragma once #include #include "file/sequence_file_reader.h" namespace ROCKSDB_NAMESPACE { // A wrapper on top of Env::SequentialFile for reading text lines from a file. // Lines are delimited by '\n'. The last line may or may not include a // trailing newline. Uses SequentialFileReader internally. class LineFileReader { private: std::array buf_; SequentialFileReader sfr_; IOStatus io_status_; const char* buf_begin_ = buf_.data(); const char* buf_end_ = buf_.data(); size_t line_number_ = 0; bool at_eof_ = false; public: // See SequentialFileReader constructors template explicit LineFileReader(Args&&... args) : sfr_(std::forward(args)...) {} static IOStatus Create(const std::shared_ptr& fs, const std::string& fname, const FileOptions& file_opts, std::unique_ptr* reader, IODebugContext* dbg); LineFileReader(const LineFileReader&) = delete; LineFileReader& operator=(const LineFileReader&) = delete; // Reads another line from the file, returning true on success and saving // the line to `out`, without delimiter, or returning false on failure. You // must check GetStatus() to determine whether the failure was just // end-of-file (OK status) or an I/O error (another status). bool ReadLine(std::string* out); // Returns the number of the line most recently returned from ReadLine. // Return value is unspecified if ReadLine has returned false due to // I/O error. After ReadLine returns false due to end-of-file, return // value is the last returned line number, or equivalently the total // number of lines returned. size_t GetLineNumber() const { return line_number_; } // Returns any error encountered during read. The error is considered // permanent and no retry or recovery is attempted with the same // LineFileReader. const IOStatus& GetStatus() const { return io_status_; } }; } // namespace ROCKSDB_NAMESPACE