diff options
author | Aaron Seigo <aseigo@kde.org> | 2014-12-05 09:17:46 +0100 |
---|---|---|
committer | Aaron Seigo <aseigo@kde.org> | 2014-12-05 09:17:46 +0100 |
commit | 767312e2063f4e58af3de0f27aba52de49e14295 (patch) | |
tree | 8375b55e3496ece33f59de486f3354d731b6bc1e /common/storage_kyoto.cpp | |
parent | 2b4e5743cca6a59e6e1a32b03863bf5ec4a4c30f (diff) | |
download | sink-767312e2063f4e58af3de0f27aba52de49e14295.tar.gz sink-767312e2063f4e58af3de0f27aba52de49e14295.zip |
major reorg that puts Storage (previously Database) into common
there is now a top-level tests dir, and a compile time switch for
lmdb vs kyotocabinet
Diffstat (limited to 'common/storage_kyoto.cpp')
-rw-r--r-- | common/storage_kyoto.cpp | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/common/storage_kyoto.cpp b/common/storage_kyoto.cpp new file mode 100644 index 0000000..05942c2 --- /dev/null +++ b/common/storage_kyoto.cpp | |||
@@ -0,0 +1,164 @@ | |||
1 | #include "storage.h" | ||
2 | |||
3 | #include <iostream> | ||
4 | |||
5 | #include <QAtomicInt> | ||
6 | #include <QDebug> | ||
7 | #include <QDir> | ||
8 | #include <QFileInfo> | ||
9 | #include <QReadWriteLock> | ||
10 | #include <QString> | ||
11 | #include <QTime> | ||
12 | |||
13 | #include <kchashdb.h> | ||
14 | |||
15 | class Storage::Private | ||
16 | { | ||
17 | public: | ||
18 | Private(const QString &storageRoot, const QString &name); | ||
19 | ~Private(); | ||
20 | |||
21 | kyotocabinet::TreeDB db; | ||
22 | bool dbOpen; | ||
23 | bool inTransaction; | ||
24 | }; | ||
25 | |||
26 | Storage::Private::Private(const QString &storageRoot, const QString &name) | ||
27 | : inTransaction(false) | ||
28 | { | ||
29 | QDir dir; | ||
30 | dir.mkdir(storageRoot); | ||
31 | |||
32 | //create file | ||
33 | dbOpen = db.open((storageRoot + "/" + name + ".kch").toStdString(), kyotocabinet::BasicDB::OWRITER | kyotocabinet::BasicDB::OCREATE); | ||
34 | if (!dbOpen) { | ||
35 | // TODO: handle error | ||
36 | } | ||
37 | } | ||
38 | |||
39 | Storage::Private::~Private() | ||
40 | { | ||
41 | if (dbOpen && inTransaction) { | ||
42 | db.end_transaction(false); | ||
43 | } | ||
44 | } | ||
45 | |||
46 | Storage::Storage(const QString &storageRoot, const QString &name) | ||
47 | : d(new Private(storageRoot, name)) | ||
48 | { | ||
49 | } | ||
50 | |||
51 | Storage::~Storage() | ||
52 | { | ||
53 | delete d; | ||
54 | } | ||
55 | |||
56 | bool Storage::isInTransaction() const | ||
57 | { | ||
58 | return d->inTransaction; | ||
59 | } | ||
60 | |||
61 | bool Storage::startTransaction(TransactionType type) | ||
62 | { | ||
63 | if (!d->dbOpen) { | ||
64 | return false; | ||
65 | } | ||
66 | |||
67 | if (d->inTransaction) { | ||
68 | return true; | ||
69 | } | ||
70 | |||
71 | //TODO handle errors | ||
72 | d->inTransaction = d->db.begin_transaction(); | ||
73 | return d->inTransaction; | ||
74 | } | ||
75 | |||
76 | bool Storage::commitTransaction() | ||
77 | { | ||
78 | if (!d->dbOpen) { | ||
79 | return false; | ||
80 | } | ||
81 | |||
82 | if (!d->inTransaction) { | ||
83 | return false; | ||
84 | } | ||
85 | |||
86 | bool success = d->db.end_transaction(true); | ||
87 | d->inTransaction = false; | ||
88 | return success; | ||
89 | } | ||
90 | |||
91 | void Storage::abortTransaction() | ||
92 | { | ||
93 | if (!d->dbOpen || !d->inTransaction) { | ||
94 | return; | ||
95 | } | ||
96 | |||
97 | d->db.end_transaction(false); | ||
98 | d->inTransaction = false; | ||
99 | } | ||
100 | |||
101 | bool Storage::write(const char *key, size_t keySize, const char *value, size_t valueSize) | ||
102 | { | ||
103 | if (!d->dbOpen) { | ||
104 | return false; | ||
105 | } | ||
106 | |||
107 | bool success = d->db.set(key, keySize, value, valueSize); | ||
108 | return success; | ||
109 | } | ||
110 | |||
111 | bool Storage::write(const std::string &sKey, const std::string &sValue) | ||
112 | { | ||
113 | if (!d->dbOpen) { | ||
114 | return false; | ||
115 | } | ||
116 | |||
117 | bool success = d->db.set(sKey, sValue); | ||
118 | return success; | ||
119 | } | ||
120 | |||
121 | void Storage::read(const std::string &sKey, const std::function<void(const std::string &value)> &resultHandler) | ||
122 | { | ||
123 | if (!d->dbOpen) { | ||
124 | return; | ||
125 | } | ||
126 | |||
127 | std::string value; | ||
128 | if (d->db.get(sKey, &value)) { | ||
129 | resultHandler(value); | ||
130 | } | ||
131 | } | ||
132 | |||
133 | void Storage::read(const std::string &sKey, const std::function<void(void *ptr, int size)> &resultHandler) | ||
134 | { | ||
135 | if (!d->dbOpen) { | ||
136 | return; | ||
137 | } | ||
138 | |||
139 | size_t valueSize; | ||
140 | char *valueBuffer = d->db.get(sKey.data(), sKey.size(), &valueSize); | ||
141 | resultHandler(valueBuffer, valueSize); | ||
142 | delete[] valueBuffer; | ||
143 | } | ||
144 | |||
145 | qint64 Storage::diskUsage() const | ||
146 | { | ||
147 | if (!d->dbOpen) { | ||
148 | return 0; | ||
149 | } | ||
150 | |||
151 | QFileInfo info(QString::fromStdString(d->db.path())); | ||
152 | return info.size(); | ||
153 | } | ||
154 | |||
155 | void Storage::removeFromDisk() const | ||
156 | { | ||
157 | if (!d->dbOpen) { | ||
158 | return; | ||
159 | } | ||
160 | |||
161 | QFileInfo info(QString::fromStdString(d->db.path())); | ||
162 | QDir dir = info.dir(); | ||
163 | dir.remove(info.fileName()); | ||
164 | } | ||