@@ -32,13 +32,13 @@ class CLevelDBBatch
3232
3333private:
3434 leveldb::WriteBatch batch;
35- const std::vector<unsigned char > obfuscate_key;
35+ const std::vector<unsigned char > * obfuscate_key;
3636
3737public:
3838 /* *
3939 * @param[in] obfuscate_key If passed, XOR data with this key.
4040 */
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) { };
4242
4343 template <typename K, typename V>
4444 void Write (const K& key, const V& value)
@@ -51,7 +51,7 @@ class CLevelDBBatch
5151 CDataStream ssValue (SER_DISK , CLIENT_VERSION );
5252 ssValue.reserve (ssValue.GetSerializeSize (value));
5353 ssValue << value;
54- ssValue.Xor (obfuscate_key);
54+ ssValue.Xor (* obfuscate_key);
5555 leveldb::Slice slValue (&ssValue[0 ], ssValue.size ());
5656
5757 batch.Put (slKey, slValue);
@@ -68,7 +68,72 @@ class CLevelDBBatch
6868 batch.Delete (slKey);
6969 }
7070};
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 ();
7189
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+
72137class CLevelDBWrapper
73138{
74139private:
@@ -145,7 +210,7 @@ class CLevelDBWrapper
145210 template <typename K, typename V>
146211 bool Write (const K& key, const V& value, bool fSync = false ) throw(leveldb_error)
147212 {
148- CLevelDBBatch batch (obfuscate_key);
213+ CLevelDBBatch batch (& obfuscate_key);
149214 batch.Write (key, value);
150215 return WriteBatch (batch, fSync );
151216 }
@@ -172,7 +237,7 @@ class CLevelDBWrapper
172237 template <typename K>
173238 bool Erase (const K& key, bool fSync = false ) throw(leveldb_error)
174239 {
175- CLevelDBBatch batch (obfuscate_key);
240+ CLevelDBBatch batch (& obfuscate_key);
176241 batch.Erase (key);
177242 return WriteBatch (batch, fSync );
178243 }
@@ -187,14 +252,13 @@ class CLevelDBWrapper
187252
188253 bool Sync () throw(leveldb_error)
189254 {
190- CLevelDBBatch batch (obfuscate_key);
255+ CLevelDBBatch batch (& obfuscate_key);
191256 return WriteBatch (batch, true );
192257 }
193258
194- // not exactly clean encapsulation, but it's easiest for now
195- leveldb::Iterator* NewIterator ()
259+ CLevelDBIterator *NewIterator ()
196260 {
197- return pdb->NewIterator (iteroptions);
261+ return new CLevelDBIterator ( pdb->NewIterator (iteroptions), &obfuscate_key );
198262 }
199263
200264 /* *
0 commit comments