fix leveldb traversal.

This commit is contained in:
Christopher Jeffrey 2014-12-03 12:31:39 -08:00
parent fc0de11c50
commit 0da9c4dd44

View File

@ -6167,6 +6167,7 @@ read_addr(const std::string addr) {
} }
} }
} }
found: found:
pcursor->Next(); pcursor->Next();
} catch (std::exception &e) { } catch (std::exception &e) {
@ -6195,8 +6196,6 @@ error:
static bool static bool
get_block_by_tx(const std::string itxhash, CBlock& rcblock, CBlockIndex **rcblock_index) { get_block_by_tx(const std::string itxhash, CBlock& rcblock, CBlockIndex **rcblock_index) {
bool found = false;
leveldb::Iterator* pcursor = pblocktree->pdb->NewIterator(pblocktree->iteroptions); leveldb::Iterator* pcursor = pblocktree->pdb->NewIterator(pblocktree->iteroptions);
pcursor->SeekToFirst(); pcursor->SeekToFirst();
@ -6211,13 +6210,6 @@ get_block_by_tx(const std::string itxhash, CBlock& rcblock, CBlockIndex **rcbloc
char type; char type;
ssKey >> type; ssKey >> type;
// Blockchain Index Structure:
// http://bitcoin.stackexchange.com/questions/28168
// Transaction Structure:
// CDiskBlockPos.nFile - block file
// CDiskBlockPos.nPos - block pos
// CDiskTxPos.nTxOffset - offset from top of block
if (type == 't') { if (type == 't') {
uint256 txhash; uint256 txhash;
ssKey >> txhash; ssKey >> txhash;
@ -6241,7 +6233,7 @@ get_block_by_tx(const std::string itxhash, CBlock& rcblock, CBlockIndex **rcbloc
uint256 blockhash; uint256 blockhash;
if (!pblocktree->ReadTxIndex(txhash, txPos)) { if (!pblocktree->ReadTxIndex(txhash, txPos)) {
goto found; goto error;
} }
CAutoFile file(OpenBlockFile(txPos, true), SER_DISK, CLIENT_VERSION); CAutoFile file(OpenBlockFile(txPos, true), SER_DISK, CLIENT_VERSION);
@ -6251,10 +6243,10 @@ get_block_by_tx(const std::string itxhash, CBlock& rcblock, CBlockIndex **rcbloc
fseek(file.Get(), txPos.nTxOffset, SEEK_CUR); fseek(file.Get(), txPos.nTxOffset, SEEK_CUR);
file >> ctx; file >> ctx;
} catch (std::exception &e) { } catch (std::exception &e) {
goto ret; goto error;
} }
if (ctx.GetHash() != txhash) { if (ctx.GetHash() != txhash) {
goto ret; goto error;
} }
blockhash = header.GetHash(); blockhash = header.GetHash();
@ -6262,28 +6254,24 @@ get_block_by_tx(const std::string itxhash, CBlock& rcblock, CBlockIndex **rcbloc
if (ReadBlockFromDisk(rcblock, pblockindex)) { if (ReadBlockFromDisk(rcblock, pblockindex)) {
*rcblock_index = pblockindex; *rcblock_index = pblockindex;
found = true; delete pcursor;
return true;
} }
goto ret; goto error;
} }
} }
found:
pcursor->Next(); pcursor->Next();
} catch (std::exception &e) { } catch (std::exception &e) {
leveldb::Slice lastKey = pcursor->key();
std::string lastKeyHex = HexStr(lastKey.ToString());
head->err_msg = std::string(e.what()
+ std::string(" : Not found. Key: ")
+ lastKeyHex);
delete pcursor; delete pcursor;
return found; return false;
} }
} }
ret: error:
delete pcursor; delete pcursor;
return found; return false;
} }
static int64_t static int64_t