Changeset View
Changeset View
Standalone View
Standalone View
src/engine/idfilenamedb.cpp
Show All 13 Lines | |||||
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 "idfilenamedb.h" | 21 | #include "idfilenamedb.h" | ||
22 | #include "enginedebug.h" | ||||
22 | 23 | | |||
23 | using namespace Baloo; | 24 | using namespace Baloo; | ||
24 | 25 | | |||
25 | IdFilenameDB::IdFilenameDB(MDB_dbi dbi, MDB_txn* txn) | 26 | IdFilenameDB::IdFilenameDB(MDB_dbi dbi, MDB_txn* txn) | ||
26 | : m_txn(txn) | 27 | : m_txn(txn) | ||
27 | , m_dbi(dbi) | 28 | , m_dbi(dbi) | ||
28 | { | 29 | { | ||
29 | Q_ASSERT(txn != nullptr); | 30 | Q_ASSERT(txn != nullptr); | ||
30 | Q_ASSERT(dbi != 0); | 31 | Q_ASSERT(dbi != 0); | ||
31 | } | 32 | } | ||
32 | 33 | | |||
33 | IdFilenameDB::~IdFilenameDB() | 34 | IdFilenameDB::~IdFilenameDB() | ||
34 | { | 35 | { | ||
35 | } | 36 | } | ||
36 | 37 | | |||
37 | MDB_dbi IdFilenameDB::create(MDB_txn* txn) | 38 | MDB_dbi IdFilenameDB::create(MDB_txn* txn) | ||
38 | { | 39 | { | ||
39 | MDB_dbi dbi; | 40 | MDB_dbi dbi = 0; | ||
40 | int rc = mdb_dbi_open(txn, "idfilename", MDB_CREATE | MDB_INTEGERKEY, &dbi); | 41 | int rc = mdb_dbi_open(txn, "idfilename", MDB_CREATE | MDB_INTEGERKEY, &dbi); | ||
41 | Q_ASSERT_X(rc == 0, "IdFilenameDB::create", mdb_strerror(rc)); | 42 | if (rc) { | ||
43 | qCWarning(ENGINE) << "IdFilenameDB::create" << mdb_strerror(rc); | ||||
44 | return 0; | ||||
45 | } | ||||
42 | 46 | | |||
43 | return dbi; | 47 | return dbi; | ||
44 | } | 48 | } | ||
45 | 49 | | |||
46 | MDB_dbi IdFilenameDB::open(MDB_txn* txn) | 50 | MDB_dbi IdFilenameDB::open(MDB_txn* txn) | ||
47 | { | 51 | { | ||
48 | MDB_dbi dbi; | 52 | MDB_dbi dbi = 0; | ||
49 | int rc = mdb_dbi_open(txn, "idfilename", MDB_INTEGERKEY, &dbi); | 53 | int rc = mdb_dbi_open(txn, "idfilename", MDB_INTEGERKEY, &dbi); | ||
50 | if (rc == MDB_NOTFOUND) { | 54 | if (rc) { | ||
55 | qCWarning(ENGINE) << "IdFilenameDB::open" << mdb_strerror(rc); | ||||
51 | return 0; | 56 | return 0; | ||
52 | } | 57 | } | ||
53 | Q_ASSERT_X(rc == 0, "IdFilenameDB::open", mdb_strerror(rc)); | | |||
54 | 58 | | |||
55 | return dbi; | 59 | return dbi; | ||
56 | } | 60 | } | ||
57 | 61 | | |||
58 | void IdFilenameDB::put(quint64 docId, const FilePath& path) | 62 | void IdFilenameDB::put(quint64 docId, const FilePath& path) | ||
59 | { | 63 | { | ||
60 | Q_ASSERT(docId > 0); | 64 | Q_ASSERT(docId > 0); | ||
61 | Q_ASSERT(!path.name.isEmpty()); | 65 | Q_ASSERT(!path.name.isEmpty()); | ||
62 | 66 | | |||
63 | MDB_val key; | 67 | MDB_val key; | ||
64 | key.mv_size = sizeof(quint64); | 68 | key.mv_size = sizeof(quint64); | ||
65 | key.mv_data = static_cast<void*>(&docId); | 69 | key.mv_data = static_cast<void*>(&docId); | ||
66 | 70 | | |||
67 | QByteArray data(8 + path.name.size(), Qt::Uninitialized); | 71 | QByteArray data(8 + path.name.size(), Qt::Uninitialized); | ||
68 | memcpy(data.data(), &path.parentId, 8); | 72 | memcpy(data.data(), &path.parentId, 8); | ||
69 | memcpy(data.data() + 8, path.name.data(), path.name.size()); | 73 | memcpy(data.data() + 8, path.name.data(), path.name.size()); | ||
70 | 74 | | |||
71 | MDB_val val; | 75 | MDB_val val; | ||
72 | val.mv_size = data.size(); | 76 | val.mv_size = data.size(); | ||
73 | val.mv_data = static_cast<void*>(data.data()); | 77 | val.mv_data = static_cast<void*>(data.data()); | ||
74 | 78 | | |||
75 | int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); | 79 | int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); | ||
76 | Q_ASSERT_X(rc == 0, "IdFilenameDB::put", mdb_strerror(rc)); | 80 | if (rc) { | ||
81 | qCWarning(ENGINE) << "IdFilenameDB::put" << mdb_strerror(rc); | ||||
82 | } | ||||
77 | } | 83 | } | ||
78 | 84 | | |||
79 | IdFilenameDB::FilePath IdFilenameDB::get(quint64 docId) | 85 | IdFilenameDB::FilePath IdFilenameDB::get(quint64 docId) | ||
80 | { | 86 | { | ||
81 | Q_ASSERT(docId > 0); | 87 | Q_ASSERT(docId > 0); | ||
82 | 88 | | |||
83 | MDB_val key; | 89 | MDB_val key; | ||
84 | key.mv_size = sizeof(quint64); | 90 | key.mv_size = sizeof(quint64); | ||
85 | key.mv_data = static_cast<void*>(&docId); | 91 | key.mv_data = static_cast<void*>(&docId); | ||
86 | 92 | | |||
87 | FilePath path; | 93 | FilePath path; | ||
88 | 94 | | |||
89 | MDB_val val; | 95 | MDB_val val{0, nullptr}; | ||
90 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | 96 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | ||
91 | if (rc == MDB_NOTFOUND) { | 97 | if (rc) { | ||
98 | if (rc != MDB_NOTFOUND) { | ||||
99 | qCDebug(ENGINE) << "IdfilenameDB::get" << docId << mdb_strerror(rc); | ||||
100 | } | ||||
92 | return path; | 101 | return path; | ||
93 | } | 102 | } | ||
94 | Q_ASSERT_X(rc == 0, "IdfilenameDB::get", mdb_strerror(rc)); | | |||
95 | 103 | | |||
96 | path.parentId = static_cast<quint64*>(val.mv_data)[0]; | 104 | path.parentId = static_cast<quint64*>(val.mv_data)[0]; | ||
97 | path.name = QByteArray(static_cast<char*>(val.mv_data) + 8, val.mv_size - 8); | 105 | path.name = QByteArray(static_cast<char*>(val.mv_data) + 8, val.mv_size - 8); | ||
98 | 106 | | |||
99 | return path; | 107 | return path; | ||
100 | } | 108 | } | ||
101 | 109 | | |||
102 | bool IdFilenameDB::contains(quint64 docId) | 110 | bool IdFilenameDB::contains(quint64 docId) | ||
103 | { | 111 | { | ||
104 | Q_ASSERT(docId > 0); | 112 | Q_ASSERT(docId > 0); | ||
105 | 113 | | |||
106 | MDB_val key; | 114 | MDB_val key; | ||
107 | key.mv_size = sizeof(quint64); | 115 | key.mv_size = sizeof(quint64); | ||
108 | key.mv_data = static_cast<void*>(&docId); | 116 | key.mv_data = static_cast<void*>(&docId); | ||
109 | 117 | | |||
110 | MDB_val val; | 118 | MDB_val val{0, nullptr}; | ||
111 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | 119 | int rc = mdb_get(m_txn, m_dbi, &key, &val); | ||
112 | if (rc == MDB_NOTFOUND) { | 120 | if (rc) { | ||
121 | if (rc != MDB_NOTFOUND) { | ||||
122 | qCDebug(ENGINE) << "IdfilenameDB::contains" << docId << mdb_strerror(rc); | ||||
123 | } | ||||
113 | return false; | 124 | return false; | ||
114 | } | 125 | } | ||
115 | Q_ASSERT_X(rc == 0, "IdfilenameDB::contains", mdb_strerror(rc)); | | |||
116 | return true; | 126 | return true; | ||
117 | } | 127 | } | ||
118 | 128 | | |||
119 | void IdFilenameDB::del(quint64 docId) | 129 | void IdFilenameDB::del(quint64 docId) | ||
120 | { | 130 | { | ||
121 | Q_ASSERT(docId > 0); | 131 | Q_ASSERT(docId > 0); | ||
122 | 132 | | |||
123 | MDB_val key; | 133 | MDB_val key; | ||
124 | key.mv_size = sizeof(quint64); | 134 | key.mv_size = sizeof(quint64); | ||
125 | key.mv_data = static_cast<void*>(&docId); | 135 | key.mv_data = static_cast<void*>(&docId); | ||
126 | 136 | | |||
127 | int rc = mdb_del(m_txn, m_dbi, &key, nullptr); | 137 | int rc = mdb_del(m_txn, m_dbi, &key, nullptr); | ||
128 | Q_ASSERT_X(rc == 0, "IdfilenameDB::del", mdb_strerror(rc)); | 138 | if (rc != 0 && rc != MDB_NOTFOUND) { | ||
139 | qCDebug(ENGINE) << "IdFilenameDB::del" << mdb_strerror(rc); | ||||
140 | } | ||||
129 | } | 141 | } | ||
130 | 142 | | |||
131 | QMap<quint64, IdFilenameDB::FilePath> IdFilenameDB::toTestMap() const | 143 | QMap<quint64, IdFilenameDB::FilePath> IdFilenameDB::toTestMap() const | ||
132 | { | 144 | { | ||
133 | MDB_cursor* cursor; | 145 | MDB_cursor* cursor; | ||
134 | mdb_cursor_open(m_txn, m_dbi, &cursor); | 146 | mdb_cursor_open(m_txn, m_dbi, &cursor); | ||
135 | 147 | | |||
136 | MDB_val key = {0, nullptr}; | 148 | MDB_val key = {0, nullptr}; | ||
137 | MDB_val val; | 149 | MDB_val val; | ||
138 | 150 | | |||
139 | QMap<quint64, FilePath> map; | 151 | QMap<quint64, FilePath> map; | ||
140 | while (1) { | 152 | while (1) { | ||
141 | int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); | 153 | int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); | ||
142 | if (rc == MDB_NOTFOUND) { | 154 | if (rc) { | ||
155 | qCDebug(ENGINE) << "IdFilenameDB::toTestMap" << mdb_strerror(rc); | ||||
143 | break; | 156 | break; | ||
144 | } | 157 | } | ||
145 | Q_ASSERT_X(rc == 0, "IdFilenameDB::toTestMap", mdb_strerror(rc)); | 158 | | ||
146 | 159 | | |||
147 | const quint64 id = *(static_cast<quint64*>(key.mv_data)); | 160 | const quint64 id = *(static_cast<quint64*>(key.mv_data)); | ||
148 | 161 | | |||
149 | FilePath path; | 162 | FilePath path; | ||
150 | path.parentId = static_cast<quint64*>(val.mv_data)[0]; | 163 | path.parentId = static_cast<quint64*>(val.mv_data)[0]; | ||
151 | path.name = QByteArray(static_cast<char*>(val.mv_data) + 8, val.mv_size - 8); | 164 | path.name = QByteArray(static_cast<char*>(val.mv_data) + 8, val.mv_size - 8); | ||
152 | 165 | | |||
153 | map.insert(id, path); | 166 | map.insert(id, path); | ||
154 | } | 167 | } | ||
155 | 168 | | |||
156 | mdb_cursor_close(cursor); | 169 | mdb_cursor_close(cursor); | ||
157 | return map; | 170 | return map; | ||
158 | } | 171 | } |