#ifndef RIPPLE_APP_REPORTING_BACKENDINTERFACE_H_INCLUDED #define RIPPLE_APP_REPORTING_BACKENDINTERFACE_H_INCLUDED #include #include namespace Backend { using Blob = std::vector; struct LedgerObject { ripple::uint256 key; Blob blob; }; struct LedgerPage { std::vector objects; std::optional cursor; }; struct TransactionAndMetadata { Blob transaction; Blob metadata; }; struct AccountTransactionsCursor { uint32_t ledgerSequence; uint32_t transactionIndex; }; class BackendInterface { public: // read methods virtual std::optional fetchLatestLedgerSequence() const = 0; virtual std::optional fetchLedgerBySequence(uint32_t sequence) const = 0; virtual std::optional fetchLedgerObject(ripple::uint256 const& key, uint32_t sequence) const = 0; // returns a transaction, metadata pair virtual std::optional fetchTransaction(ripple::uint256 const& hash) const = 0; virtual LedgerPage fetchLedgerPage( std::optional const& cursor, std::uint32_t ledgerSequence, std::uint32_t limit) const = 0; // TODO needs to take in a limit, and return a cursor virtual std::vector fetchBookOffers( ripple::uint256 const& book, uint32_t ledgerSequence, std::optional const& cursor = {}) const = 0; virtual std::vector fetchTransactions(std::vector const& hashes) const = 0; virtual std::vector fetchLedgerObjects( std::vector const& keys, uint32_t sequence) const = 0; // TODO needs to take in a limit virtual std::pair< std::vector, std::optional> fetchAccountTransactions( ripple::AccountID const& account, std::optional const& cursor = {}) const = 0; // write methods virtual void writeLedger( ripple::LedgerInfo const& ledgerInfo, std::string&& ledgerHeader, bool isFirst = false) const = 0; virtual void writeLedgerObject( std::string&& key, uint32_t seq, std::string&& blob, bool isCreated, bool isDeleted, std::optional&& book) const = 0; virtual void writeTransaction( std::string&& hash, uint32_t seq, std::string&& transaction, std::string&& metadata) const = 0; virtual void writeAccountTransactions( std::vector&& data) const = 0; // other database methods // Open the database. Set up all of the necessary objects and // datastructures. After this call completes, the database is ready for use. virtual void open() = 0; // Close the database, releasing any resources virtual void close() = 0; virtual void startWrites() const = 0; virtual bool finishWrites() const = 0; virtual ~BackendInterface() { } }; } // namespace Backend using BackendInterface = Backend::BackendInterface; #endif