Changeset View
Changeset View
Standalone View
Standalone View
src/engine/documentdatadb.cpp
Show All 12 Lines | |||||
13 | * | 13 | * | ||
14 | * You should have received a copy of the GNU Lesser General Public | 14 | * You should have received a copy of the GNU Lesser General Public | ||
15 | * License along with this library; if not, write to the Free Software | 15 | * License along with this library; if not, write to the Free Software | ||
16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
17 | * | 17 | * | ||
18 | */ | 18 | */ | ||
19 | 19 | | |||
20 | #include "documentdatadb.h" | 20 | #include "documentdatadb.h" | ||
21 | #include "enginedebug.h" | ||||
21 | 22 | | |||
22 | using namespace Baloo; | 23 | using namespace Baloo; | ||
23 | 24 | | |||
24 | DocumentDataDB::DocumentDataDB(MDB_dbi dbi, MDB_txn* txn) | 25 | DocumentDataDB::DocumentDataDB(MDB_dbi dbi, MDB_txn* txn) | ||
25 | : m_txn(txn) | 26 | : m_txn(txn) | ||
26 | , m_dbi(dbi) | 27 | , m_dbi(dbi) | ||
27 | { | 28 | { | ||
28 | Q_ASSERT(txn != nullptr); | 29 | Q_ASSERT(txn != nullptr); | ||
29 | Q_ASSERT(dbi != 0); | 30 | Q_ASSERT(dbi != 0); | ||
30 | } | 31 | } | ||
31 | 32 | | |||
32 | DocumentDataDB::~DocumentDataDB() | 33 | DocumentDataDB::~DocumentDataDB() | ||
33 | { | 34 | { | ||
34 | } | 35 | } | ||
35 | 36 | | |||
36 | MDB_dbi DocumentDataDB::create(MDB_txn* txn) | 37 | MDB_dbi DocumentDataDB::create(MDB_txn* txn) | ||
37 | { | 38 | { | ||
38 | MDB_dbi dbi; | 39 | MDB_dbi dbi = 0; | ||
39 | int rc = mdb_dbi_open(txn, "documentdatadb", MDB_CREATE | MDB_INTEGERKEY, &dbi); | 40 | int rc = mdb_dbi_open(txn, "documentdatadb", MDB_CREATE | MDB_INTEGERKEY, &dbi); | ||
40 | Q_ASSERT_X(rc == 0, "DocumentUrlDB::create", mdb_strerror(rc)); | 41 | if (rc) { | ||
42 | qCWarning(ENGINE) << "DocumentDataDB::create" << mdb_strerror(rc); | ||||
bruns: Warning | |||||
43 | return 0; | ||||
44 | } | ||||
41 | 45 | | |||
42 | return dbi; | 46 | return dbi; | ||
43 | } | 47 | } | ||
44 | 48 | | |||
45 | MDB_dbi DocumentDataDB::open(MDB_txn* txn) | 49 | MDB_dbi DocumentDataDB::open(MDB_txn* txn) | ||
46 | { | 50 | { | ||
47 | MDB_dbi dbi; | 51 | MDB_dbi dbi = 0; | ||
48 | int rc = mdb_dbi_open(txn, "documentdatadb", MDB_INTEGERKEY, &dbi); | 52 | int rc = mdb_dbi_open(txn, "documentdatadb", MDB_INTEGERKEY, &dbi); | ||
49 | if (rc == MDB_NOTFOUND) { | 53 | if (rc) { | ||
54 | qCWarning(ENGINE) << "DocumentDataDB::open" << mdb_strerror(rc); | ||||
bruns: warning | |||||
50 | return 0; | 55 | return 0; | ||
51 | } | 56 | } | ||
52 | Q_ASSERT_X(rc == 0, "DocumentUrlDB::create", mdb_strerror(rc)); | | |||
53 | 57 | | |||
54 | return dbi; | 58 | return dbi; | ||
55 | } | 59 | } | ||
56 | 60 | | |||
57 | void DocumentDataDB::put(quint64 docId, const QByteArray& url) | 61 | void DocumentDataDB::put(quint64 docId, const QByteArray& url) | ||
58 | { | 62 | { | ||
59 | Q_ASSERT(docId > 0); | 63 | Q_ASSERT(docId > 0); | ||
60 | Q_ASSERT(!url.isEmpty()); | 64 | Q_ASSERT(!url.isEmpty()); | ||
61 | 65 | | |||
62 | MDB_val key; | 66 | MDB_val key; | ||
63 | key.mv_size = sizeof(quint64); | 67 | key.mv_size = sizeof(quint64); | ||
64 | key.mv_data = static_cast<void*>(&docId); | 68 | key.mv_data = static_cast<void*>(&docId); | ||
65 | 69 | | |||
66 | MDB_val val; | 70 | MDB_val val; | ||
67 | val.mv_size = url.size(); | 71 | val.mv_size = url.size(); | ||
68 | val.mv_data = static_cast<void*>(const_cast<char*>(url.constData())); | 72 | val.mv_data = static_cast<void*>(const_cast<char*>(url.constData())); | ||
69 | 73 | | |||
70 | int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); | 74 | int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); | ||
71 | Q_ASSERT_X(rc == 0, "DocumentDataDB::put", mdb_strerror(rc)); | 75 | if (rc) { | ||
76 | qCWarning(ENGINE) << "DocumentDataDB::put" << mdb_strerror(rc); | ||||
bruns: warning | |||||
77 | } | ||||
72 | } | 78 | } | ||
73 | 79 | | |||
74 | QByteArray DocumentDataDB::get(quint64 docId) | 80 | QByteArray DocumentDataDB::get(quint64 docId) | ||
75 | { | 81 | { | ||
76 | Q_ASSERT(docId > 0); | 82 | Q_ASSERT(docId > 0); | ||
77 | 83 | | |||
78 | MDB_val key; | 84 | MDB_val key; | ||
79 | key.mv_size = sizeof(quint64); | 85 | key.mv_size = sizeof(quint64); | ||
80 | key.mv_data = static_cast<void*>(&docId); | 86 | key.mv_data = static_cast<void*>(&docId); | ||
81 | 87 | | |||
82 | MDB_val val; | 88 | MDB_val val{0, nullptr}; | ||
83 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | 89 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | ||
84 | if (rc == MDB_NOTFOUND) { | 90 | if (rc) { | ||
91 | if (rc != MDB_NOTFOUND) { | ||||
92 | qCDebug(ENGINE) << "DocumentDataDB::get" << docId << mdb_strerror(rc); | ||||
93 | } | ||||
bruns: please keep MDB_NOTFOUND as "ok" here, any other return code != 0 -> qCWarning | |||||
85 | return QByteArray(); | 94 | return QByteArray(); | ||
86 | } | 95 | } | ||
87 | Q_ASSERT_X(rc == 0, "DocumentDataDB::get", mdb_strerror(rc)); | | |||
88 | 96 | | |||
89 | return QByteArray(static_cast<char*>(val.mv_data), val.mv_size); | 97 | return QByteArray(static_cast<char*>(val.mv_data), val.mv_size); | ||
90 | } | 98 | } | ||
91 | 99 | | |||
92 | void DocumentDataDB::del(quint64 docId) | 100 | void DocumentDataDB::del(quint64 docId) | ||
93 | { | 101 | { | ||
94 | Q_ASSERT(docId > 0); | 102 | Q_ASSERT(docId > 0); | ||
95 | 103 | | |||
96 | MDB_val key; | 104 | MDB_val key; | ||
97 | key.mv_size = sizeof(quint64); | 105 | key.mv_size = sizeof(quint64); | ||
98 | key.mv_data = static_cast<void*>(&docId); | 106 | key.mv_data = static_cast<void*>(&docId); | ||
99 | 107 | | |||
100 | int rc = mdb_del(m_txn, m_dbi, &key, nullptr); | 108 | int rc = mdb_del(m_txn, m_dbi, &key, nullptr); | ||
101 | if (rc == MDB_NOTFOUND) { | 109 | if (rc != 0 && rc != MDB_NOTFOUND) { | ||
102 | return; | 110 | qCDebug(ENGINE) << "DocumentDataDB::del" << docId << mdb_strerror(rc); | ||
bruns: see get | |||||
valeriymalov: Trying to delete a non-existent entry seems like an error to me | |||||
Deleting is an idempotent operation, so e.g. doing it twice is fine. There may be multiple events queued leading to the deletion of a database entry, i.e. deleting a file and then deleting a parent directory recursively. bruns: Deleting is an idempotent operation, so e.g. doing it twice is fine. There may be multiple… | |||||
103 | } | 111 | } | ||
104 | Q_ASSERT_X(rc == 0, "DocumentUrlDB::del", mdb_strerror(rc)); | | |||
105 | } | 112 | } | ||
106 | 113 | | |||
107 | bool DocumentDataDB::contains(quint64 docId) | 114 | bool DocumentDataDB::contains(quint64 docId) | ||
108 | { | 115 | { | ||
109 | Q_ASSERT(docId > 0); | 116 | Q_ASSERT(docId > 0); | ||
110 | 117 | | |||
111 | MDB_val key; | 118 | MDB_val key; | ||
112 | key.mv_size = sizeof(quint64); | 119 | key.mv_size = sizeof(quint64); | ||
113 | key.mv_data = static_cast<void*>(&docId); | 120 | key.mv_data = static_cast<void*>(&docId); | ||
114 | 121 | | |||
115 | MDB_val val; | 122 | MDB_val val{0, nullptr}; | ||
116 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | 123 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | ||
117 | if (rc == MDB_NOTFOUND) { | 124 | if (rc) { | ||
125 | if (rc != MDB_NOTFOUND) { | ||||
bruns: see get | |||||
126 | qCDebug(ENGINE) << "DocumentDataDB::contains" << docId << mdb_strerror(rc); | ||||
127 | } | ||||
118 | return false; | 128 | return false; | ||
119 | } | 129 | } | ||
120 | Q_ASSERT_X(rc == 0, "DocumentDataDB::contains", mdb_strerror(rc)); | | |||
121 | 130 | | |||
122 | return true; | 131 | return true; | ||
123 | } | 132 | } | ||
124 | 133 | | |||
125 | QMap<quint64, QByteArray> DocumentDataDB::toTestMap() const | 134 | QMap<quint64, QByteArray> DocumentDataDB::toTestMap() const | ||
126 | { | 135 | { | ||
127 | MDB_cursor* cursor; | 136 | MDB_cursor* cursor; | ||
128 | mdb_cursor_open(m_txn, m_dbi, &cursor); | 137 | mdb_cursor_open(m_txn, m_dbi, &cursor); | ||
129 | 138 | | |||
130 | MDB_val key = {0, nullptr}; | 139 | MDB_val key = {0, nullptr}; | ||
131 | MDB_val val; | 140 | MDB_val val; | ||
132 | 141 | | |||
133 | QMap<quint64, QByteArray> map; | 142 | QMap<quint64, QByteArray> map; | ||
134 | while (1) { | 143 | while (1) { | ||
135 | int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); | 144 | int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); | ||
136 | if (rc == MDB_NOTFOUND) { | 145 | if (rc) { | ||
146 | qCDebug(ENGINE) << "DocumentDataDB::toTestMap" << mdb_strerror(rc); | ||||
137 | break; | 147 | break; | ||
138 | } | 148 | } | ||
139 | Q_ASSERT_X(rc == 0, "DocumentDataDB::toTestMap", mdb_strerror(rc)); | | |||
140 | 149 | | |||
poboiko: This is not needed now, I guess | |||||
141 | const quint64 id = *(static_cast<quint64*>(key.mv_data)); | 150 | const quint64 id = *(static_cast<quint64*>(key.mv_data)); | ||
142 | const QByteArray ba(static_cast<char*>(val.mv_data), val.mv_size); | 151 | const QByteArray ba(static_cast<char*>(val.mv_data), val.mv_size); | ||
143 | map.insert(id, ba); | 152 | map.insert(id, ba); | ||
144 | } | 153 | } | ||
145 | 154 | | |||
146 | mdb_cursor_close(cursor); | 155 | mdb_cursor_close(cursor); | ||
147 | return map; | 156 | return map; | ||
148 | 157 | | |||
149 | } | 158 | } |
Warning