Changeset View
Changeset View
Standalone View
Standalone View
src/engine/documentdb.cpp
Show All 14 Lines | |||||
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 "documentdb.h" | 21 | #include "documentdb.h" | ||
22 | #include "doctermscodec.h" | 22 | #include "doctermscodec.h" | ||
23 | 23 | #include "enginedebug.h" | |||
24 | #include <QDebug> | | |||
25 | 24 | | |||
26 | using namespace Baloo; | 25 | using namespace Baloo; | ||
27 | 26 | | |||
28 | DocumentDB::DocumentDB(MDB_dbi dbi, MDB_txn* txn) | 27 | DocumentDB::DocumentDB(MDB_dbi dbi, MDB_txn* txn) | ||
29 | : m_txn(txn) | 28 | : m_txn(txn) | ||
30 | , m_dbi(dbi) | 29 | , m_dbi(dbi) | ||
31 | { | 30 | { | ||
32 | Q_ASSERT(txn != nullptr); | 31 | Q_ASSERT(txn != nullptr); | ||
33 | Q_ASSERT(dbi != 0); | 32 | Q_ASSERT(dbi != 0); | ||
34 | } | 33 | } | ||
35 | 34 | | |||
36 | DocumentDB::~DocumentDB() | 35 | DocumentDB::~DocumentDB() | ||
37 | { | 36 | { | ||
38 | } | 37 | } | ||
39 | 38 | | |||
40 | MDB_dbi DocumentDB::create(const char* name, MDB_txn* txn) | 39 | MDB_dbi DocumentDB::create(const char* name, MDB_txn* txn) | ||
41 | { | 40 | { | ||
42 | MDB_dbi dbi; | 41 | MDB_dbi dbi = 0; | ||
43 | int rc = mdb_dbi_open(txn, name, MDB_CREATE | MDB_INTEGERKEY, &dbi); | 42 | const int rc = mdb_dbi_open(txn, name, MDB_CREATE | MDB_INTEGERKEY, &dbi); | ||
44 | Q_ASSERT_X(rc == 0, "DocumentDB::create", mdb_strerror(rc)); | 43 | if (rc) { | ||
44 | qCWarning(ENGINE) << "DocumentDB::create" << name << mdb_strerror(rc); | ||||
bruns: same rules for warning/debug as in documentdatadb | |||||
45 | return 0; | ||||
46 | } | ||||
45 | 47 | | |||
46 | return dbi; | 48 | return dbi; | ||
47 | } | 49 | } | ||
48 | 50 | | |||
49 | MDB_dbi DocumentDB::open(const char* name, MDB_txn* txn) | 51 | MDB_dbi DocumentDB::open(const char* name, MDB_txn* txn) | ||
50 | { | 52 | { | ||
51 | MDB_dbi dbi; | 53 | MDB_dbi dbi = 0; | ||
52 | int rc = mdb_dbi_open(txn, name, MDB_INTEGERKEY, &dbi); | 54 | const int rc = mdb_dbi_open(txn, name, MDB_INTEGERKEY, &dbi); | ||
53 | if (rc == MDB_NOTFOUND) { | 55 | if (rc) { | ||
56 | qCWarning(ENGINE) << "DocumentDB::open" << name << mdb_strerror(rc); | ||||
54 | return 0; | 57 | return 0; | ||
55 | } | 58 | } | ||
56 | Q_ASSERT_X(rc == 0, "DocumentDB::open", mdb_strerror(rc)); | | |||
57 | 59 | | |||
58 | return dbi; | 60 | return dbi; | ||
59 | } | 61 | } | ||
60 | 62 | | |||
61 | void DocumentDB::put(quint64 docId, const QVector<QByteArray>& list) | 63 | void DocumentDB::put(quint64 docId, const QVector<QByteArray>& list) | ||
62 | { | 64 | { | ||
63 | Q_ASSERT(docId > 0); | 65 | Q_ASSERT(docId > 0); | ||
64 | Q_ASSERT(!list.isEmpty()); | 66 | Q_ASSERT(!list.isEmpty()); | ||
65 | 67 | | |||
66 | MDB_val key; | 68 | MDB_val key; | ||
67 | key.mv_size = sizeof(quint64); | 69 | key.mv_size = sizeof(quint64); | ||
68 | key.mv_data = static_cast<void*>(&docId); | 70 | key.mv_data = static_cast<void*>(&docId); | ||
69 | 71 | | |||
70 | DocTermsCodec codec; | 72 | DocTermsCodec codec; | ||
71 | QByteArray arr = codec.encode(list); | 73 | QByteArray arr = codec.encode(list); | ||
72 | 74 | | |||
73 | MDB_val val; | 75 | MDB_val val; | ||
74 | val.mv_size = arr.size(); | 76 | val.mv_size = arr.size(); | ||
75 | val.mv_data = static_cast<void*>(arr.data()); | 77 | val.mv_data = static_cast<void*>(arr.data()); | ||
76 | 78 | | |||
77 | int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); | 79 | int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); | ||
78 | Q_ASSERT_X(rc == 0, "DocumentDB::put", mdb_strerror(rc)); | 80 | if (rc) { | ||
81 | qCWarning(ENGINE) << "DocumentDB::put" << mdb_strerror(rc); | ||||
82 | } | ||||
79 | } | 83 | } | ||
80 | 84 | | |||
81 | QVector<QByteArray> DocumentDB::get(quint64 docId) | 85 | QVector<QByteArray> DocumentDB::get(quint64 docId) | ||
82 | { | 86 | { | ||
83 | Q_ASSERT(docId > 0); | 87 | Q_ASSERT(docId > 0); | ||
84 | 88 | | |||
85 | MDB_val key; | 89 | MDB_val key; | ||
86 | key.mv_size = sizeof(quint64); | 90 | key.mv_size = sizeof(quint64); | ||
87 | key.mv_data = static_cast<void*>(&docId); | 91 | key.mv_data = static_cast<void*>(&docId); | ||
88 | 92 | | |||
89 | MDB_val val; | 93 | MDB_val val{0, nullptr}; | ||
90 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | 94 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | ||
91 | if (rc == MDB_NOTFOUND) { | 95 | if (rc) { | ||
96 | qCDebug(ENGINE) << "DocumentDB::get" << docId << mdb_strerror(rc); | ||||
92 | return QVector<QByteArray>(); | 97 | return QVector<QByteArray>(); | ||
93 | } | 98 | } | ||
94 | Q_ASSERT_X(rc == 0, "DocumentDB::get", mdb_strerror(rc)); | | |||
95 | 99 | | |||
96 | QByteArray arr = QByteArray::fromRawData(static_cast<char*>(val.mv_data), val.mv_size); | 100 | QByteArray arr = QByteArray::fromRawData(static_cast<char*>(val.mv_data), val.mv_size); | ||
97 | 101 | | |||
98 | DocTermsCodec codec; | 102 | DocTermsCodec codec; | ||
99 | auto result = codec.decode(arr); | 103 | auto result = codec.decode(arr); | ||
100 | if (result.isEmpty()) { | 104 | if (result.isEmpty()) { | ||
101 | qDebug() << "Document Terms DB contains corrupt data for " << docId; | 105 | qCDebug(ENGINE) << "Document Terms DB contains corrupt data for " << docId; | ||
102 | } | 106 | } | ||
103 | return result; | 107 | return result; | ||
104 | } | 108 | } | ||
105 | 109 | | |||
106 | void DocumentDB::del(quint64 docId) | 110 | void DocumentDB::del(quint64 docId) | ||
107 | { | 111 | { | ||
108 | Q_ASSERT(docId > 0); | 112 | Q_ASSERT(docId > 0); | ||
109 | 113 | | |||
110 | MDB_val key; | 114 | MDB_val key; | ||
111 | key.mv_size = sizeof(quint64); | 115 | key.mv_size = sizeof(quint64); | ||
112 | key.mv_data = static_cast<void*>(&docId); | 116 | key.mv_data = static_cast<void*>(&docId); | ||
113 | 117 | | |||
114 | int rc = mdb_del(m_txn, m_dbi, &key, nullptr); | 118 | int rc = mdb_del(m_txn, m_dbi, &key, nullptr); | ||
115 | if (rc == MDB_NOTFOUND) { | 119 | if (rc != 0 && rc != MDB_NOTFOUND) { | ||
116 | return; | 120 | qCDebug(ENGINE) << "DocumentDB::del" << docId << mdb_strerror(rc); | ||
117 | } | 121 | } | ||
118 | Q_ASSERT_X(rc == 0, "DocumentDB::del", mdb_strerror(rc)); | | |||
119 | } | 122 | } | ||
120 | 123 | | |||
121 | bool DocumentDB::contains(quint64 docId) | 124 | bool DocumentDB::contains(quint64 docId) | ||
122 | { | 125 | { | ||
123 | Q_ASSERT(docId > 0); | 126 | Q_ASSERT(docId > 0); | ||
124 | 127 | | |||
125 | MDB_val key; | 128 | MDB_val key; | ||
126 | key.mv_size = sizeof(quint64); | 129 | key.mv_size = sizeof(quint64); | ||
127 | key.mv_data = static_cast<void*>(&docId); | 130 | key.mv_data = static_cast<void*>(&docId); | ||
128 | 131 | | |||
129 | MDB_val val; | 132 | MDB_val val; | ||
130 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | 133 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | ||
131 | if (rc == MDB_NOTFOUND) { | 134 | if (rc) { | ||
135 | if (rc != MDB_NOTFOUND) { | ||||
136 | qCDebug(ENGINE) << "DocumentDB::contains" << docId << mdb_strerror(rc); | ||||
137 | } | ||||
132 | return false; | 138 | return false; | ||
133 | } | 139 | } | ||
134 | Q_ASSERT_X(rc == 0, "DocumentDB::contains", mdb_strerror(rc)); | | |||
135 | 140 | | |||
136 | return true; | 141 | return true; | ||
137 | } | 142 | } | ||
138 | 143 | | |||
139 | uint DocumentDB::size() | 144 | uint DocumentDB::size() | ||
140 | { | 145 | { | ||
141 | MDB_stat stat; | 146 | MDB_stat stat; | ||
142 | int rc = mdb_stat(m_txn, m_dbi, &stat); | 147 | int rc = mdb_stat(m_txn, m_dbi, &stat); | ||
poboiko: This can also return something weird. | |||||
143 | Q_ASSERT_X(rc == 0, "DocumentDB::size", mdb_strerror(rc)); | 148 | if (rc) { | ||
149 | qCDebug(ENGINE) << "DocumentDB::size" << mdb_strerror(rc); | ||||
150 | return 0; | ||||
151 | } | ||||
144 | 152 | | |||
145 | return stat.ms_entries; | 153 | return stat.ms_entries; | ||
146 | } | 154 | } | ||
147 | 155 | | |||
148 | QMap<quint64, QVector<QByteArray>> DocumentDB::toTestMap() const | 156 | QMap<quint64, QVector<QByteArray>> DocumentDB::toTestMap() const | ||
149 | { | 157 | { | ||
150 | MDB_cursor* cursor; | 158 | MDB_cursor* cursor; | ||
151 | mdb_cursor_open(m_txn, m_dbi, &cursor); | 159 | mdb_cursor_open(m_txn, m_dbi, &cursor); | ||
152 | 160 | | |||
153 | MDB_val key = {0, nullptr}; | 161 | MDB_val key = {0, nullptr}; | ||
154 | MDB_val val; | 162 | MDB_val val; | ||
155 | 163 | | |||
156 | QMap<quint64, QVector<QByteArray>> map; | 164 | QMap<quint64, QVector<QByteArray>> map; | ||
157 | while (1) { | 165 | while (1) { | ||
158 | int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); | 166 | int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); | ||
159 | if (rc == MDB_NOTFOUND) { | 167 | if (rc) { | ||
168 | qCWarning(ENGINE) << "PostingDB::toTestMap" << mdb_strerror(rc); | ||||
160 | break; | 169 | break; | ||
161 | } | 170 | } | ||
162 | Q_ASSERT_X(rc == 0, "PostingDB::toTestMap", mdb_strerror(rc)); | | |||
163 | 171 | | |||
164 | const quint64 id = *(static_cast<quint64*>(key.mv_data)); | 172 | const quint64 id = *(static_cast<quint64*>(key.mv_data)); | ||
165 | const QVector<QByteArray> vec = DocTermsCodec().decode(QByteArray(static_cast<char*>(val.mv_data), val.mv_size)); | 173 | const QVector<QByteArray> vec = DocTermsCodec().decode(QByteArray(static_cast<char*>(val.mv_data), val.mv_size)); | ||
166 | map.insert(id, vec); | 174 | map.insert(id, vec); | ||
167 | } | 175 | } | ||
168 | 176 | | |||
169 | mdb_cursor_close(cursor); | 177 | mdb_cursor_close(cursor); | ||
170 | return map; | 178 | return map; | ||
171 | } | 179 | } |
same rules for warning/debug as in documentdatadb