@@ -37,9 +37,13 @@ namespace backend {
37
37
38
38
LMDB::LMDB (std::string name) :
39
39
Collection(name), m_env(NULL ) {
40
+ MDB_txn *txn;
40
41
mdb_env_create (&m_env);
41
42
mdb_env_open (m_env, " ./modsec-shared-collections" ,
42
43
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);
43
47
}
44
48
45
49
@@ -89,23 +93,6 @@ void LMDB::lmdb_debug(int rc, std::string op, std::string scope) {
89
93
break ;
90
94
}
91
95
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;
109
96
} else if (op == " get" ) {
110
97
std::cout << scope << " , LMDB failure while getting the key: " ;
111
98
switch (rc) {
@@ -169,21 +156,15 @@ std::unique_ptr<std::string> LMDB::resolveFirst(const std::string& var) {
169
156
MDB_val mdb_value_ret;
170
157
std::unique_ptr<std::string> ret = NULL ;
171
158
MDB_txn *txn = NULL ;
172
- MDB_dbi dbi;
173
159
174
160
string2val (var, &mdb_key);
175
161
176
- rc = mdb_txn_begin (m_env, NULL , 0 , &txn);
162
+ rc = mdb_txn_begin (m_env, NULL , MDB_RDONLY , &txn);
177
163
lmdb_debug (rc, " txn" , " resolveFirst" );
178
164
if (rc != 0 ) {
179
165
goto end_txn;
180
166
}
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);
187
168
lmdb_debug (rc, " get" , " resolveFirst" );
188
169
if (rc != 0 ) {
189
170
goto end_get;
@@ -194,8 +175,6 @@ std::unique_ptr<std::string> LMDB::resolveFirst(const std::string& var) {
194
175
mdb_value_ret.mv_size ));
195
176
196
177
end_get:
197
- mdb_dbi_close (m_env, dbi);
198
- end_dbi:
199
178
mdb_txn_abort (txn);
200
179
end_txn:
201
180
return ret;
@@ -206,7 +185,6 @@ bool LMDB::storeOrUpdateFirst(const std::string &key,
206
185
const std::string &value) {
207
186
int rc;
208
187
MDB_txn *txn;
209
- MDB_dbi dbi;
210
188
MDB_val mdb_key;
211
189
MDB_val mdb_value;
212
190
MDB_val mdb_value_ret;
@@ -220,23 +198,17 @@ bool LMDB::storeOrUpdateFirst(const std::string &key,
220
198
goto end_txn;
221
199
}
222
200
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);
230
202
lmdb_debug (rc, " get" , " storeOrUpdateFirst" );
231
203
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);
233
205
lmdb_debug (rc, " del" , " storeOrUpdateFirst" );
234
206
if (rc != 0 ) {
235
207
goto end_del;
236
208
}
237
209
}
238
210
239
- rc = mdb_put (txn, dbi , &mdb_key, &mdb_value, 0 );
211
+ rc = mdb_put (txn, m_dbi , &mdb_key, &mdb_value, 0 );
240
212
lmdb_debug (rc, " put" , " storeOrUpdateFirst" );
241
213
if (rc != 0 ) {
242
214
goto end_put;
@@ -248,14 +220,12 @@ bool LMDB::storeOrUpdateFirst(const std::string &key,
248
220
goto end_commit;
249
221
}
250
222
251
- end_commit:
252
223
end_put:
253
224
end_del:
254
- mdb_dbi_close (m_env, dbi);
255
- end_dbi:
256
225
if (rc != 0 ) {
257
226
mdb_txn_abort (txn);
258
227
}
228
+ end_commit:
259
229
end_txn:
260
230
return true ;
261
231
}
@@ -265,26 +235,20 @@ void LMDB::resolveSingleMatch(const std::string& var,
265
235
std::vector<const VariableValue *> *l) {
266
236
int rc;
267
237
MDB_txn *txn;
268
- MDB_dbi dbi;
269
238
MDB_val mdb_key;
270
239
MDB_val mdb_value;
271
240
MDB_val mdb_value_ret;
272
241
MDB_cursor *cursor;
273
242
274
- rc = mdb_txn_begin (m_env, NULL , 0 , &txn);
243
+ rc = mdb_txn_begin (m_env, NULL , MDB_RDONLY , &txn);
275
244
lmdb_debug (rc, " txn" , " resolveSingleMatch" );
276
245
if (rc != 0 ) {
277
246
goto end_txn;
278
247
}
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
- }
284
248
285
249
string2val (var, &mdb_key);
286
250
287
- mdb_cursor_open (txn, dbi , &cursor);
251
+ mdb_cursor_open (txn, m_dbi , &cursor);
288
252
while ((rc = mdb_cursor_get (cursor, &mdb_key,
289
253
&mdb_value_ret, MDB_NEXT_DUP)) == 0 ) {
290
254
std::string *a = new std::string (
@@ -295,9 +259,6 @@ void LMDB::resolveSingleMatch(const std::string& var,
295
259
}
296
260
297
261
mdb_cursor_close (cursor);
298
-
299
- mdb_dbi_close (m_env, dbi);
300
- end_dbi:
301
262
mdb_txn_abort (txn);
302
263
end_txn:
303
264
return ;
@@ -307,7 +268,6 @@ void LMDB::resolveSingleMatch(const std::string& var,
307
268
void LMDB::store (std::string key, std::string value) {
308
269
MDB_val mdb_key, mdb_data;
309
270
MDB_txn *txn = NULL ;
310
- MDB_dbi dbi;
311
271
int rc;
312
272
MDB_stat mst;
313
273
@@ -316,15 +276,10 @@ void LMDB::store(std::string key, std::string value) {
316
276
if (rc != 0 ) {
317
277
goto end_txn;
318
278
}
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
- }
324
279
325
280
string2val (key, &mdb_key);
326
281
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 );
328
283
lmdb_debug (rc, " put" , " store" );
329
284
if (rc != 0 ) {
330
285
goto end_put;
@@ -336,13 +291,12 @@ void LMDB::store(std::string key, std::string value) {
336
291
goto end_commit;
337
292
}
338
293
339
- end_commit:
340
294
end_put:
341
- mdb_dbi_close (m_env, dbi);
342
295
end_dbi:
343
296
if (rc != 0 ) {
344
297
mdb_txn_abort (txn);
345
298
}
299
+ end_commit:
346
300
end_txn:
347
301
return ;
348
302
}
@@ -352,7 +306,6 @@ bool LMDB::updateFirst(const std::string &key,
352
306
const std::string &value) {
353
307
int rc;
354
308
MDB_txn *txn;
355
- MDB_dbi dbi;
356
309
MDB_val mdb_key;
357
310
MDB_val mdb_value;
358
311
MDB_val mdb_value_ret;
@@ -363,28 +316,22 @@ bool LMDB::updateFirst(const std::string &key,
363
316
goto end_txn;
364
317
}
365
318
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
-
372
319
string2val (key, &mdb_key);
373
320
string2val (value, &mdb_value);
374
321
375
- rc = mdb_get (txn, dbi , &mdb_key, &mdb_value_ret);
322
+ rc = mdb_get (txn, m_dbi , &mdb_key, &mdb_value_ret);
376
323
lmdb_debug (rc, " get" , " updateFirst" );
377
324
if (rc != 0 ) {
378
325
goto end_get;
379
326
}
380
327
381
- rc = mdb_del (txn, dbi , &mdb_key, &mdb_value_ret);
328
+ rc = mdb_del (txn, m_dbi , &mdb_key, &mdb_value_ret);
382
329
lmdb_debug (rc, " del" , " updateFirst" );
383
330
if (rc != 0 ) {
384
331
goto end_del;
385
332
}
386
333
387
- rc = mdb_put (txn, dbi , &mdb_key, &mdb_value, 0 );
334
+ rc = mdb_put (txn, m_dbi , &mdb_key, &mdb_value, 0 );
388
335
lmdb_debug (rc, " put" , " updateFirst" );
389
336
if (rc != 0 ) {
390
337
goto end_put;
@@ -396,15 +343,13 @@ bool LMDB::updateFirst(const std::string &key,
396
343
goto end_commit;
397
344
}
398
345
399
- end_commit:
400
346
end_put:
401
347
end_del:
402
348
end_get:
403
- mdb_dbi_close (m_env, dbi);
404
- end_dbi:
405
349
if (rc != 0 ) {
406
350
mdb_txn_abort (txn);
407
351
}
352
+ end_commit:
408
353
end_txn:
409
354
410
355
return rc == 0 ;
@@ -414,7 +359,6 @@ bool LMDB::updateFirst(const std::string &key,
414
359
void LMDB::del (const std::string& key) {
415
360
int rc;
416
361
MDB_txn *txn;
417
- MDB_dbi dbi;
418
362
MDB_val mdb_key;
419
363
MDB_val mdb_value;
420
364
MDB_val mdb_value_ret;
@@ -426,21 +370,15 @@ void LMDB::del(const std::string& key) {
426
370
goto end_txn;
427
371
}
428
372
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
-
435
373
string2val (key, &mdb_key);
436
374
437
- rc = mdb_get (txn, dbi , &mdb_key, &mdb_value_ret);
375
+ rc = mdb_get (txn, m_dbi , &mdb_key, &mdb_value_ret);
438
376
lmdb_debug (rc, " get" , " del" );
439
377
if (rc != 0 ) {
440
378
goto end_get;
441
379
}
442
380
443
- rc = mdb_del (txn, dbi , &mdb_key, &mdb_value_ret);
381
+ rc = mdb_del (txn, m_dbi , &mdb_key, &mdb_value_ret);
444
382
lmdb_debug (rc, " del" , " del" );
445
383
if (rc != 0 ) {
446
384
goto end_del;
@@ -452,14 +390,12 @@ void LMDB::del(const std::string& key) {
452
390
goto end_commit;
453
391
}
454
392
455
- end_commit:
456
393
end_del:
457
394
end_get:
458
- mdb_dbi_close (m_env, dbi);
459
- end_dbi:
460
395
if (rc != 0 ) {
461
396
mdb_txn_abort (txn);
462
397
}
398
+ end_commit:
463
399
end_txn:
464
400
return ;
465
401
}
@@ -470,25 +406,18 @@ void LMDB::resolveMultiMatches(const std::string& var,
470
406
variables::KeyExclusions &ke) {
471
407
MDB_val key, data;
472
408
MDB_txn *txn = NULL ;
473
- MDB_dbi dbi;
474
409
int rc;
475
410
MDB_stat mst;
476
411
size_t keySize = var.size ();
477
412
MDB_cursor *cursor;
478
413
479
- rc = mdb_txn_begin (m_env, NULL , 0 , &txn);
414
+ rc = mdb_txn_begin (m_env, NULL , MDB_RDONLY , &txn);
480
415
lmdb_debug (rc, " txn" , " resolveMultiMatches" );
481
416
if (rc != 0 ) {
482
417
goto end_txn;
483
418
}
484
419
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);
492
421
lmdb_debug (rc, " cursor_open" , " resolveMultiMatches" );
493
422
if (rc != 0 ) {
494
423
goto end_cursor_open;
@@ -519,8 +448,6 @@ void LMDB::resolveMultiMatches(const std::string& var,
519
448
520
449
mdb_cursor_close (cursor);
521
450
end_cursor_open:
522
- mdb_dbi_close (m_env, dbi);
523
- end_dbi:
524
451
mdb_txn_abort (txn);
525
452
end_txn:
526
453
return ;
@@ -532,26 +459,19 @@ void LMDB::resolveRegularExpression(const std::string& var,
532
459
variables::KeyExclusions &ke) {
533
460
MDB_val key, data;
534
461
MDB_txn *txn = NULL ;
535
- MDB_dbi dbi;
536
462
int rc;
537
463
MDB_stat mst;
538
464
MDB_cursor *cursor;
539
465
540
466
Utils::Regex r (var, true );
541
467
542
- rc = mdb_txn_begin (m_env, NULL , 0 , &txn);
468
+ rc = mdb_txn_begin (m_env, NULL , MDB_RDONLY , &txn);
543
469
lmdb_debug (rc, " txn" , " resolveRegularExpression" );
544
470
if (rc != 0 ) {
545
471
goto end_txn;
546
472
}
547
473
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);
555
475
lmdb_debug (rc, " cursor_open" , " resolveRegularExpression" );
556
476
if (rc != 0 ) {
557
477
goto end_cursor_open;
@@ -578,8 +498,6 @@ void LMDB::resolveRegularExpression(const std::string& var,
578
498
579
499
mdb_cursor_close (cursor);
580
500
end_cursor_open:
581
- mdb_dbi_close (m_env, dbi);
582
- end_dbi:
583
501
mdb_txn_abort (txn);
584
502
end_txn:
585
503
return ;
0 commit comments