File indexing completed on 2024-04-28 11:32:44

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 }