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;
}
Exemple #2
0
    void
    put(BucketEntry const& e)
    {
        if (!mKeepDeadEntries && e.type() == DEADENTRY)
        {
            return;
        }

        // Check to see if there's an existing buffered entry.
        if (mBuf)
        {
            // mCmp(e, *mBuf) means e < *mBuf; this should never be true since
            // it would mean that we're getting entries out of order.
            assert(!mCmp(e, *mBuf));

            // Check to see if the new entry should flush (greater identity), or
            // merely replace (same identity), the buffered entry.
            if (mCmp(*mBuf, e))
            {
                mOut.writeOne(*mBuf, mHasher.get(), &mBytesPut);
                mObjectsPut++;
            }
        }
        else
        {
            mBuf = make_unique<BucketEntry>();
        }

        // In any case, replace *mBuf with e.
        *mBuf = e;
    }
Exemple #3
0
 OutputIterator(std::string const& tmpDir, bool keepDeadEntries)
     : mFilename(randomBucketName(tmpDir))
     , mBuf(nullptr)
     , mHasher(SHA256::create())
     , mKeepDeadEntries(keepDeadEntries)
 {
     CLOG(TRACE, "Bucket")
         << "Bucket::OutputIterator opening file to write: " << mFilename;
     mOut.open(mFilename);
 }
static void
saveTransactionHelper(Database& db, soci::session& sess, uint32 ledgerSeq,
                      TxSetFrame& txSet, TransactionHistoryResultEntry& results,
                      XDROutputFileStream& txOut,
                      XDROutputFileStream& txResultOut)
{
    // prepare the txset for saving
    LedgerHeaderFrame::pointer lh =
        LedgerHeaderFrame::loadBySequence(ledgerSeq, db, sess);
    if (!lh)
    {
        throw std::runtime_error("Could not find ledger");
    }
    txSet.previousLedgerHash() = lh->mHeader.previousLedgerHash;
    txSet.sortForHash();
    TransactionHistoryEntry hist;
    hist.ledgerSeq = ledgerSeq;
    txSet.toXDR(hist.txSet);
    txOut.writeOne(hist);

    txResultOut.writeOne(results);
}
Exemple #5
0
void
genfuzz(std::string const& filename)
{
    Logging::setFmt("<fuzz>");
    size_t n = 8;
    LOG(INFO) << "Writing " << n << "-message random fuzz file " << filename;
    XDROutputFileStream out;
    out.open(filename);
    autocheck::generator<StellarMessage> gen;
    for (size_t i = 0; i < n; ++i)
    {
        try
        {
            StellarMessage m(gen(10));
            out.writeOne(m);
            LOG(INFO) << "Message " << i << ": " << msgSummary(m);
        }
        catch (xdr::xdr_bad_discriminant const&)
        {
            LOG(INFO) << "Message " << i << ": malformed, omitted";
        }
    }
}
Exemple #6
0
    std::shared_ptr<Bucket>
    getBucket(BucketManager& bucketManager)
    {
        assert(mOut);
        if (mBuf)
        {
            mOut.writeOne(*mBuf, mHasher.get(), &mBytesPut);
            mObjectsPut++;
            mBuf.reset();
        }

        mOut.close();
        if (mObjectsPut == 0 || mBytesPut == 0)
        {
            assert(mObjectsPut == 0);
            assert(mBytesPut == 0);
            CLOG(DEBUG, "Bucket") << "Deleting empty bucket file " << mFilename;
            std::remove(mFilename.c_str());
            return std::make_shared<Bucket>();
        }
        return bucketManager.adoptFileAsBucket(mFilename, mHasher->finish(),
                                               mObjectsPut, mBytesPut);
    }