Json::Value doTx (RPC::Context& context) { if (!context.params.isMember (jss::transaction)) return rpcError (rpcINVALID_PARAMS); bool binary = context.params.isMember (jss::binary) && context.params[jss::binary].asBool (); auto const txid = context.params[jss::transaction].asString (); if (!isHexTxID (txid)) return rpcError (rpcNOT_IMPL); auto txn = getApp().getMasterTransaction ().fetch (uint256 (txid), true); if (!txn) return rpcError (rpcTXN_NOT_FOUND); Json::Value ret = txn->getJson (1, binary); if (txn->getLedger () == 0) return ret; if (auto lgr = context.netOps.getLedgerBySeq (txn->getLedger ())) { bool okay = false; if (binary) { std::string meta; if (lgr->getMetaHex (txn->getID (), meta)) { ret[jss::meta] = meta; okay = true; } } else { TransactionMetaSet::pointer txMeta; if (lgr->getTransactionMeta (txn->getID (), txMeta)) { okay = true; auto meta = txMeta->getJson (0); addPaymentDeliveredAmount (meta, context, txn, txMeta); ret[jss::meta] = meta; } } if (okay) ret[jss::validated] = context.netOps.isValidated (lgr); } return ret; }
void Transaction::save() { if ((mStatus == INVALID) || (mStatus == REMOVED)) return; char status; switch (mStatus) { case NEW: status = TXN_SQL_NEW; break; case INCLUDED: status = TXN_SQL_INCLUDED; break; case CONFLICTED: status = TXN_SQL_CONFLICT; break; case COMMITTED: status = TXN_SQL_VALIDATED; break; case HELD: status = TXN_SQL_HELD; break; default: status = TXN_SQL_UNKNOWN; } Database *db = theApp->getTxnDB()->getDB(); ScopedLock dbLock(theApp->getTxnDB()->getDBLock()); db->executeSQL(mTransaction->getSQLInsertReplaceHeader() + mTransaction->getSQL(getLedger(), status) + ";"); }
void convertBlobsToTxResult ( NetworkOPs::AccountTxs& to, std::uint32_t ledger_index, std::string const& status, Blob const& rawTxn, Blob const& rawMeta, Application& app) { SerialIter it (makeSlice(rawTxn)); auto txn = std::make_shared<STTx const> (it); std::string reason; auto tr = std::make_shared<Transaction> (txn, reason, app); tr->setStatus (Transaction::sqlTransactionStatus(status)); tr->setLedger (ledger_index); auto metaset = std::make_shared<TxMeta> ( tr->getID (), tr->getLedger (), rawMeta); to.emplace_back(std::move(tr), metaset); };