@@ -23,22 +23,38 @@ class dbwrapper_error : public std::runtime_error
23
23
dbwrapper_error (const std::string& msg) : std::runtime_error(msg) {}
24
24
};
25
25
26
- void HandleError (const leveldb::Status& status) throw(dbwrapper_error);
26
+ class CDBWrapper ;
27
+
28
+ /* * These should be considered an implementation detail of the specific database.
29
+ */
30
+ namespace dbwrapper_private {
31
+
32
+ /* * Handle database error by throwing dbwrapper_error exception.
33
+ */
34
+ void HandleError (const leveldb::Status& status);
35
+
36
+ /* * Work around circular dependency, as well as for testing in dbwrapper_tests.
37
+ * Database obfuscation should be considered an implementation detail of the
38
+ * specific database.
39
+ */
40
+ const std::vector<unsigned char >& GetObfuscateKey (const CDBWrapper &w);
41
+
42
+ };
27
43
28
44
/* * Batch of changes queued to be written to a CDBWrapper */
29
45
class CDBBatch
30
46
{
31
47
friend class CDBWrapper ;
32
48
33
49
private:
50
+ const CDBWrapper &parent;
34
51
leveldb::WriteBatch batch;
35
- const std::vector<unsigned char > *obfuscate_key;
36
52
37
53
public:
38
54
/* *
39
- * @param[in] obfuscate_key If passed, XOR data with this key.
55
+ * @param[in] parent CDBWrapper that this batch is to be submitted to
40
56
*/
41
- CDBBatch (const std::vector< unsigned char > *obfuscate_key ) : obfuscate_key(obfuscate_key ) { };
57
+ CDBBatch (const CDBWrapper &parent ) : parent(parent ) { };
42
58
43
59
template <typename K, typename V>
44
60
void Write (const K& key, const V& value)
@@ -51,7 +67,7 @@ class CDBBatch
51
67
CDataStream ssValue (SER_DISK, CLIENT_VERSION);
52
68
ssValue.reserve (ssValue.GetSerializeSize (value));
53
69
ssValue << value;
54
- ssValue.Xor (*obfuscate_key );
70
+ ssValue.Xor (dbwrapper_private::GetObfuscateKey (parent) );
55
71
leveldb::Slice slValue (&ssValue[0 ], ssValue.size ());
56
72
57
73
batch.Put (slKey, slValue);
@@ -72,17 +88,17 @@ class CDBBatch
72
88
class CDBIterator
73
89
{
74
90
private:
91
+ const CDBWrapper &parent;
75
92
leveldb::Iterator *piter;
76
- const std::vector<unsigned char > *obfuscate_key;
77
93
78
94
public:
79
95
80
96
/* *
97
+ * @param[in] parent Parent CDBWrapper instance.
81
98
* @param[in] piterIn The original leveldb iterator.
82
- * @param[in] obfuscate_key If passed, XOR data with this key.
83
99
*/
84
- CDBIterator (leveldb::Iterator *piterIn, const std::vector< unsigned char >* obfuscate_key ) :
85
- piter (piterIn ), obfuscate_key(obfuscate_key ) { };
100
+ CDBIterator (const CDBWrapper &parent, leveldb::Iterator *piterIn ) :
101
+ parent (parent ), piter(piterIn ) { };
86
102
~CDBIterator ();
87
103
88
104
bool Valid ();
@@ -118,7 +134,7 @@ class CDBIterator
118
134
leveldb::Slice slValue = piter->value ();
119
135
try {
120
136
CDataStream ssValue (slValue.data (), slValue.data () + slValue.size (), SER_DISK, CLIENT_VERSION);
121
- ssValue.Xor (*obfuscate_key );
137
+ ssValue.Xor (dbwrapper_private::GetObfuscateKey (parent) );
122
138
ssValue >> value;
123
139
} catch (const std::exception&) {
124
140
return false ;
@@ -134,6 +150,7 @@ class CDBIterator
134
150
135
151
class CDBWrapper
136
152
{
153
+ friend const std::vector<unsigned char >& dbwrapper_private::GetObfuscateKey (const CDBWrapper &w);
137
154
private:
138
155
// ! custom environment this database is using (may be NULL in case of default environment)
139
156
leveldb::Env* penv;
@@ -180,7 +197,7 @@ class CDBWrapper
180
197
~CDBWrapper ();
181
198
182
199
template <typename K, typename V>
183
- bool Read (const K& key, V& value) const throw(dbwrapper_error)
200
+ bool Read (const K& key, V& value) const
184
201
{
185
202
CDataStream ssKey (SER_DISK, CLIENT_VERSION);
186
203
ssKey.reserve (ssKey.GetSerializeSize (key));
@@ -193,7 +210,7 @@ class CDBWrapper
193
210
if (status.IsNotFound ())
194
211
return false ;
195
212
LogPrintf (" LevelDB read failure: %s\n " , status.ToString ());
196
- HandleError (status);
213
+ dbwrapper_private:: HandleError (status);
197
214
}
198
215
try {
199
216
CDataStream ssValue (strValue.data (), strValue.data () + strValue.size (), SER_DISK, CLIENT_VERSION);
@@ -206,15 +223,15 @@ class CDBWrapper
206
223
}
207
224
208
225
template <typename K, typename V>
209
- bool Write (const K& key, const V& value, bool fSync = false ) throw(dbwrapper_error)
226
+ bool Write (const K& key, const V& value, bool fSync = false )
210
227
{
211
- CDBBatch batch (&obfuscate_key );
228
+ CDBBatch batch (* this );
212
229
batch.Write (key, value);
213
230
return WriteBatch (batch, fSync );
214
231
}
215
232
216
233
template <typename K>
217
- bool Exists (const K& key) const throw(dbwrapper_error)
234
+ bool Exists (const K& key) const
218
235
{
219
236
CDataStream ssKey (SER_DISK, CLIENT_VERSION);
220
237
ssKey.reserve (ssKey.GetSerializeSize (key));
@@ -227,53 +244,42 @@ class CDBWrapper
227
244
if (status.IsNotFound ())
228
245
return false ;
229
246
LogPrintf (" LevelDB read failure: %s\n " , status.ToString ());
230
- HandleError (status);
247
+ dbwrapper_private:: HandleError (status);
231
248
}
232
249
return true ;
233
250
}
234
251
235
252
template <typename K>
236
- bool Erase (const K& key, bool fSync = false ) throw(dbwrapper_error)
253
+ bool Erase (const K& key, bool fSync = false )
237
254
{
238
- CDBBatch batch (&obfuscate_key );
255
+ CDBBatch batch (* this );
239
256
batch.Erase (key);
240
257
return WriteBatch (batch, fSync );
241
258
}
242
259
243
- bool WriteBatch (CDBBatch& batch, bool fSync = false ) throw(dbwrapper_error) ;
260
+ bool WriteBatch (CDBBatch& batch, bool fSync = false );
244
261
245
262
// not available for LevelDB; provide for compatibility with BDB
246
263
bool Flush ()
247
264
{
248
265
return true ;
249
266
}
250
267
251
- bool Sync () throw(dbwrapper_error)
268
+ bool Sync ()
252
269
{
253
- CDBBatch batch (&obfuscate_key );
270
+ CDBBatch batch (* this );
254
271
return WriteBatch (batch, true );
255
272
}
256
273
257
274
CDBIterator *NewIterator ()
258
275
{
259
- return new CDBIterator (pdb->NewIterator (iteroptions), &obfuscate_key );
276
+ return new CDBIterator (* this , pdb->NewIterator (iteroptions));
260
277
}
261
278
262
279
/* *
263
280
* Return true if the database managed by this class contains no entries.
264
281
*/
265
282
bool IsEmpty ();
266
-
267
- /* *
268
- * Accessor for obfuscate_key.
269
- */
270
- const std::vector<unsigned char >& GetObfuscateKey () const ;
271
-
272
- /* *
273
- * Return the obfuscate_key as a hex-formatted string.
274
- */
275
- std::string GetObfuscateKeyHex () const ;
276
-
277
283
};
278
284
279
285
#endif // BITCOIN_DBWRAPPER_H
0 commit comments