@@ -25,20 +25,34 @@ class dbwrapper_error : public std::runtime_error
25
25
26
26
void HandleError (const leveldb::Status& status);
27
27
28
+ class CDBWrapper ;
29
+
30
+ /* * These should be considered an implementation detail of the specific database.
31
+ */
32
+ namespace dbwrapper_private {
33
+
34
+ /* * Work around circular dependency, as well as for testing in dbwrapper_tests.
35
+ * Database obfuscation should be considered an implementation detail of the
36
+ * specific database.
37
+ */
38
+ const std::vector<unsigned char >& GetObfuscateKey (const CDBWrapper &w);
39
+
40
+ };
41
+
28
42
/* * Batch of changes queued to be written to a CDBWrapper */
29
43
class CDBBatch
30
44
{
31
45
friend class CDBWrapper ;
32
46
33
47
private:
48
+ const CDBWrapper &parent;
34
49
leveldb::WriteBatch batch;
35
- const std::vector<unsigned char > *obfuscate_key;
36
50
37
51
public:
38
52
/* *
39
- * @param[in] obfuscate_key If passed, XOR data with this key.
53
+ * @param[in] parent CDBWrapper that this batch is to be submitted to
40
54
*/
41
- CDBBatch (const std::vector< unsigned char > *obfuscate_key ) : obfuscate_key(obfuscate_key ) { };
55
+ CDBBatch (const CDBWrapper &parent ) : parent(parent ) { };
42
56
43
57
template <typename K, typename V>
44
58
void Write (const K& key, const V& value)
@@ -51,7 +65,7 @@ class CDBBatch
51
65
CDataStream ssValue (SER_DISK, CLIENT_VERSION);
52
66
ssValue.reserve (ssValue.GetSerializeSize (value));
53
67
ssValue << value;
54
- ssValue.Xor (*obfuscate_key );
68
+ ssValue.Xor (dbwrapper_private::GetObfuscateKey (parent) );
55
69
leveldb::Slice slValue (&ssValue[0 ], ssValue.size ());
56
70
57
71
batch.Put (slKey, slValue);
@@ -72,17 +86,17 @@ class CDBBatch
72
86
class CDBIterator
73
87
{
74
88
private:
89
+ const CDBWrapper &parent;
75
90
leveldb::Iterator *piter;
76
- const std::vector<unsigned char > *obfuscate_key;
77
91
78
92
public:
79
93
80
94
/* *
95
+ * @param[in] parent Parent CDBWrapper instance.
81
96
* @param[in] piterIn The original leveldb iterator.
82
- * @param[in] obfuscate_key If passed, XOR data with this key.
83
97
*/
84
- CDBIterator (leveldb::Iterator *piterIn, const std::vector< unsigned char >* obfuscate_key ) :
85
- piter (piterIn ), obfuscate_key(obfuscate_key ) { };
98
+ CDBIterator (const CDBWrapper &parent, leveldb::Iterator *piterIn ) :
99
+ parent (parent ), piter(piterIn ) { };
86
100
~CDBIterator ();
87
101
88
102
bool Valid ();
@@ -118,7 +132,7 @@ class CDBIterator
118
132
leveldb::Slice slValue = piter->value ();
119
133
try {
120
134
CDataStream ssValue (slValue.data (), slValue.data () + slValue.size (), SER_DISK, CLIENT_VERSION);
121
- ssValue.Xor (*obfuscate_key );
135
+ ssValue.Xor (dbwrapper_private::GetObfuscateKey (parent) );
122
136
ssValue >> value;
123
137
} catch (const std::exception&) {
124
138
return false ;
@@ -134,6 +148,7 @@ class CDBIterator
134
148
135
149
class CDBWrapper
136
150
{
151
+ friend const std::vector<unsigned char >& dbwrapper_private::GetObfuscateKey (const CDBWrapper &w);
137
152
private:
138
153
// ! custom environment this database is using (may be NULL in case of default environment)
139
154
leveldb::Env* penv;
@@ -208,7 +223,7 @@ class CDBWrapper
208
223
template <typename K, typename V>
209
224
bool Write (const K& key, const V& value, bool fSync = false )
210
225
{
211
- CDBBatch batch (&obfuscate_key );
226
+ CDBBatch batch (* this );
212
227
batch.Write (key, value);
213
228
return WriteBatch (batch, fSync );
214
229
}
@@ -235,7 +250,7 @@ class CDBWrapper
235
250
template <typename K>
236
251
bool Erase (const K& key, bool fSync = false )
237
252
{
238
- CDBBatch batch (&obfuscate_key );
253
+ CDBBatch batch (* this );
239
254
batch.Erase (key);
240
255
return WriteBatch (batch, fSync );
241
256
}
@@ -250,24 +265,19 @@ class CDBWrapper
250
265
251
266
bool Sync ()
252
267
{
253
- CDBBatch batch (&obfuscate_key );
268
+ CDBBatch batch (* this );
254
269
return WriteBatch (batch, true );
255
270
}
256
271
257
272
CDBIterator *NewIterator ()
258
273
{
259
- return new CDBIterator (pdb->NewIterator (iteroptions), &obfuscate_key );
274
+ return new CDBIterator (* this , pdb->NewIterator (iteroptions));
260
275
}
261
276
262
277
/* *
263
278
* Return true if the database managed by this class contains no entries.
264
279
*/
265
280
bool IsEmpty ();
266
-
267
- /* *
268
- * Accessor for obfuscate_key.
269
- */
270
- const std::vector<unsigned char >& GetObfuscateKey () const ;
271
281
};
272
282
273
283
#endif // BITCOIN_DBWRAPPER_H
0 commit comments