|
|
|
@ -404,66 +404,6 @@ bool CTxDB::ContainsTx(uint256 hash)
@@ -404,66 +404,6 @@ bool CTxDB::ContainsTx(uint256 hash)
|
|
|
|
|
return Exists(make_pair(string("tx"), hash)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool CTxDB::ReadOwnerTxes(uint160 hash160, int nMinHeight, vector<CTransaction>& vtx) |
|
|
|
|
{ |
|
|
|
|
assert(!fClient); |
|
|
|
|
vtx.clear(); |
|
|
|
|
|
|
|
|
|
// Get cursor
|
|
|
|
|
Dbc* pcursor = GetCursor(); |
|
|
|
|
if (!pcursor) |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
unsigned int fFlags = DB_SET_RANGE; |
|
|
|
|
loop |
|
|
|
|
{ |
|
|
|
|
// Read next record
|
|
|
|
|
CDataStream ssKey(SER_DISK, CLIENT_VERSION); |
|
|
|
|
if (fFlags == DB_SET_RANGE) |
|
|
|
|
ssKey << string("owner") << hash160 << CDiskTxPos(0, 0, 0); |
|
|
|
|
CDataStream ssValue(SER_DISK, CLIENT_VERSION); |
|
|
|
|
int ret = ReadAtCursor(pcursor, ssKey, ssValue, fFlags); |
|
|
|
|
fFlags = DB_NEXT; |
|
|
|
|
if (ret == DB_NOTFOUND) |
|
|
|
|
break; |
|
|
|
|
else if (ret != 0) |
|
|
|
|
{ |
|
|
|
|
pcursor->close(); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Unserialize
|
|
|
|
|
string strType; |
|
|
|
|
uint160 hashItem; |
|
|
|
|
CDiskTxPos pos; |
|
|
|
|
int nItemHeight; |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
ssKey >> strType >> hashItem >> pos; |
|
|
|
|
ssValue >> nItemHeight; |
|
|
|
|
} |
|
|
|
|
catch (std::exception &e) { |
|
|
|
|
return error("%s() : deserialize error", __PRETTY_FUNCTION__); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Read transaction
|
|
|
|
|
if (strType != "owner" || hashItem != hash160) |
|
|
|
|
break; |
|
|
|
|
if (nItemHeight >= nMinHeight) |
|
|
|
|
{ |
|
|
|
|
vtx.resize(vtx.size()+1); |
|
|
|
|
if (!vtx.back().ReadFromDisk(pos)) |
|
|
|
|
{ |
|
|
|
|
pcursor->close(); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pcursor->close(); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool CTxDB::ReadDiskTx(uint256 hash, CTransaction& tx, CTxIndex& txindex) |
|
|
|
|
{ |
|
|
|
|
assert(!fClient); |
|
|
|
|