22
22
#include < string>
23
23
#include < memory>
24
24
25
+ #include < pthread.h>
26
+
25
27
#include " modsecurity/variable_value.h"
26
28
#include " src/utils/regex.h"
27
29
#include " src/variables/variable.h"
@@ -36,22 +38,17 @@ namespace backend {
36
38
#ifdef WITH_LMDB
37
39
38
40
LMDB::LMDB (std::string name) :
39
- Collection(name), m_env(NULL ) {
40
- MDB_txn *txn;
41
- mdb_env_create (&m_env);
42
- mdb_env_open (m_env, " ./modsec-shared-collections" ,
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);
47
- }
48
-
41
+ Collection(name), m_env(NULL ), isOpen(false ) {}
49
42
50
- LMDB::~LMDB () {
51
- mdb_env_close (m_env);
43
+ int LMDB::txn_begin (unsigned int flags, MDB_txn **ret) {
44
+ if (!isOpen) {
45
+ m_env = MDBEnvProvider::GetInstance ().GetEnv ();
46
+ m_dbi = *(MDBEnvProvider::GetInstance ().GetDBI ());
47
+ isOpen = true ;
48
+ }
49
+ return mdb_txn_begin (m_env, NULL , flags, ret);
52
50
}
53
51
54
-
55
52
void LMDB::string2val (const std::string& str, MDB_val *val) {
56
53
val->mv_size = sizeof (char )*(str.size ());
57
54
val->mv_data = const_cast <char *>(str.c_str ());
@@ -159,7 +156,7 @@ std::unique_ptr<std::string> LMDB::resolveFirst(const std::string& var) {
159
156
160
157
string2val (var, &mdb_key);
161
158
162
- rc = mdb_txn_begin (m_env, NULL , MDB_RDONLY, &txn);
159
+ rc = txn_begin ( MDB_RDONLY, &txn);
163
160
lmdb_debug (rc, " txn" , " resolveFirst" );
164
161
if (rc != 0 ) {
165
162
goto end_txn;
@@ -192,7 +189,7 @@ bool LMDB::storeOrUpdateFirst(const std::string &key,
192
189
string2val (key, &mdb_key);
193
190
string2val (value, &mdb_value);
194
191
195
- rc = mdb_txn_begin (m_env, NULL , 0 , &txn);
192
+ rc = txn_begin ( 0 , &txn);
196
193
lmdb_debug (rc, " txn" , " storeOrUpdateFirst" );
197
194
if (rc != 0 ) {
198
195
goto end_txn;
@@ -240,7 +237,7 @@ void LMDB::resolveSingleMatch(const std::string& var,
240
237
MDB_val mdb_value_ret;
241
238
MDB_cursor *cursor;
242
239
243
- rc = mdb_txn_begin (m_env, NULL , MDB_RDONLY, &txn);
240
+ rc = txn_begin ( MDB_RDONLY, &txn);
244
241
lmdb_debug (rc, " txn" , " resolveSingleMatch" );
245
242
if (rc != 0 ) {
246
243
goto end_txn;
@@ -271,7 +268,7 @@ void LMDB::store(std::string key, std::string value) {
271
268
int rc;
272
269
MDB_stat mst;
273
270
274
- rc = mdb_txn_begin (m_env, NULL , 0 , &txn);
271
+ rc = txn_begin ( 0 , &txn);
275
272
lmdb_debug (rc, " txn" , " store" );
276
273
if (rc != 0 ) {
277
274
goto end_txn;
@@ -310,7 +307,7 @@ bool LMDB::updateFirst(const std::string &key,
310
307
MDB_val mdb_value;
311
308
MDB_val mdb_value_ret;
312
309
313
- rc = mdb_txn_begin (m_env, NULL , 0 , &txn);
310
+ rc = txn_begin ( 0 , &txn);
314
311
lmdb_debug (rc, " txn" , " updateFirst" );
315
312
if (rc != 0 ) {
316
313
goto end_txn;
@@ -364,7 +361,7 @@ void LMDB::del(const std::string& key) {
364
361
MDB_val mdb_value_ret;
365
362
MDB_stat mst;
366
363
367
- rc = mdb_txn_begin (m_env, NULL , 0 , &txn);
364
+ rc = txn_begin ( 0 , &txn);
368
365
lmdb_debug (rc, " txn" , " del" );
369
366
if (rc != 0 ) {
370
367
goto end_txn;
@@ -411,7 +408,7 @@ void LMDB::resolveMultiMatches(const std::string& var,
411
408
size_t keySize = var.size ();
412
409
MDB_cursor *cursor;
413
410
414
- rc = mdb_txn_begin (m_env, NULL , MDB_RDONLY, &txn);
411
+ rc = txn_begin ( MDB_RDONLY, &txn);
415
412
lmdb_debug (rc, " txn" , " resolveMultiMatches" );
416
413
if (rc != 0 ) {
417
414
goto end_txn;
@@ -465,7 +462,7 @@ void LMDB::resolveRegularExpression(const std::string& var,
465
462
466
463
Utils::Regex r (var, true );
467
464
468
- rc = mdb_txn_begin (m_env, NULL , MDB_RDONLY, &txn);
465
+ rc = txn_begin ( MDB_RDONLY, &txn);
469
466
lmdb_debug (rc, " txn" , " resolveRegularExpression" );
470
467
if (rc != 0 ) {
471
468
goto end_txn;
@@ -503,6 +500,30 @@ void LMDB::resolveRegularExpression(const std::string& var,
503
500
return ;
504
501
}
505
502
503
+
504
+ MDBEnvProvider::MDBEnvProvider () : m_env(NULL ) {
505
+ MDB_txn *txn;
506
+ mdb_env_create (&m_env);
507
+ mdb_env_open (m_env, " ./modsec-shared-collections" ,
508
+ MDB_WRITEMAP | MDB_NOSUBDIR, 0664 );
509
+ mdb_txn_begin (m_env, NULL , 0 , &txn);
510
+ mdb_dbi_open (txn, NULL , MDB_CREATE | MDB_DUPSORT, &m_dbi);
511
+ mdb_txn_commit (txn);
512
+ }
513
+
514
+ MDB_env* MDBEnvProvider::GetEnv () {
515
+ return m_env;
516
+ }
517
+
518
+ MDB_dbi* MDBEnvProvider::GetDBI () {
519
+ return &m_dbi;
520
+ }
521
+
522
+ MDBEnvProvider::~MDBEnvProvider () {
523
+ mdb_dbi_close (m_env, m_dbi);
524
+ mdb_env_close (m_env);
525
+ }
526
+
506
527
#endif
507
528
508
529
} // namespace backend
0 commit comments