Changeset View
Changeset View
Standalone View
Standalone View
src/engine/positiondb.cpp
Show All 12 Lines | |||||
13 | * Lesser General Public License for more details. | 13 | * Lesser General Public License for more details. | ||
14 | * | 14 | * | ||
15 | * You should have received a copy of the GNU Lesser General Public | 15 | * You should have received a copy of the GNU Lesser General Public | ||
16 | * License along with this library; if not, write to the Free Software | 16 | * License along with this library; if not, write to the Free Software | ||
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | * | 18 | * | ||
19 | */ | 19 | */ | ||
20 | 20 | | |||
21 | #include "enginedebug.h" | ||||
21 | #include "positiondb.h" | 22 | #include "positiondb.h" | ||
22 | #include "positioncodec.h" | 23 | #include "positioncodec.h" | ||
23 | #include "positioninfo.h" | 24 | #include "positioninfo.h" | ||
24 | #include "postingiterator.h" | 25 | #include "postingiterator.h" | ||
25 | 26 | | |||
26 | #include <QDebug> | | |||
27 | | ||||
28 | using namespace Baloo; | 27 | using namespace Baloo; | ||
29 | 28 | | |||
30 | PositionDB::PositionDB(MDB_dbi dbi, MDB_txn* txn) | 29 | PositionDB::PositionDB(MDB_dbi dbi, MDB_txn* txn) | ||
31 | : m_txn(txn) | 30 | : m_txn(txn) | ||
32 | , m_dbi(dbi) | 31 | , m_dbi(dbi) | ||
33 | { | 32 | { | ||
34 | Q_ASSERT(txn != nullptr); | 33 | Q_ASSERT(txn != nullptr); | ||
35 | Q_ASSERT(dbi != 0); | 34 | Q_ASSERT(dbi != 0); | ||
36 | } | 35 | } | ||
37 | 36 | | |||
38 | PositionDB::~PositionDB() | 37 | PositionDB::~PositionDB() | ||
39 | { | 38 | { | ||
40 | } | 39 | } | ||
41 | 40 | | |||
42 | MDB_dbi PositionDB::create(MDB_txn* txn) | 41 | MDB_dbi PositionDB::create(MDB_txn* txn) | ||
43 | { | 42 | { | ||
44 | MDB_dbi dbi; | 43 | MDB_dbi dbi = 0; | ||
45 | int rc = mdb_dbi_open(txn, "positiondb", MDB_CREATE, &dbi); | 44 | int rc = mdb_dbi_open(txn, "positiondb", MDB_CREATE, &dbi); | ||
46 | Q_ASSERT_X(rc == 0, "PositionDB::create", mdb_strerror(rc)); | 45 | if (rc) { | ||
46 | qCWarning(ENGINE) << "PositionDB::create" << mdb_strerror(rc); | ||||
47 | return 0; | ||||
48 | } | ||||
47 | 49 | | |||
48 | return dbi; | 50 | return dbi; | ||
49 | } | 51 | } | ||
50 | 52 | | |||
51 | MDB_dbi PositionDB::open(MDB_txn* txn) | 53 | MDB_dbi PositionDB::open(MDB_txn* txn) | ||
52 | { | 54 | { | ||
53 | MDB_dbi dbi; | 55 | MDB_dbi dbi = 0; | ||
54 | int rc = mdb_dbi_open(txn, "positiondb", 0, &dbi); | 56 | int rc = mdb_dbi_open(txn, "positiondb", 0, &dbi); | ||
55 | if (rc == MDB_NOTFOUND) { | 57 | if (rc) { | ||
58 | qCWarning(ENGINE) << "PositionDB::open" << mdb_strerror(rc); | ||||
56 | return 0; | 59 | return 0; | ||
57 | } | 60 | } | ||
58 | Q_ASSERT_X(rc == 0, "PositionDB::open", mdb_strerror(rc)); | | |||
59 | 61 | | |||
60 | return dbi; | 62 | return dbi; | ||
61 | } | 63 | } | ||
62 | 64 | | |||
63 | void PositionDB::put(const QByteArray& term, const QVector<PositionInfo>& list) | 65 | void PositionDB::put(const QByteArray& term, const QVector<PositionInfo>& list) | ||
64 | { | 66 | { | ||
65 | Q_ASSERT(!term.isEmpty()); | 67 | Q_ASSERT(!term.isEmpty()); | ||
66 | Q_ASSERT(!list.isEmpty()); | 68 | Q_ASSERT(!list.isEmpty()); | ||
67 | 69 | | |||
68 | MDB_val key; | 70 | MDB_val key; | ||
69 | key.mv_size = term.size(); | 71 | key.mv_size = term.size(); | ||
70 | key.mv_data = static_cast<void*>(const_cast<char*>(term.constData())); | 72 | key.mv_data = static_cast<void*>(const_cast<char*>(term.constData())); | ||
71 | 73 | | |||
72 | PositionCodec codec; | 74 | PositionCodec codec; | ||
73 | QByteArray data = codec.encode(list); | 75 | QByteArray data = codec.encode(list); | ||
74 | 76 | | |||
75 | MDB_val val; | 77 | MDB_val val; | ||
76 | val.mv_size = data.size(); | 78 | val.mv_size = data.size(); | ||
77 | val.mv_data = static_cast<void*>(data.data()); | 79 | val.mv_data = static_cast<void*>(data.data()); | ||
78 | 80 | | |||
79 | int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); | 81 | int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); | ||
80 | Q_ASSERT_X(rc == 0, "PositionDB::put", mdb_strerror(rc)); | 82 | if (rc) { | ||
83 | qCWarning(ENGINE) << "PositionDB::put" << mdb_strerror(rc); | ||||
84 | } | ||||
81 | } | 85 | } | ||
82 | 86 | | |||
83 | QVector<PositionInfo> PositionDB::get(const QByteArray& term) | 87 | QVector<PositionInfo> PositionDB::get(const QByteArray& term) | ||
84 | { | 88 | { | ||
85 | Q_ASSERT(!term.isEmpty()); | 89 | Q_ASSERT(!term.isEmpty()); | ||
86 | 90 | | |||
87 | MDB_val key; | 91 | MDB_val key; | ||
88 | key.mv_size = term.size(); | 92 | key.mv_size = term.size(); | ||
89 | key.mv_data = static_cast<void*>(const_cast<char*>(term.constData())); | 93 | key.mv_data = static_cast<void*>(const_cast<char*>(term.constData())); | ||
90 | 94 | | |||
91 | MDB_val val; | 95 | MDB_val val{0, nullptr}; | ||
92 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | 96 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | ||
93 | if (rc == MDB_NOTFOUND) { | 97 | if (rc) { | ||
98 | if (rc != MDB_NOTFOUND) { | ||||
99 | qCDebug(ENGINE) << "PositionDB::get" << term << mdb_strerror(rc); | ||||
100 | } | ||||
94 | return QVector<PositionInfo>(); | 101 | return QVector<PositionInfo>(); | ||
95 | } | 102 | } | ||
96 | Q_ASSERT_X(rc == 0, "PositionDB::get", mdb_strerror(rc)); | | |||
97 | 103 | | |||
98 | QByteArray data = QByteArray::fromRawData(static_cast<char*>(val.mv_data), val.mv_size); | 104 | QByteArray data = QByteArray::fromRawData(static_cast<char*>(val.mv_data), val.mv_size); | ||
99 | 105 | | |||
100 | PositionCodec codec; | 106 | PositionCodec codec; | ||
101 | return codec.decode(data); | 107 | return codec.decode(data); | ||
102 | } | 108 | } | ||
103 | 109 | | |||
104 | void PositionDB::del(const QByteArray& term) | 110 | void PositionDB::del(const QByteArray& term) | ||
105 | { | 111 | { | ||
106 | Q_ASSERT(!term.isEmpty()); | 112 | Q_ASSERT(!term.isEmpty()); | ||
107 | 113 | | |||
108 | MDB_val key; | 114 | MDB_val key; | ||
109 | key.mv_size = term.size(); | 115 | key.mv_size = term.size(); | ||
110 | key.mv_data = static_cast<void*>(const_cast<char*>(term.constData())); | 116 | key.mv_data = static_cast<void*>(const_cast<char*>(term.constData())); | ||
111 | 117 | | |||
112 | int rc = mdb_del(m_txn, m_dbi, &key, nullptr); | 118 | int rc = mdb_del(m_txn, m_dbi, &key, nullptr); | ||
113 | if (rc == MDB_NOTFOUND) { | 119 | if (rc != 0 && rc != MDB_NOTFOUND) { | ||
114 | return; | 120 | qCDebug(ENGINE) << "PositionDB::del" << term << mdb_strerror(rc); | ||
115 | } | 121 | } | ||
116 | Q_ASSERT_X(rc == 0, "PositionDB::del", mdb_strerror(rc)); | | |||
117 | } | 122 | } | ||
118 | 123 | | |||
119 | // | 124 | // | ||
120 | // Query | 125 | // Query | ||
121 | // | 126 | // | ||
122 | 127 | | |||
123 | class DBPositionIterator : public PostingIterator { | 128 | class DBPositionIterator : public PostingIterator { | ||
124 | public: | 129 | public: | ||
Show All 35 Lines | |||||
160 | PostingIterator* PositionDB::iter(const QByteArray& term) | 165 | PostingIterator* PositionDB::iter(const QByteArray& term) | ||
161 | { | 166 | { | ||
162 | Q_ASSERT(!term.isEmpty()); | 167 | Q_ASSERT(!term.isEmpty()); | ||
163 | 168 | | |||
164 | MDB_val key; | 169 | MDB_val key; | ||
165 | key.mv_size = term.size(); | 170 | key.mv_size = term.size(); | ||
166 | key.mv_data = static_cast<void*>(const_cast<char*>(term.constData())); | 171 | key.mv_data = static_cast<void*>(const_cast<char*>(term.constData())); | ||
167 | 172 | | |||
168 | MDB_val val; | 173 | MDB_val val{0, nullptr}; | ||
169 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | 174 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | ||
170 | if (rc == MDB_NOTFOUND) { | 175 | if (rc) { | ||
176 | qCDebug(ENGINE) << "PositionDB::iter" << term << mdb_strerror(rc); | ||||
171 | return nullptr; | 177 | return nullptr; | ||
172 | } | 178 | } | ||
173 | Q_ASSERT_X(rc == 0, "PositionDB::iter", mdb_strerror(rc)); | | |||
174 | 179 | | |||
175 | return new DBPositionIterator(static_cast<char*>(val.mv_data), val.mv_size); | 180 | return new DBPositionIterator(static_cast<char*>(val.mv_data), val.mv_size); | ||
176 | } | 181 | } | ||
177 | 182 | | |||
178 | QMap<QByteArray, QVector<PositionInfo>> PositionDB::toTestMap() const | 183 | QMap<QByteArray, QVector<PositionInfo>> PositionDB::toTestMap() const | ||
179 | { | 184 | { | ||
180 | MDB_cursor* cursor; | 185 | MDB_cursor* cursor; | ||
181 | mdb_cursor_open(m_txn, m_dbi, &cursor); | 186 | mdb_cursor_open(m_txn, m_dbi, &cursor); | ||
182 | 187 | | |||
183 | MDB_val key = {0, nullptr}; | 188 | MDB_val key = {0, nullptr}; | ||
184 | MDB_val val; | 189 | MDB_val val; | ||
185 | 190 | | |||
186 | QMap<QByteArray, QVector<PositionInfo>> map; | 191 | QMap<QByteArray, QVector<PositionInfo>> map; | ||
187 | while (1) { | 192 | while (1) { | ||
188 | int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); | 193 | int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); | ||
189 | if (rc == MDB_NOTFOUND) { | 194 | if (rc) { | ||
195 | qCDebug(ENGINE) << "PostingDB::toTestMap" << mdb_strerror(rc); | ||||
190 | break; | 196 | break; | ||
191 | } | 197 | } | ||
192 | Q_ASSERT_X(rc == 0, "PostingDB::toTestMap", mdb_strerror(rc)); | | |||
193 | 198 | | |||
194 | const QByteArray ba(static_cast<char*>(key.mv_data), key.mv_size); | 199 | const QByteArray ba(static_cast<char*>(key.mv_data), key.mv_size); | ||
195 | const QVector<PositionInfo> vinfo = PositionCodec().decode(QByteArray(static_cast<char*>(val.mv_data), val.mv_size)); | 200 | const QVector<PositionInfo> vinfo = PositionCodec().decode(QByteArray(static_cast<char*>(val.mv_data), val.mv_size)); | ||
196 | map.insert(ba, vinfo); | 201 | map.insert(ba, vinfo); | ||
197 | } | 202 | } | ||
198 | 203 | | |||
199 | mdb_cursor_close(cursor); | 204 | mdb_cursor_close(cursor); | ||
200 | return map; | 205 | return map; | ||
201 | } | 206 | } |