File indexing completed on 2024-04-28 15:17:30
0001 /* 0002 This file is part of the KDE Baloo project. 0003 SPDX-FileCopyrightText: 2015 Vishesh Handa <vhanda@kde.org> 0004 0005 SPDX-License-Identifier: LGPL-2.1-or-later 0006 */ 0007 0008 #include "idfilenamedb.h" 0009 #include "enginedebug.h" 0010 0011 using namespace Baloo; 0012 0013 IdFilenameDB::IdFilenameDB(MDB_dbi dbi, MDB_txn* txn) 0014 : m_txn(txn) 0015 , m_dbi(dbi) 0016 { 0017 Q_ASSERT(txn != nullptr); 0018 Q_ASSERT(dbi != 0); 0019 } 0020 0021 IdFilenameDB::~IdFilenameDB() 0022 { 0023 } 0024 0025 MDB_dbi IdFilenameDB::create(MDB_txn* txn) 0026 { 0027 MDB_dbi dbi = 0; 0028 int rc = mdb_dbi_open(txn, "idfilename", MDB_CREATE | MDB_INTEGERKEY, &dbi); 0029 if (rc) { 0030 qCWarning(ENGINE) << "IdFilenameDB::create" << mdb_strerror(rc); 0031 return 0; 0032 } 0033 0034 return dbi; 0035 } 0036 0037 MDB_dbi IdFilenameDB::open(MDB_txn* txn) 0038 { 0039 MDB_dbi dbi = 0; 0040 int rc = mdb_dbi_open(txn, "idfilename", MDB_INTEGERKEY, &dbi); 0041 if (rc) { 0042 qCWarning(ENGINE) << "IdFilenameDB::open" << mdb_strerror(rc); 0043 return 0; 0044 } 0045 0046 return dbi; 0047 } 0048 0049 void IdFilenameDB::put(quint64 docId, const FilePath& path) 0050 { 0051 Q_ASSERT(docId > 0); 0052 Q_ASSERT(!path.name.isEmpty()); 0053 0054 MDB_val key; 0055 key.mv_size = sizeof(quint64); 0056 key.mv_data = static_cast<void*>(&docId); 0057 0058 QByteArray data(8 + path.name.size(), Qt::Uninitialized); 0059 memcpy(data.data(), &path.parentId, 8); 0060 memcpy(data.data() + 8, path.name.data(), path.name.size()); 0061 0062 MDB_val val; 0063 val.mv_size = data.size(); 0064 val.mv_data = static_cast<void*>(data.data()); 0065 0066 int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); 0067 if (rc) { 0068 qCWarning(ENGINE) << "IdFilenameDB::put" << mdb_strerror(rc); 0069 } 0070 } 0071 0072 IdFilenameDB::FilePath IdFilenameDB::get(quint64 docId) 0073 { 0074 FilePath path; 0075 if (get(docId, path)) { 0076 return path; 0077 } 0078 return {}; 0079 } 0080 0081 bool IdFilenameDB::get(quint64 docId, FilePath& path) 0082 { 0083 Q_ASSERT(docId > 0); 0084 0085 MDB_val key; 0086 key.mv_size = sizeof(quint64); 0087 key.mv_data = static_cast<void*>(&docId); 0088 0089 MDB_val val{0, nullptr}; 0090 int rc = mdb_get(m_txn, m_dbi, &key, &val); 0091 if (rc) { 0092 if (rc != MDB_NOTFOUND) { 0093 qCDebug(ENGINE) << "IdfilenameDB::get" << docId << mdb_strerror(rc); 0094 } 0095 return false; 0096 } 0097 if (val.mv_size < 8) { 0098 return false; 0099 } 0100 0101 path.name.resize(val.mv_size - 8); 0102 memcpy(&path.parentId, val.mv_data, 8); 0103 memcpy(path.name.data(), static_cast<const char*>(val.mv_data) + 8, path.name.size()); 0104 0105 return true; 0106 } 0107 0108 bool IdFilenameDB::contains(quint64 docId) 0109 { 0110 Q_ASSERT(docId > 0); 0111 0112 MDB_val key; 0113 key.mv_size = sizeof(quint64); 0114 key.mv_data = static_cast<void*>(&docId); 0115 0116 MDB_val val{0, nullptr}; 0117 int rc = mdb_get(m_txn, m_dbi, &key, &val); 0118 if (rc) { 0119 if (rc != MDB_NOTFOUND) { 0120 qCDebug(ENGINE) << "IdfilenameDB::contains" << docId << mdb_strerror(rc); 0121 } 0122 return false; 0123 } 0124 return true; 0125 } 0126 0127 void IdFilenameDB::del(quint64 docId) 0128 { 0129 Q_ASSERT(docId > 0); 0130 0131 MDB_val key; 0132 key.mv_size = sizeof(quint64); 0133 key.mv_data = static_cast<void*>(&docId); 0134 0135 int rc = mdb_del(m_txn, m_dbi, &key, nullptr); 0136 if (rc != 0 && rc != MDB_NOTFOUND) { 0137 qCDebug(ENGINE) << "IdFilenameDB::del" << mdb_strerror(rc); 0138 } 0139 } 0140 0141 QMap<quint64, IdFilenameDB::FilePath> IdFilenameDB::toTestMap() const 0142 { 0143 MDB_cursor* cursor; 0144 mdb_cursor_open(m_txn, m_dbi, &cursor); 0145 0146 MDB_val key = {0, nullptr}; 0147 MDB_val val; 0148 0149 QMap<quint64, FilePath> map; 0150 while (1) { 0151 int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); 0152 if (rc) { 0153 qCDebug(ENGINE) << "IdFilenameDB::toTestMap" << mdb_strerror(rc); 0154 break; 0155 } 0156 0157 const quint64 id = *(static_cast<quint64*>(key.mv_data)); 0158 0159 FilePath path; 0160 path.parentId = static_cast<quint64*>(val.mv_data)[0]; 0161 path.name = QByteArray(static_cast<char*>(val.mv_data) + 8, val.mv_size - 8); 0162 0163 map.insert(id, path); 0164 } 0165 0166 mdb_cursor_close(cursor); 0167 return map; 0168 }