From 263bc2fa730e834f23bf108610e38c20e9865571 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Mon, 8 Dec 2014 12:33:41 -0800 Subject: [PATCH] add traverse option to get_tx. --- src/bitcoindjs.cc | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index dac27c13..df292bd8 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -403,7 +403,7 @@ static int64_t SatoshiFromAmount(const CAmount& amount); static int -get_tx(uint256 txid, uint256& blockhash, CTransaction& ctx); +get_tx(uint256 txid, uint256& blockhash, const bool traverse, CTransaction& ctx); extern "C" void init(Handle); @@ -460,6 +460,7 @@ struct async_tx_data { std::string err_msg; std::string txid; std::string blockhash; + bool traverse; CTransaction ctx; Persistent callback; }; @@ -1116,14 +1117,23 @@ NAN_METHOD(GetTransaction) { if (args.Length() < 3 || !args[0]->IsString() || !args[1]->IsString() - || !args[2]->IsFunction()) { + || (!args[2]->IsFunction() && !(args[2]->IsBoolean() && args[3]->IsFunction())) { return NanThrowError( - "Usage: bitcoindjs.getTransaction(txid, [blockhash], callback)"); + "Usage: bitcoindjs.getTransaction(txid, [blockhash], [traverse], callback)"); } String::Utf8Value txid_(args[0]->ToString()); String::Utf8Value blockhash_(args[1]->ToString()); - Local callback = Local::Cast(args[2]); + + bool traverse = true; + Local callback; + + if (args[2]->IsBoolean()) { + traverse = args[2]->ToBoolean()->IsTrue(); + callback = Local::Cast(args[3]); + } else { + callback = Local::Cast(args[2]); + } std::string txid = std::string(*txid_); std::string blockhash = std::string(*blockhash_); @@ -1136,6 +1146,7 @@ NAN_METHOD(GetTransaction) { data->err_msg = std::string(""); data->txid = txid; data->blockhash = blockhash; + data->traverse = traverse; data->callback = Persistent::New(callback); uv_work_t *req = new uv_work_t(); @@ -1158,7 +1169,7 @@ async_get_tx(uv_work_t *req) { uint256 blockhash(data->blockhash); CTransaction ctx; - if (get_tx(hash, blockhash, ctx)) { + if (get_tx(hash, blockhash, data->traverse, ctx)) { data->ctx = ctx; data->blockhash = blockhash.GetHex(); } else { @@ -5834,10 +5845,10 @@ cblock_to_jsblock(const CBlock& cblock, CBlockIndex* cblock_index, Local } static int -get_tx(uint256 txid, uint256& blockhash, CTransaction& ctx) { +get_tx(uint256 txid, uint256& blockhash, const bool traverse, CTransaction& ctx) { if (GetTransaction(txid, ctx, blockhash, true)) { return 1; - } else if (blockhash != 0) { + } else if (traverse && blockhash != 0) { CBlock block; CBlockIndex* pblockindex = mapBlockIndex[blockhash]; if (ReadBlockFromDisk(block, pblockindex)) { @@ -5892,7 +5903,7 @@ ctx_to_jstx(const CTransaction& ctx, uint256 blockhash, Local jstx) { Local jsprev = NanNew(); CTransaction prev_tx; - //if (get_tx(txin.prevout.hash, blockhash, prev_tx)) { + //if (get_tx(txin.prevout.hash, blockhash, false, prev_tx)) { if (GetTransaction(txin.prevout.hash, prev_tx, blockhash, true)) { CTxDestination from; CTxOut prev_out = prev_tx.vout[txin.prevout.n];