add traverse option to get_tx.

This commit is contained in:
Christopher Jeffrey 2014-12-08 12:33:41 -08:00
parent d37be97ad9
commit 263bc2fa73
1 changed files with 19 additions and 8 deletions

View File

@ -403,7 +403,7 @@ static int64_t
SatoshiFromAmount(const CAmount& amount); SatoshiFromAmount(const CAmount& amount);
static int static int
get_tx(uint256 txid, uint256& blockhash, CTransaction& ctx); get_tx(uint256 txid, uint256& blockhash, const bool traverse, CTransaction& ctx);
extern "C" void extern "C" void
init(Handle<Object>); init(Handle<Object>);
@ -460,6 +460,7 @@ struct async_tx_data {
std::string err_msg; std::string err_msg;
std::string txid; std::string txid;
std::string blockhash; std::string blockhash;
bool traverse;
CTransaction ctx; CTransaction ctx;
Persistent<Function> callback; Persistent<Function> callback;
}; };
@ -1116,14 +1117,23 @@ NAN_METHOD(GetTransaction) {
if (args.Length() < 3 if (args.Length() < 3
|| !args[0]->IsString() || !args[0]->IsString()
|| !args[1]->IsString() || !args[1]->IsString()
|| !args[2]->IsFunction()) { || (!args[2]->IsFunction() && !(args[2]->IsBoolean() && args[3]->IsFunction())) {
return NanThrowError( return NanThrowError(
"Usage: bitcoindjs.getTransaction(txid, [blockhash], callback)"); "Usage: bitcoindjs.getTransaction(txid, [blockhash], [traverse], callback)");
} }
String::Utf8Value txid_(args[0]->ToString()); String::Utf8Value txid_(args[0]->ToString());
String::Utf8Value blockhash_(args[1]->ToString()); String::Utf8Value blockhash_(args[1]->ToString());
Local<Function> callback = Local<Function>::Cast(args[2]);
bool traverse = true;
Local<Function> callback;
if (args[2]->IsBoolean()) {
traverse = args[2]->ToBoolean()->IsTrue();
callback = Local<Function>::Cast(args[3]);
} else {
callback = Local<Function>::Cast(args[2]);
}
std::string txid = std::string(*txid_); std::string txid = std::string(*txid_);
std::string blockhash = std::string(*blockhash_); std::string blockhash = std::string(*blockhash_);
@ -1136,6 +1146,7 @@ NAN_METHOD(GetTransaction) {
data->err_msg = std::string(""); data->err_msg = std::string("");
data->txid = txid; data->txid = txid;
data->blockhash = blockhash; data->blockhash = blockhash;
data->traverse = traverse;
data->callback = Persistent<Function>::New(callback); data->callback = Persistent<Function>::New(callback);
uv_work_t *req = new uv_work_t(); uv_work_t *req = new uv_work_t();
@ -1158,7 +1169,7 @@ async_get_tx(uv_work_t *req) {
uint256 blockhash(data->blockhash); uint256 blockhash(data->blockhash);
CTransaction ctx; CTransaction ctx;
if (get_tx(hash, blockhash, ctx)) { if (get_tx(hash, blockhash, data->traverse, ctx)) {
data->ctx = ctx; data->ctx = ctx;
data->blockhash = blockhash.GetHex(); data->blockhash = blockhash.GetHex();
} else { } else {
@ -5834,10 +5845,10 @@ cblock_to_jsblock(const CBlock& cblock, CBlockIndex* cblock_index, Local<Object>
} }
static int 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)) { if (GetTransaction(txid, ctx, blockhash, true)) {
return 1; return 1;
} else if (blockhash != 0) { } else if (traverse && blockhash != 0) {
CBlock block; CBlock block;
CBlockIndex* pblockindex = mapBlockIndex[blockhash]; CBlockIndex* pblockindex = mapBlockIndex[blockhash];
if (ReadBlockFromDisk(block, pblockindex)) { if (ReadBlockFromDisk(block, pblockindex)) {
@ -5892,7 +5903,7 @@ ctx_to_jstx(const CTransaction& ctx, uint256 blockhash, Local<Object> jstx) {
Local<Object> jsprev = NanNew<Object>(); Local<Object> jsprev = NanNew<Object>();
CTransaction prev_tx; 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)) { if (GetTransaction(txin.prevout.hash, prev_tx, blockhash, true)) {
CTxDestination from; CTxDestination from;
CTxOut prev_out = prev_tx.vout[txin.prevout.n]; CTxOut prev_out = prev_tx.vout[txin.prevout.n];