@@ -113,31 +113,19 @@ bool CBlockTreeDB::ReadLastBlockFile(int &nFile) {
113113}
114114
115115bool CCoinsViewDB::GetStats (CCoinsStats &stats) {
116- leveldb::Iterator *pcursor = db.NewIterator ();
117- pcursor->SeekToFirst ( );
116+ CLevelDBIterator *pcursor = db.NewIterator ();
117+ pcursor->Seek ( ' c ' );
118118
119119 CHashWriter ss (SER_GETHASH, PROTOCOL_VERSION);
120120 stats.hashBlock = GetBestBlock ()->GetBlockHash ();
121121 ss << stats.hashBlock ;
122122 int64 nTotalAmount = 0 ;
123123 while (pcursor->Valid ()) {
124124 boost::this_thread::interruption_point ();
125- try {
126- leveldb::Slice slKey = pcursor->key ();
127- CDataStream ssKey (slKey.data (), slKey.data ()+slKey.size (), SER_DISK, CLIENT_VERSION);
128- char chType;
129- ssKey >> chType;
130- if (chType == ' c' ) {
131- leveldb::Slice slValue = pcursor->value ();
132- CDataStream ssValue (slValue.data (), slValue.data ()+slValue.size (), SER_DISK, CLIENT_VERSION);
133- CCoins coins;
134- ssValue >> coins;
135- uint256 txhash;
136- ssKey >> txhash;
137- ss << txhash;
138- ss << VARINT (coins.nVersion );
139- ss << (coins.fCoinBase ? ' c' : ' n' );
140- ss << VARINT (coins.nHeight );
125+ std::pair<char , uint256> key;
126+ CCoins coins;
127+ if (pcursor->GetKey (key) && key.first == ' c' ) {
128+ if (pcursor->GetValue (coins)) {
141129 stats.nTransactions ++;
142130 for (unsigned int i=0 ; i<coins.vout .size (); i++) {
143131 const CTxOut &out = coins.vout [i];
@@ -148,13 +136,15 @@ bool CCoinsViewDB::GetStats(CCoinsStats &stats) {
148136 nTotalAmount += out.nValue ;
149137 }
150138 }
151- stats.nSerializedSize += 32 + slValue. size ();
139+ stats.nSerializedSize += 32 + pcursor-> GetKeySize ();
152140 ss << VARINT (0 );
141+ } else {
142+ return error (" CCoinsViewDB::GetStats() : unable to read value" );
153143 }
154- pcursor->Next ();
155- } catch (std::exception &e) {
156- return error (" %s() : deserialize error" , __PRETTY_FUNCTION__);
144+ } else {
145+ break ;
157146 }
147+ pcursor->Next ();
158148 }
159149 delete pcursor;
160150 stats.nHeight = GetBestBlock ()->nHeight ;
@@ -188,26 +178,17 @@ bool CBlockTreeDB::ReadFlag(const std::string &name, bool &fValue) {
188178
189179bool CBlockTreeDB::LoadBlockIndexGuts ()
190180{
191- leveldb::Iterator *pcursor = NewIterator ();
181+ CLevelDBIterator *pcursor = NewIterator ();
192182
193- CDataStream ssKeySet (SER_DISK, CLIENT_VERSION);
194- ssKeySet << make_pair (' b' , uint256 (0 ));
195- pcursor->Seek (ssKeySet.str ());
183+ pcursor->Seek (make_pair (' b' , uint256 (0 )));
196184
197185 // Load mapBlockIndex
198186 while (pcursor->Valid ()) {
199187 boost::this_thread::interruption_point ();
200- try {
201- leveldb::Slice slKey = pcursor->key ();
202- CDataStream ssKey (slKey.data (), slKey.data ()+slKey.size (), SER_DISK, CLIENT_VERSION);
203- char chType;
204- ssKey >> chType;
205- if (chType == ' b' ) {
206- leveldb::Slice slValue = pcursor->value ();
207- CDataStream ssValue (slValue.data (), slValue.data ()+slValue.size (), SER_DISK, CLIENT_VERSION);
208- CDiskBlockIndex diskindex;
209- ssValue >> diskindex;
210-
188+ std::pair<char , uint256> key;
189+ if (pcursor->GetKey (key) && key.first == ' b' ) {
190+ CDiskBlockIndex diskindex;
191+ if (pcursor->GetValue (diskindex)) {
211192 // Construct block index object
212193 CBlockIndex* pindexNew = InsertBlockIndex (diskindex.GetBlockHash ());
213194 pindexNew->pprev = InsertBlockIndex (diskindex.hashPrev );
@@ -232,10 +213,10 @@ bool CBlockTreeDB::LoadBlockIndexGuts()
232213
233214 pcursor->Next ();
234215 } else {
235- break ; // if shutdown requested or finished loading block index
216+ return error ( " LoadBlockIndex() : failed to read value " );
236217 }
237- } catch (std::exception &e) {
238- return error ( " %s() : deserialize error " , __PRETTY_FUNCTION__) ;
218+ } else {
219+ break ;
239220 }
240221 }
241222 delete pcursor;
0 commit comments