diff options
Diffstat (limited to 'store/database.cpp')
-rw-r--r-- | store/database.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/store/database.cpp b/store/database.cpp new file mode 100644 index 0000000..d6fe7c0 --- /dev/null +++ b/store/database.cpp | |||
@@ -0,0 +1,90 @@ | |||
1 | #include "database.h" | ||
2 | |||
3 | #include <iostream> | ||
4 | #include <QDir> | ||
5 | #include <QString> | ||
6 | #include <QTime> | ||
7 | #include <qdebug.h> | ||
8 | |||
9 | Database::Database() | ||
10 | { | ||
11 | int rc; | ||
12 | |||
13 | QDir dir; | ||
14 | dir.mkdir("./testdb"); | ||
15 | |||
16 | //create file | ||
17 | rc = mdb_env_create(&env); | ||
18 | rc = mdb_env_open(env, "./testdb", 0, 0664); | ||
19 | const int dbSize = 10485760*100; //10MB * 100 | ||
20 | mdb_env_set_mapsize(env, dbSize); | ||
21 | |||
22 | if (rc) { | ||
23 | std::cerr << "mdb_env_open: " << rc << mdb_strerror(rc) << std::endl; | ||
24 | } | ||
25 | } | ||
26 | |||
27 | Database::~Database() | ||
28 | { | ||
29 | mdb_close(env, dbi); | ||
30 | mdb_env_close(env); | ||
31 | } | ||
32 | |||
33 | MDB_txn *Database::startTransaction() | ||
34 | { | ||
35 | int rc; | ||
36 | MDB_txn *transaction; | ||
37 | rc = mdb_txn_begin(env, NULL, 0, &transaction); | ||
38 | rc = mdb_open(transaction, NULL, 0, &dbi); | ||
39 | return transaction; | ||
40 | } | ||
41 | |||
42 | void Database::endTransaction(MDB_txn *transaction) | ||
43 | { | ||
44 | int rc; | ||
45 | rc = mdb_txn_commit(transaction); | ||
46 | if (rc) { | ||
47 | std::cerr << "mdb_txn_commit: " << rc << mdb_strerror(rc) << std::endl; | ||
48 | } | ||
49 | } | ||
50 | |||
51 | |||
52 | void Database::write(const std::string &sKey, const std::string &sValue, MDB_txn *transaction) | ||
53 | { | ||
54 | int rc; | ||
55 | MDB_val key, data; | ||
56 | key.mv_size = sKey.size(); | ||
57 | key.mv_data = (void*)sKey.data(); | ||
58 | data.mv_size = sValue.size(); | ||
59 | data.mv_data = (void*)sValue.data(); | ||
60 | rc = mdb_put(transaction, dbi, &key, &data, 0); | ||
61 | if (rc) { | ||
62 | std::cerr << "mdb_put: " << rc << mdb_strerror(rc) << std::endl; | ||
63 | } | ||
64 | } | ||
65 | |||
66 | void Database::read(const std::string &sKey) | ||
67 | { | ||
68 | int rc; | ||
69 | MDB_txn *txn; | ||
70 | MDB_val key; | ||
71 | MDB_val data; | ||
72 | MDB_cursor *cursor; | ||
73 | |||
74 | key.mv_size = sKey.size(); | ||
75 | key.mv_data = (void*)sKey.data(); | ||
76 | |||
77 | rc = mdb_txn_begin(env, NULL, MDB_RDONLY, &txn); | ||
78 | rc = mdb_cursor_open(txn, dbi, &cursor); | ||
79 | // while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) { | ||
80 | if ((rc = mdb_cursor_get(cursor, &key, &data, MDB_SET)) == 0) { | ||
81 | const std::string resultKey(static_cast<char*>(key.mv_data), key.mv_size); | ||
82 | const std::string resultValue(static_cast<char*>(data.mv_data), data.mv_size); | ||
83 | // std::cout << "key: " << resultKey << " data: " << resultValue << std::endl; | ||
84 | } else { | ||
85 | std::cout << "couldn't find value " << sKey << std::endl; | ||
86 | } | ||
87 | mdb_cursor_close(cursor); | ||
88 | mdb_txn_abort(txn); | ||
89 | } | ||
90 | |||