LedgerKey LedgerEntryKey(LedgerEntry const& e) { auto& d = e.data; LedgerKey k; switch (d.type()) { case ACCOUNT: k.type(ACCOUNT); k.account().accountID = d.account().accountID; break; case TRUSTLINE: k.type(TRUSTLINE); k.trustLine().accountID = d.trustLine().accountID; k.trustLine().asset = d.trustLine().asset; break; case OFFER: k.type(OFFER); k.offer().sellerID = d.offer().sellerID; k.offer().offerID = d.offer().offerID; break; case DATA: k.type(DATA); k.data().accountID = d.data().accountID; k.data().dataName = d.data().dataName; break; } return k; }
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); }
bool AccountFrame::exists(Database& db, LedgerKey const& key) { if (cachedEntryExists(key, db) && getCachedEntry(key, db) != nullptr) { return true; } std::string actIDStrKey = PubKeyUtils::toStrKey(key.account().accountID); int exists = 0; { auto timer = db.getSelectTimer("account-exists"); db.getSession() << "SELECT EXISTS (SELECT NULL FROM accounts " "WHERE accountid=:v1)", use(actIDStrKey), into(exists); } return exists != 0; }
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); }
bool AccountFrame::exists(Database& db, LedgerKey const& key) { if (cachedEntryExists(key, db) && getCachedEntry(key, db) != nullptr) { return true; } std::string actIDStrKey = PubKeyUtils::toStrKey(key.account().accountID); int exists = 0; { auto timer = db.getSelectTimer("account-exists"); auto prep = db.getPreparedStatement("SELECT EXISTS (SELECT NULL FROM accounts " "WHERE accountid=:v1)"); auto& st = prep.statement(); st.exchange(use(actIDStrKey)); st.exchange(into(exists)); st.define_and_bind(); st.execute(true); } return exists != 0; }
AccountFrame::pointer AccountFrame::loadAccount(AccountID const& accountID, Database& db) { LedgerKey key; key.type(ACCOUNT); key.account().accountID = accountID; if (cachedEntryExists(key, db)) { auto p = getCachedEntry(key, db); return p ? std::make_shared<AccountFrame>(*p) : nullptr; } std::string actIDStrKey = PubKeyUtils::toStrKey(accountID); std::string publicKey, inflationDest, creditAuthKey; std::string homeDomain, thresholds; soci::indicator inflationDestInd; AccountFrame::pointer res = make_shared<AccountFrame>(accountID); AccountEntry& account = res->getAccount(); auto prep = db.getPreparedStatement("SELECT balance, seqnum, numsubentries, " "inflationdest, homedomain, thresholds, " "flags, lastmodified " "FROM accounts WHERE accountid=:v1"); auto& st = prep.statement(); st.exchange(into(account.balance)); st.exchange(into(account.seqNum)); st.exchange(into(account.numSubEntries)); st.exchange(into(inflationDest, inflationDestInd)); st.exchange(into(homeDomain)); st.exchange(into(thresholds)); st.exchange(into(account.flags)); st.exchange(into(res->getLastModified())); st.exchange(use(actIDStrKey)); st.define_and_bind(); { auto timer = db.getSelectTimer("account"); st.execute(true); } if (!st.got_data()) { putCachedEntry(key, nullptr, db); return nullptr; } account.homeDomain = homeDomain; bn::decode_b64(thresholds.begin(), thresholds.end(), res->mAccountEntry.thresholds.begin()); if (inflationDestInd == soci::i_ok) { account.inflationDest.activate() = PubKeyUtils::fromStrKey(inflationDest); } account.signers.clear(); if (account.numSubEntries != 0) { auto signers = loadSigners(db, actIDStrKey); account.signers.insert(account.signers.begin(), signers.begin(), signers.end()); } res->normalize(); res->mUpdateSigners = false; assert(res->isValid()); res->mKeyCalculated = false; res->putCachedEntry(db); return res; }
AccountFrame::pointer AccountFrame::loadAccount(AccountID const& accountID, Database& db) { LedgerKey key; key.type(ACCOUNT); key.account().accountID = accountID; if (cachedEntryExists(key, db)) { auto p = getCachedEntry(key, db); return p ? std::make_shared<AccountFrame>(*p) : nullptr; } std::string actIDStrKey = PubKeyUtils::toStrKey(accountID); std::string publicKey, inflationDest, creditAuthKey; std::string homeDomain, thresholds; soci::indicator inflationDestInd, homeDomainInd, thresholdsInd; soci::session& session = db.getSession(); AccountFrame::pointer res = make_shared<AccountFrame>(accountID); AccountEntry& account = res->getAccount(); { auto timer = db.getSelectTimer("account"); session << "SELECT balance, seqnum, numsubentries, " "inflationdest, homedomain, thresholds, flags " "FROM accounts WHERE accountid=:v1", into(account.balance), into(account.seqNum), into(account.numSubEntries), into(inflationDest, inflationDestInd), into(homeDomain, homeDomainInd), into(thresholds, thresholdsInd), into(account.flags), use(actIDStrKey); } if (!session.got_data()) { putCachedEntry(key, nullptr, db); return nullptr; } if (homeDomainInd == soci::i_ok) { account.homeDomain = homeDomain; } if (thresholdsInd == soci::i_ok) { bn::decode_b64(thresholds.begin(), thresholds.end(), res->mAccountEntry.thresholds.begin()); } if (inflationDestInd == soci::i_ok) { account.inflationDest.activate() = PubKeyUtils::fromStrKey(inflationDest); } account.signers.clear(); if (account.numSubEntries != 0) { string pubKey; Signer signer; auto prep = db.getPreparedStatement("SELECT publickey, weight from " "signers where accountid =:id"); auto& st = prep.statement(); st.exchange(use(actIDStrKey)); st.exchange(into(pubKey)); st.exchange(into(signer.weight)); st.define_and_bind(); { auto timer = db.getSelectTimer("signer"); st.execute(true); } while (st.got_data()) { signer.pubKey = PubKeyUtils::fromStrKey(pubKey); account.signers.push_back(signer); st.fetch(); } } res->normalize(); res->mUpdateSigners = false; res->mKeyCalculated = false; res->putCachedEntry(db); return res; }