@@ -37,9 +37,13 @@ namespace backend {
3737
3838LMDB::LMDB (std::string name) :
3939 Collection(name), m_env(NULL ) {
40+ MDB_txn *txn;
4041 mdb_env_create (&m_env);
4142 mdb_env_open (m_env, " ./modsec-shared-collections" ,
4243 MDB_WRITEMAP | MDB_NOSUBDIR, 0664 );
44+ mdb_txn_begin (m_env, NULL , 0 , &txn);
45+ mdb_dbi_open (txn, NULL , MDB_CREATE | MDB_DUPSORT, &m_dbi);
46+ mdb_txn_commit (txn);
4347}
4448
4549
@@ -89,23 +93,6 @@ void LMDB::lmdb_debug(int rc, std::string op, std::string scope) {
8993 break ;
9094 }
9195 std::cout << std::endl;
92- } else if (op == " dbi" ) {
93- std::cout << scope << " , LMDB failure while opening dbi: " ;
94- switch (rc) {
95- case MDB_NOTFOUND:
96- std::cout << " not found: the specified database doesn't " ;
97- std::cout << " exist in the environment and MDB_CREATE was " ;
98- std::cout << " not specified." ;
99- break ;
100- case MDB_DBS_FULL:
101- std::cout << " full: too many databases have been opened. See " ;
102- std::cout << " mdb_env_set_maxdbs()." ;
103- break ;
104- default :
105- std::cout << " not sure what is wrong." ;
106- break ;
107- }
108- std::cout << std::endl;
10996 } else if (op == " get" ) {
11097 std::cout << scope << " , LMDB failure while getting the key: " ;
11198 switch (rc) {
@@ -169,21 +156,15 @@ std::unique_ptr<std::string> LMDB::resolveFirst(const std::string& var) {
169156 MDB_val mdb_value_ret;
170157 std::unique_ptr<std::string> ret = NULL ;
171158 MDB_txn *txn = NULL ;
172- MDB_dbi dbi;
173159
174160 string2val (var, &mdb_key);
175161
176- rc = mdb_txn_begin (m_env, NULL , 0 , &txn);
162+ rc = mdb_txn_begin (m_env, NULL , MDB_RDONLY , &txn);
177163 lmdb_debug (rc, " txn" , " resolveFirst" );
178164 if (rc != 0 ) {
179165 goto end_txn;
180166 }
181- rc = mdb_dbi_open (txn, NULL , MDB_CREATE | MDB_DUPSORT, &dbi);
182- lmdb_debug (rc, " dbi" , " resolveFirst" );
183- if (rc != 0 ) {
184- goto end_dbi;
185- }
186- rc = mdb_get (txn, dbi, &mdb_key, &mdb_value_ret);
167+ rc = mdb_get (txn, m_dbi, &mdb_key, &mdb_value_ret);
187168 lmdb_debug (rc, " get" , " resolveFirst" );
188169 if (rc != 0 ) {
189170 goto end_get;
@@ -194,8 +175,6 @@ std::unique_ptr<std::string> LMDB::resolveFirst(const std::string& var) {
194175 mdb_value_ret.mv_size ));
195176
196177end_get:
197- mdb_dbi_close (m_env, dbi);
198- end_dbi:
199178 mdb_txn_abort (txn);
200179end_txn:
201180 return ret;
@@ -206,7 +185,6 @@ bool LMDB::storeOrUpdateFirst(const std::string &key,
206185 const std::string &value) {
207186 int rc;
208187 MDB_txn *txn;
209- MDB_dbi dbi;
210188 MDB_val mdb_key;
211189 MDB_val mdb_value;
212190 MDB_val mdb_value_ret;
@@ -220,23 +198,17 @@ bool LMDB::storeOrUpdateFirst(const std::string &key,
220198 goto end_txn;
221199 }
222200
223- rc = mdb_dbi_open (txn, NULL , MDB_CREATE | MDB_DUPSORT, &dbi);
224- lmdb_debug (rc, " dbi" , " storeOrUpdateFirst" );
225- if (rc != 0 ) {
226- goto end_dbi;
227- }
228-
229- rc = mdb_get (txn, dbi, &mdb_key, &mdb_value_ret);
201+ rc = mdb_get (txn, m_dbi, &mdb_key, &mdb_value_ret);
230202 lmdb_debug (rc, " get" , " storeOrUpdateFirst" );
231203 if (rc == 0 ) {
232- rc = mdb_del (txn, dbi , &mdb_key, &mdb_value_ret);
204+ rc = mdb_del (txn, m_dbi , &mdb_key, &mdb_value_ret);
233205 lmdb_debug (rc, " del" , " storeOrUpdateFirst" );
234206 if (rc != 0 ) {
235207 goto end_del;
236208 }
237209 }
238210
239- rc = mdb_put (txn, dbi , &mdb_key, &mdb_value, 0 );
211+ rc = mdb_put (txn, m_dbi , &mdb_key, &mdb_value, 0 );
240212 lmdb_debug (rc, " put" , " storeOrUpdateFirst" );
241213 if (rc != 0 ) {
242214 goto end_put;
@@ -248,14 +220,12 @@ bool LMDB::storeOrUpdateFirst(const std::string &key,
248220 goto end_commit;
249221 }
250222
251- end_commit:
252223end_put:
253224end_del:
254- mdb_dbi_close (m_env, dbi);
255- end_dbi:
256225 if (rc != 0 ) {
257226 mdb_txn_abort (txn);
258227 }
228+ end_commit:
259229end_txn:
260230 return true ;
261231}
@@ -265,26 +235,20 @@ void LMDB::resolveSingleMatch(const std::string& var,
265235 std::vector<const VariableValue *> *l) {
266236 int rc;
267237 MDB_txn *txn;
268- MDB_dbi dbi;
269238 MDB_val mdb_key;
270239 MDB_val mdb_value;
271240 MDB_val mdb_value_ret;
272241 MDB_cursor *cursor;
273242
274- rc = mdb_txn_begin (m_env, NULL , 0 , &txn);
243+ rc = mdb_txn_begin (m_env, NULL , MDB_RDONLY , &txn);
275244 lmdb_debug (rc, " txn" , " resolveSingleMatch" );
276245 if (rc != 0 ) {
277246 goto end_txn;
278247 }
279- rc = mdb_dbi_open (txn, NULL , MDB_CREATE | MDB_DUPSORT, &dbi);
280- lmdb_debug (rc, " dbi" , " resolveSingleMatch" );
281- if (rc != 0 ) {
282- goto end_dbi;
283- }
284248
285249 string2val (var, &mdb_key);
286250
287- mdb_cursor_open (txn, dbi , &cursor);
251+ mdb_cursor_open (txn, m_dbi , &cursor);
288252 while ((rc = mdb_cursor_get (cursor, &mdb_key,
289253 &mdb_value_ret, MDB_NEXT_DUP)) == 0 ) {
290254 std::string *a = new std::string (
@@ -295,9 +259,6 @@ void LMDB::resolveSingleMatch(const std::string& var,
295259 }
296260
297261 mdb_cursor_close (cursor);
298-
299- mdb_dbi_close (m_env, dbi);
300- end_dbi:
301262 mdb_txn_abort (txn);
302263end_txn:
303264 return ;
@@ -307,7 +268,6 @@ void LMDB::resolveSingleMatch(const std::string& var,
307268void LMDB::store (std::string key, std::string value) {
308269 MDB_val mdb_key, mdb_data;
309270 MDB_txn *txn = NULL ;
310- MDB_dbi dbi;
311271 int rc;
312272 MDB_stat mst;
313273
@@ -316,15 +276,10 @@ void LMDB::store(std::string key, std::string value) {
316276 if (rc != 0 ) {
317277 goto end_txn;
318278 }
319- rc = mdb_dbi_open (txn, NULL , MDB_CREATE | MDB_DUPSORT, &dbi);
320- lmdb_debug (rc, " dbi" , " store" );
321- if (rc != 0 ) {
322- goto end_dbi;
323- }
324279
325280 string2val (key, &mdb_key);
326281 string2val (value, &mdb_data);
327- rc = mdb_put (txn, dbi , &mdb_key, &mdb_data, 0 );
282+ rc = mdb_put (txn, m_dbi , &mdb_key, &mdb_data, 0 );
328283 lmdb_debug (rc, " put" , " store" );
329284 if (rc != 0 ) {
330285 goto end_put;
@@ -336,13 +291,12 @@ void LMDB::store(std::string key, std::string value) {
336291 goto end_commit;
337292 }
338293
339- end_commit:
340294end_put:
341- mdb_dbi_close (m_env, dbi);
342295end_dbi:
343296 if (rc != 0 ) {
344297 mdb_txn_abort (txn);
345298 }
299+ end_commit:
346300end_txn:
347301 return ;
348302}
@@ -352,7 +306,6 @@ bool LMDB::updateFirst(const std::string &key,
352306 const std::string &value) {
353307 int rc;
354308 MDB_txn *txn;
355- MDB_dbi dbi;
356309 MDB_val mdb_key;
357310 MDB_val mdb_value;
358311 MDB_val mdb_value_ret;
@@ -363,28 +316,22 @@ bool LMDB::updateFirst(const std::string &key,
363316 goto end_txn;
364317 }
365318
366- rc = mdb_dbi_open (txn, NULL , MDB_CREATE | MDB_DUPSORT, &dbi);
367- lmdb_debug (rc, " dbi" , " updateFirst" );
368- if (rc != 0 ) {
369- goto end_dbi;
370- }
371-
372319 string2val (key, &mdb_key);
373320 string2val (value, &mdb_value);
374321
375- rc = mdb_get (txn, dbi , &mdb_key, &mdb_value_ret);
322+ rc = mdb_get (txn, m_dbi , &mdb_key, &mdb_value_ret);
376323 lmdb_debug (rc, " get" , " updateFirst" );
377324 if (rc != 0 ) {
378325 goto end_get;
379326 }
380327
381- rc = mdb_del (txn, dbi , &mdb_key, &mdb_value_ret);
328+ rc = mdb_del (txn, m_dbi , &mdb_key, &mdb_value_ret);
382329 lmdb_debug (rc, " del" , " updateFirst" );
383330 if (rc != 0 ) {
384331 goto end_del;
385332 }
386333
387- rc = mdb_put (txn, dbi , &mdb_key, &mdb_value, 0 );
334+ rc = mdb_put (txn, m_dbi , &mdb_key, &mdb_value, 0 );
388335 lmdb_debug (rc, " put" , " updateFirst" );
389336 if (rc != 0 ) {
390337 goto end_put;
@@ -396,15 +343,13 @@ bool LMDB::updateFirst(const std::string &key,
396343 goto end_commit;
397344 }
398345
399- end_commit:
400346end_put:
401347end_del:
402348end_get:
403- mdb_dbi_close (m_env, dbi);
404- end_dbi:
405349 if (rc != 0 ) {
406350 mdb_txn_abort (txn);
407351 }
352+ end_commit:
408353end_txn:
409354
410355 return rc == 0 ;
@@ -414,7 +359,6 @@ bool LMDB::updateFirst(const std::string &key,
414359void LMDB::del (const std::string& key) {
415360 int rc;
416361 MDB_txn *txn;
417- MDB_dbi dbi;
418362 MDB_val mdb_key;
419363 MDB_val mdb_value;
420364 MDB_val mdb_value_ret;
@@ -426,21 +370,15 @@ void LMDB::del(const std::string& key) {
426370 goto end_txn;
427371 }
428372
429- rc = mdb_dbi_open (txn, NULL , MDB_CREATE | MDB_DUPSORT, &dbi);
430- lmdb_debug (rc, " dbi" , " del" );
431- if (rc != 0 ) {
432- goto end_dbi;
433- }
434-
435373 string2val (key, &mdb_key);
436374
437- rc = mdb_get (txn, dbi , &mdb_key, &mdb_value_ret);
375+ rc = mdb_get (txn, m_dbi , &mdb_key, &mdb_value_ret);
438376 lmdb_debug (rc, " get" , " del" );
439377 if (rc != 0 ) {
440378 goto end_get;
441379 }
442380
443- rc = mdb_del (txn, dbi , &mdb_key, &mdb_value_ret);
381+ rc = mdb_del (txn, m_dbi , &mdb_key, &mdb_value_ret);
444382 lmdb_debug (rc, " del" , " del" );
445383 if (rc != 0 ) {
446384 goto end_del;
@@ -452,14 +390,12 @@ void LMDB::del(const std::string& key) {
452390 goto end_commit;
453391 }
454392
455- end_commit:
456393end_del:
457394end_get:
458- mdb_dbi_close (m_env, dbi);
459- end_dbi:
460395 if (rc != 0 ) {
461396 mdb_txn_abort (txn);
462397 }
398+ end_commit:
463399end_txn:
464400 return ;
465401}
@@ -470,25 +406,18 @@ void LMDB::resolveMultiMatches(const std::string& var,
470406 variables::KeyExclusions &ke) {
471407 MDB_val key, data;
472408 MDB_txn *txn = NULL ;
473- MDB_dbi dbi;
474409 int rc;
475410 MDB_stat mst;
476411 size_t keySize = var.size ();
477412 MDB_cursor *cursor;
478413
479- rc = mdb_txn_begin (m_env, NULL , 0 , &txn);
414+ rc = mdb_txn_begin (m_env, NULL , MDB_RDONLY , &txn);
480415 lmdb_debug (rc, " txn" , " resolveMultiMatches" );
481416 if (rc != 0 ) {
482417 goto end_txn;
483418 }
484419
485- rc = mdb_dbi_open (txn, NULL , MDB_CREATE | MDB_DUPSORT, &dbi);
486- lmdb_debug (rc, " dbi" , " resolveMultiMatches" );
487- if (rc != 0 ) {
488- goto end_dbi;
489- }
490-
491- rc = mdb_cursor_open (txn, dbi, &cursor);
420+ rc = mdb_cursor_open (txn, m_dbi, &cursor);
492421 lmdb_debug (rc, " cursor_open" , " resolveMultiMatches" );
493422 if (rc != 0 ) {
494423 goto end_cursor_open;
@@ -519,8 +448,6 @@ void LMDB::resolveMultiMatches(const std::string& var,
519448
520449 mdb_cursor_close (cursor);
521450end_cursor_open:
522- mdb_dbi_close (m_env, dbi);
523- end_dbi:
524451 mdb_txn_abort (txn);
525452end_txn:
526453 return ;
@@ -532,26 +459,19 @@ void LMDB::resolveRegularExpression(const std::string& var,
532459 variables::KeyExclusions &ke) {
533460 MDB_val key, data;
534461 MDB_txn *txn = NULL ;
535- MDB_dbi dbi;
536462 int rc;
537463 MDB_stat mst;
538464 MDB_cursor *cursor;
539465
540466 Utils::Regex r (var, true );
541467
542- rc = mdb_txn_begin (m_env, NULL , 0 , &txn);
468+ rc = mdb_txn_begin (m_env, NULL , MDB_RDONLY , &txn);
543469 lmdb_debug (rc, " txn" , " resolveRegularExpression" );
544470 if (rc != 0 ) {
545471 goto end_txn;
546472 }
547473
548- rc = mdb_dbi_open (txn, NULL , MDB_CREATE | MDB_DUPSORT, &dbi);
549- lmdb_debug (rc, " dbi" , " resolveRegularExpression" );
550- if (rc != 0 ) {
551- goto end_dbi;
552- }
553-
554- rc = mdb_cursor_open (txn, dbi, &cursor);
474+ rc = mdb_cursor_open (txn, m_dbi, &cursor);
555475 lmdb_debug (rc, " cursor_open" , " resolveRegularExpression" );
556476 if (rc != 0 ) {
557477 goto end_cursor_open;
@@ -578,8 +498,6 @@ void LMDB::resolveRegularExpression(const std::string& var,
578498
579499 mdb_cursor_close (cursor);
580500end_cursor_open:
581- mdb_dbi_close (m_env, dbi);
582- end_dbi:
583501 mdb_txn_abort (txn);
584502end_txn:
585503 return ;
0 commit comments