本文整理汇总了C++中LedgerDelta类的典型用法代码示例。如果您正苦于以下问题:C++ LedgerDelta类的具体用法?C++ LedgerDelta怎么用?C++ LedgerDelta使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了LedgerDelta类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: mOuterDelta
LedgerDelta::LedgerDelta(LedgerDelta& outerDelta)
: mOuterDelta(&outerDelta)
, mHeader(&outerDelta.getHeader())
, mCurrentHeader(outerDelta.getHeader())
, mPreviousHeaderValue(outerDelta.getHeader())
{
}
示例2: has
void
LedgerManagerImpl::closeLedgerHelper(LedgerDelta const& delta)
{
delta.markMeters(mApp);
mApp.getBucketManager().addBatch(mApp, mCurrentLedger->mHeader.ledgerSeq,
delta.getLiveEntries(),
delta.getDeadEntries());
mApp.getBucketManager().snapshotLedger(mCurrentLedger->mHeader);
mCurrentLedger->storeInsert(*this);
mApp.getPersistentState().setState(PersistentState::kLastClosedLedger,
binToHex(mCurrentLedger->getHash()));
// Store the current HAS in the database; this is really just to checkpoint
// the bucketlist so we can survive a restart and re-attach to the buckets.
HistoryArchiveState has(mCurrentLedger->mHeader.ledgerSeq,
mApp.getBucketManager().getBucketList());
// We almost always want to try to resolve completed merges to single
// buckets, as it makes restarts less fragile: fewer saved/restored shadows,
// fewer buckets for the user to accidentally delete from their buckets
// dir. But we support the option of not-doing so, only for the sake of
// testing. Note: this is nonblocking in any case.
if (!mApp.getConfig().ARTIFICIALLY_PESSIMIZE_MERGES_FOR_TESTING)
{
has.resolveAnyReadyFutures();
}
mApp.getPersistentState().setState(PersistentState::kHistoryArchiveState,
has.toString());
advanceLedgerPointers();
}
示例3: flushCachedEntry
void
AccountFrame::storeDelete(LedgerDelta& delta, Database& db,
LedgerKey const& key)
{
flushCachedEntry(key, db);
std::string actIDStrKey = PubKeyUtils::toStrKey(key.account().accountID);
{
auto timer = db.getDeleteTimer("account");
auto prep = db.getPreparedStatement(
"DELETE from accounts where accountid= :v1");
auto& st = prep.statement();
st.exchange(soci::use(actIDStrKey));
st.define_and_bind();
st.execute(true);
}
{
auto timer = db.getDeleteTimer("signer");
auto prep =
db.getPreparedStatement("DELETE from signers where accountid= :v1");
auto& st = prep.statement();
st.exchange(soci::use(actIDStrKey));
st.define_and_bind();
st.execute(true);
}
delta.deleteEntry(key);
}
示例4: innerResult
bool
CreateAccountOpFrame::doApply(medida::MetricsRegistry& metrics,
LedgerDelta& delta, LedgerManager& ledgerManager)
{
AccountFrame::pointer destAccount;
Database& db = ledgerManager.getDatabase();
destAccount = AccountFrame::loadAccount(mCreateAccount.destination, db);
if (!destAccount)
{
if (mCreateAccount.startingBalance < ledgerManager.getMinBalance(0))
{ // not over the minBalance to make an account
metrics.NewMeter({"op-create-account", "failure", "low-reserve"},
"operation").Mark();
innerResult().code(CREATE_ACCOUNT_LOW_RESERVE);
return false;
}
else
{
int64_t minBalance =
mSourceAccount->getMinimumBalance(ledgerManager);
if (mSourceAccount->getAccount().balance <
(minBalance + mCreateAccount.startingBalance))
{ // they don't have enough to send
metrics.NewMeter({"op-create-account", "failure", "underfunded"},
"operation").Mark();
innerResult().code(CREATE_ACCOUNT_UNDERFUNDED);
return false;
}
mSourceAccount->getAccount().balance -=
mCreateAccount.startingBalance;
mSourceAccount->storeChange(delta, db);
destAccount = make_shared<AccountFrame>(mCreateAccount.destination);
destAccount->getAccount().seqNum =
delta.getHeaderFrame().getStartingSequenceNumber();
destAccount->getAccount().balance = mCreateAccount.startingBalance;
destAccount->storeAdd(delta, db);
metrics.NewMeter({"op-create-account", "success", "apply"},
"operation").Mark();
innerResult().code(CREATE_ACCOUNT_SUCCESS);
return true;
}
}
else
{
metrics.NewMeter({"op-create-account", "failure", "already-exist"},
"operation").Mark();
innerResult().code(CREATE_ACCOUNT_ALREADY_EXIST);
return false;
}
}
示例5: use
void
OfferFrame::storeDelete(LedgerDelta& delta, Database& db, LedgerKey const& key)
{
auto timer = db.getDeleteTimer("offer");
db.getSession() << "DELETE FROM offers WHERE offerid=:s",
use(key.offer().offerID);
delta.deleteEntry(key);
}
示例6:
void
OfferFrame::storeDelete(LedgerDelta& delta, Database& db, LedgerKey const& key)
{
auto timer = db.getDeleteTimer("offer");
auto prep = db.getPreparedStatement("DELETE FROM offers WHERE offerid=:s");
auto& st = prep.statement();
st.exchange(use(key.offer().offerID));
st.define_and_bind();
st.execute(true);
delta.deleteEntry(key);
}
示例7: flushCachedEntry
void
TrustFrame::storeDelete(LedgerDelta& delta, Database& db, LedgerKey const& key)
{
flushCachedEntry(key, db);
std::string actIDStrKey, issuerStrKey, assetCode;
getKeyFields(key, actIDStrKey, issuerStrKey, assetCode);
auto timer = db.getDeleteTimer("trust");
db.getSession() << "DELETE FROM trustlines "
"WHERE accountid=:v1 AND issuer=:v2 AND assetcode=:v3",
use(actIDStrKey), use(issuerStrKey), use(assetCode);
delta.deleteEntry(key);
}
示例8: runtime_error
void
TrustFrame::storeAdd(LedgerDelta& delta, Database& db)
{
if (!isValid())
{
throw std::runtime_error("Invalid TrustEntry");
}
auto key = getKey();
flushCachedEntry(key, db);
if (mIsIssuer)
return;
touch(delta);
std::string actIDStrKey, issuerStrKey, assetCode;
unsigned int assetType = getKey().trustLine().asset.type();
getKeyFields(getKey(), actIDStrKey, issuerStrKey, assetCode);
auto prep = db.getPreparedStatement(
"INSERT INTO trustlines "
"(accountid, assettype, issuer, assetcode, balance, tlimit, flags, "
"lastmodified) "
"VALUES (:v1, :v2, :v3, :v4, :v5, :v6, :v7, :v8)");
auto& st = prep.statement();
st.exchange(use(actIDStrKey));
st.exchange(use(assetType));
st.exchange(use(issuerStrKey));
st.exchange(use(assetCode));
st.exchange(use(mTrustLine.balance));
st.exchange(use(mTrustLine.limit));
st.exchange(use(mTrustLine.flags));
st.exchange(use(getLastModified()));
st.define_and_bind();
{
auto timer = db.getInsertTimer("trust");
st.execute(true);
}
if (st.get_affected_rows() != 1)
{
throw std::runtime_error("Could not update data in SQL");
}
delta.addEntry(*this);
}
示例9: innerResult
bool
CreateAccountOpFrame::doApply(LedgerDelta& delta, LedgerManager& ledgerManager)
{
AccountFrame destAccount;
Database& db = ledgerManager.getDatabase();
if (!AccountFrame::loadAccount(mCreateAccount.destination, destAccount, db))
{
if (mCreateAccount.startingBalance < ledgerManager.getMinBalance(0))
{ // not over the minBalance to make an account
innerResult().code(CREATE_ACCOUNT_LOW_RESERVE);
return false;
}
else
{
int64_t minBalance =
mSourceAccount->getMinimumBalance(ledgerManager);
if (mSourceAccount->getAccount().balance <
(minBalance + mCreateAccount.startingBalance))
{ // they don't have enough to send
innerResult().code(CREATE_ACCOUNT_UNDERFUNDED);
return false;
}
mSourceAccount->getAccount().balance -=
mCreateAccount.startingBalance;
mSourceAccount->storeChange(delta, db);
destAccount.getAccount().accountID = mCreateAccount.destination;
destAccount.getAccount().seqNum =
delta.getHeaderFrame().getStartingSequenceNumber();
destAccount.getAccount().balance = mCreateAccount.startingBalance;
destAccount.storeAdd(delta, db);
innerResult().code(CREATE_ACCOUNT_SUCCESS);
return true;
}
}
else
{
innerResult().code(CREATE_ACCOUNT_ALREADY_EXIST);
return false;
}
}
示例10: txBytes
void
TransactionFrame::storeTransaction(LedgerManager& ledgerManager,
LedgerDelta const& delta, int txindex,
SHA256& resultHasher) const
{
auto txBytes(xdr::xdr_to_opaque(mEnvelope));
auto txResultBytes(xdr::xdr_to_opaque(getResultPair()));
resultHasher.add(txResultBytes);
std::string txBody = base64::encode(
reinterpret_cast<const unsigned char*>(txBytes.data()), txBytes.size());
std::string txResult = base64::encode(
reinterpret_cast<const unsigned char*>(txResultBytes.data()),
txResultBytes.size());
xdr::opaque_vec<> txMeta(delta.getTransactionMeta());
std::string meta = base64::encode(
reinterpret_cast<const unsigned char*>(txMeta.data()), txMeta.size());
string txIDString(binToHex(getContentsHash()));
auto timer = ledgerManager.getDatabase().getInsertTimer("txhistory");
soci::statement st =
(ledgerManager.getDatabase().getSession().prepare
<< "INSERT INTO txhistory (txid, ledgerseq, txindex, txbody, "
"txresult, txmeta) VALUES "
"(:id,:seq,:txindex,:txb,:txres,:meta)",
soci::use(txIDString),
soci::use(ledgerManager.getCurrentLedgerHeader().ledgerSeq),
soci::use(txindex), soci::use(txBody), soci::use(txResult),
soci::use(meta));
st.execute(true);
if (st.get_affected_rows() != 1)
{
throw std::runtime_error("Could not update data in SQL");
}
}
示例11: sendNoCreate
bool
PaymentOpFrame::doApply(LedgerDelta& delta, LedgerManager& ledgerManager)
{
AccountFrame destAccount;
// if sending to self directly, just mark as success
if (mPayment.destination == getSourceID() && mPayment.path.empty())
{
innerResult().code(PAYMENT_SUCCESS);
return true;
}
Database& db = ledgerManager.getDatabase();
if (!AccountFrame::loadAccount(mPayment.destination, destAccount, db))
{ // this tx is creating an account
if (mPayment.currency.type() == CURRENCY_TYPE_NATIVE)
{
if (mPayment.amount < ledgerManager.getMinBalance(0))
{ // not over the minBalance to make an account
innerResult().code(PAYMENT_LOW_RESERVE);
return false;
}
else
{
destAccount.getAccount().accountID = mPayment.destination;
destAccount.getAccount().seqNum =
delta.getHeaderFrame().getStartingSequenceNumber();
destAccount.getAccount().balance = 0;
destAccount.storeAdd(delta, db);
}
}
else
{ // trying to send credit to an unmade account
innerResult().code(PAYMENT_NO_DESTINATION);
return false;
}
}
return sendNoCreate(destAccount, delta, ledgerManager);
}
示例12: flushCachedEntry
void
AccountFrame::storeDelete(LedgerDelta& delta, Database& db,
LedgerKey const& key)
{
flushCachedEntry(key, db);
std::string actIDStrKey = PubKeyUtils::toStrKey(key.account().accountID);
soci::session& session = db.getSession();
{
auto timer = db.getDeleteTimer("account");
session << "DELETE from accounts where accountid= :v1",
soci::use(actIDStrKey);
}
{
auto timer = db.getDeleteTimer("signer");
session << "DELETE from signers where accountid= :v1",
soci::use(actIDStrKey);
}
delta.deleteEntry(key);
}
示例13: runtime_error
void
OfferFrame::storeChange(LedgerDelta& delta, Database& db) const
{
auto timer = db.getUpdateTimer("offer");
soci::statement st =
(db.getSession().prepare << "UPDATE offers SET amount=:a, pricen=:n, "
"priced=:D, price=:p WHERE offerid=:s",
use(mOffer.amount), use(mOffer.price.n), use(mOffer.price.d),
use(computePrice()), use(mOffer.offerID));
st.execute(true);
if (st.get_affected_rows() != 1)
{
throw std::runtime_error("could not update SQL");
}
delta.modEntry(*this);
}
示例14: getResult
void
TransactionFrame::prepareResult(LedgerDelta& delta,
LedgerManager& ledgerManager)
{
Database& db = ledgerManager.getDatabase();
int64_t fee = getResult().feeCharged;
if (fee > 0)
{
int64_t avail = mSigningAccount->getAccount().balance;
if (avail < fee)
{
// take all their balance to be safe
fee = avail;
}
mSigningAccount->setSeqNum(mEnvelope.tx.seqNum);
mSigningAccount->getAccount().balance -= fee;
delta.getHeader().feePool += fee;
mSigningAccount->storeChange(delta, db);
}
}
示例15: thresholds
void
AccountFrame::storeUpdate(LedgerDelta& delta, Database& db, bool insert)
{
assert(isValid());
touch(delta);
flushCachedEntry(db);
std::string actIDStrKey = PubKeyUtils::toStrKey(mAccountEntry.accountID);
std::string sql;
if (insert)
{
sql = std::string(
"INSERT INTO accounts ( accountid, balance, seqnum, "
"numsubentries, inflationdest, homedomain, thresholds, flags, "
"lastmodified ) "
"VALUES ( :id, :v1, :v2, :v3, :v4, :v5, :v6, :v7, :v8 )");
}
else
{
sql = std::string(
"UPDATE accounts SET balance = :v1, seqnum = :v2, "
"numsubentries = :v3, "
"inflationdest = :v4, homedomain = :v5, thresholds = :v6, "
"flags = :v7, lastmodified = :v8 WHERE accountid = :id");
}
auto prep = db.getPreparedStatement(sql);
soci::indicator inflation_ind = soci::i_null;
string inflationDestStrKey;
if (mAccountEntry.inflationDest)
{
inflationDestStrKey =
PubKeyUtils::toStrKey(*mAccountEntry.inflationDest);
inflation_ind = soci::i_ok;
}
string thresholds(bn::encode_b64(mAccountEntry.thresholds));
{
soci::statement& st = prep.statement();
st.exchange(use(actIDStrKey, "id"));
st.exchange(use(mAccountEntry.balance, "v1"));
st.exchange(use(mAccountEntry.seqNum, "v2"));
st.exchange(use(mAccountEntry.numSubEntries, "v3"));
st.exchange(use(inflationDestStrKey, inflation_ind, "v4"));
string homeDomain(mAccountEntry.homeDomain);
st.exchange(use(homeDomain, "v5"));
st.exchange(use(thresholds, "v6"));
st.exchange(use(mAccountEntry.flags, "v7"));
st.exchange(use(getLastModified(), "v8"));
st.define_and_bind();
{
auto timer = insert ? db.getInsertTimer("account")
: db.getUpdateTimer("account");
st.execute(true);
}
if (st.get_affected_rows() != 1)
{
throw std::runtime_error("Could not update data in SQL");
}
if (insert)
{
delta.addEntry(*this);
}
else
{
delta.modEntry(*this);
}
}
if (mUpdateSigners)
{
applySigners(db);
}
}