size_t LedgerHeaderFrame::copyLedgerHeadersToStream(Database& db, soci::session& sess, uint32_t ledgerSeq, uint32_t ledgerCount, XDROutputFileStream& headersOut) { auto timer = db.getSelectTimer("ledger-header-history"); uint32_t begin = ledgerSeq, end = ledgerSeq + ledgerCount; size_t n = 0; string headerEncoded; assert(begin <= end); soci::statement st = (sess.prepare << "SELECT data FROM ledgerheaders " "WHERE ledgerseq >= :begin AND ledgerseq < :end ORDER " "BY ledgerseq ASC", into(headerEncoded), use(begin), use(end)); st.execute(true); while (st.got_data()) { LedgerHeaderHistoryEntry lhe; LedgerHeaderFrame::pointer lhf = decodeFromData(headerEncoded); lhe.hash = lhf->getHash(); lhe.header = lhf->mHeader; CLOG(DEBUG, "Ledger") << "Streaming ledger-header " << lhe.header.ledgerSeq; headersOut.writeOne(lhe); ++n; st.fetch(); } return n; }
LedgerHeaderFrame::pointer LedgerHeaderFrame::loadByHash(Hash const& hash, Database& db) { LedgerHeaderFrame::pointer lhf; string hash_s(binToHex(hash)); string headerEncoded; auto prep = db.getPreparedStatement("SELECT data FROM ledgerheaders " "WHERE ledgerhash = :h"); auto& st = prep.statement(); st.exchange(into(headerEncoded)); st.exchange(use(hash_s)); st.define_and_bind(); { auto timer = db.getSelectTimer("ledger-header"); st.execute(true); } if (st.got_data()) { lhf = decodeFromData(headerEncoded); if (lhf->getHash() != hash) { // wrong hash lhf.reset(); } } return lhf; }
std::string LedgerManager::ledgerAbbrev(LedgerHeaderFrame::pointer p) { if (!p) { return "[empty]"; } return ledgerAbbrev(p->mHeader, p->getHash()); }