@@ -32,13 +32,13 @@ class CLevelDBBatch
32
32
33
33
private:
34
34
leveldb::WriteBatch batch;
35
- const std::vector<unsigned char > obfuscate_key;
35
+ const std::vector<unsigned char > * obfuscate_key;
36
36
37
37
public:
38
38
/* *
39
39
* @param[in] obfuscate_key If passed, XOR data with this key.
40
40
*/
41
- CLevelDBBatch (const std::vector<unsigned char >& obfuscate_key) : obfuscate_key(obfuscate_key) { };
41
+ CLevelDBBatch (const std::vector<unsigned char > * obfuscate_key) : obfuscate_key(obfuscate_key) { };
42
42
43
43
template <typename K, typename V>
44
44
void Write (const K& key, const V& value)
@@ -51,7 +51,7 @@ class CLevelDBBatch
51
51
CDataStream ssValue (SER_DISK, CLIENT_VERSION);
52
52
ssValue.reserve (ssValue.GetSerializeSize (value));
53
53
ssValue << value;
54
- ssValue.Xor (obfuscate_key);
54
+ ssValue.Xor (* obfuscate_key);
55
55
leveldb::Slice slValue (&ssValue[0 ], ssValue.size ());
56
56
57
57
batch.Put (slKey, slValue);
@@ -68,7 +68,72 @@ class CLevelDBBatch
68
68
batch.Delete (slKey);
69
69
}
70
70
};
71
+
72
+ class CLevelDBIterator
73
+ {
74
+ private:
75
+ leveldb::Iterator *piter;
76
+ const std::vector<unsigned char > *obfuscate_key;
77
+
78
+ public:
79
+
80
+ /* *
81
+ * @param[in] piterIn The original leveldb iterator.
82
+ * @param[in] obfuscate_key If passed, XOR data with this key.
83
+ */
84
+ CLevelDBIterator (leveldb::Iterator *piterIn, const std::vector<unsigned char >* obfuscate_key) :
85
+ piter (piterIn), obfuscate_key(obfuscate_key) { };
86
+ ~CLevelDBIterator ();
87
+
88
+ bool Valid ();
71
89
90
+ void SeekToFirst ();
91
+ void SeekToLast ();
92
+
93
+ template <typename K> void Seek (const K& key) {
94
+ CDataStream ssKey (SER_DISK, CLIENT_VERSION);
95
+ ssKey.reserve (ssKey.GetSerializeSize (key));
96
+ ssKey << key;
97
+ leveldb::Slice slKey (&ssKey[0 ], ssKey.size ());
98
+ piter->Seek (slKey);
99
+ }
100
+
101
+ void Next ();
102
+ void Prev ();
103
+
104
+ template <typename K> bool GetKey (K& key) {
105
+ leveldb::Slice slKey = piter->key ();
106
+ try {
107
+ CDataStream ssKey (slKey.data (), slKey.data () + slKey.size (), SER_DISK, CLIENT_VERSION);
108
+ ssKey >> key;
109
+ } catch (std::exception &e) {
110
+ return false ;
111
+ }
112
+ return true ;
113
+ }
114
+
115
+ unsigned int GetKeySize () {
116
+ return piter->key ().size ();
117
+ }
118
+
119
+ template <typename V> bool GetValue (V& value) {
120
+ leveldb::Slice slValue = piter->value ();
121
+ try {
122
+ CDataStream ssValue (slValue.data (), slValue.data () + slValue.size (), SER_DISK, CLIENT_VERSION);
123
+ ssValue.Xor (*obfuscate_key);
124
+ ssValue >> value;
125
+ } catch (std::exception &e) {
126
+ return false ;
127
+ }
128
+ return true ;
129
+ }
130
+
131
+ unsigned int GetValueSize () {
132
+ return piter->value ().size ();
133
+ }
134
+
135
+ };
136
+
72
137
class CLevelDBWrapper
73
138
{
74
139
private:
@@ -145,7 +210,7 @@ class CLevelDBWrapper
145
210
template <typename K, typename V>
146
211
bool Write (const K& key, const V& value, bool fSync = false ) throw(leveldb_error)
147
212
{
148
- CLevelDBBatch batch (obfuscate_key);
213
+ CLevelDBBatch batch (& obfuscate_key);
149
214
batch.Write (key, value);
150
215
return WriteBatch (batch, fSync );
151
216
}
@@ -172,7 +237,7 @@ class CLevelDBWrapper
172
237
template <typename K>
173
238
bool Erase (const K& key, bool fSync = false ) throw(leveldb_error)
174
239
{
175
- CLevelDBBatch batch (obfuscate_key);
240
+ CLevelDBBatch batch (& obfuscate_key);
176
241
batch.Erase (key);
177
242
return WriteBatch (batch, fSync );
178
243
}
@@ -187,14 +252,13 @@ class CLevelDBWrapper
187
252
188
253
bool Sync () throw(leveldb_error)
189
254
{
190
- CLevelDBBatch batch (obfuscate_key);
255
+ CLevelDBBatch batch (& obfuscate_key);
191
256
return WriteBatch (batch, true );
192
257
}
193
258
194
- // not exactly clean encapsulation, but it's easiest for now
195
- leveldb::Iterator* NewIterator ()
259
+ CLevelDBIterator *NewIterator ()
196
260
{
197
- return pdb->NewIterator (iteroptions);
261
+ return new CLevelDBIterator ( pdb->NewIterator (iteroptions), &obfuscate_key );
198
262
}
199
263
200
264
/* *
0 commit comments