File indexing completed on 2024-04-14 03:49:40
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 "documentdb.h" 0009 #include "doctermscodec.h" 0010 #include "enginedebug.h" 0011 0012 using namespace Baloo; 0013 0014 DocumentDB::DocumentDB(MDB_dbi dbi, MDB_txn* txn) 0015 : m_txn(txn) 0016 , m_dbi(dbi) 0017 { 0018 Q_ASSERT(txn != nullptr); 0019 Q_ASSERT(dbi != 0); 0020 } 0021 0022 DocumentDB::~DocumentDB() 0023 { 0024 } 0025 0026 MDB_dbi DocumentDB::create(const char* name, MDB_txn* txn) 0027 { 0028 MDB_dbi dbi = 0; 0029 const int rc = mdb_dbi_open(txn, name, MDB_CREATE | MDB_INTEGERKEY, &dbi); 0030 if (rc) { 0031 qCWarning(ENGINE) << "DocumentDB::create" << name << mdb_strerror(rc); 0032 return 0; 0033 } 0034 0035 return dbi; 0036 } 0037 0038 MDB_dbi DocumentDB::open(const char* name, MDB_txn* txn) 0039 { 0040 MDB_dbi dbi = 0; 0041 const int rc = mdb_dbi_open(txn, name, MDB_INTEGERKEY, &dbi); 0042 if (rc) { 0043 qCWarning(ENGINE) << "DocumentDB::open" << name << mdb_strerror(rc); 0044 return 0; 0045 } 0046 0047 return dbi; 0048 } 0049 0050 void DocumentDB::put(quint64 docId, const QVector<QByteArray>& list) 0051 { 0052 Q_ASSERT(docId > 0); 0053 Q_ASSERT(!list.isEmpty()); 0054 0055 MDB_val key; 0056 key.mv_size = sizeof(quint64); 0057 key.mv_data = static_cast<void*>(&docId); 0058 0059 QByteArray arr = DocTermsCodec::encode(list); 0060 0061 MDB_val val; 0062 val.mv_size = arr.size(); 0063 val.mv_data = static_cast<void*>(arr.data()); 0064 0065 int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); 0066 if (rc) { 0067 qCWarning(ENGINE) << "DocumentDB::put" << mdb_strerror(rc); 0068 } 0069 } 0070 0071 QVector<QByteArray> DocumentDB::get(quint64 docId) 0072 { 0073 Q_ASSERT(docId > 0); 0074 0075 MDB_val key; 0076 key.mv_size = sizeof(quint64); 0077 key.mv_data = static_cast<void*>(&docId); 0078 0079 MDB_val val{0, nullptr}; 0080 int rc = mdb_get(m_txn, m_dbi, &key, &val); 0081 if (rc) { 0082 qCDebug(ENGINE) << "DocumentDB::get" << docId << mdb_strerror(rc); 0083 return QVector<QByteArray>(); 0084 } 0085 0086 QByteArray arr = QByteArray::fromRawData(static_cast<char*>(val.mv_data), val.mv_size); 0087 0088 auto result = DocTermsCodec::decode(arr); 0089 if (result.isEmpty()) { 0090 qCDebug(ENGINE) << "Document Terms DB contains corrupt data for " << docId; 0091 } 0092 return result; 0093 } 0094 0095 void DocumentDB::del(quint64 docId) 0096 { 0097 Q_ASSERT(docId > 0); 0098 0099 MDB_val key; 0100 key.mv_size = sizeof(quint64); 0101 key.mv_data = static_cast<void*>(&docId); 0102 0103 int rc = mdb_del(m_txn, m_dbi, &key, nullptr); 0104 if (rc != 0 && rc != MDB_NOTFOUND) { 0105 qCDebug(ENGINE) << "DocumentDB::del" << docId << mdb_strerror(rc); 0106 } 0107 } 0108 0109 bool DocumentDB::contains(quint64 docId) 0110 { 0111 Q_ASSERT(docId > 0); 0112 0113 MDB_val key; 0114 key.mv_size = sizeof(quint64); 0115 key.mv_data = static_cast<void*>(&docId); 0116 0117 MDB_val val; 0118 int rc = mdb_get(m_txn, m_dbi, &key, &val); 0119 if (rc) { 0120 if (rc != MDB_NOTFOUND) { 0121 qCDebug(ENGINE) << "DocumentDB::contains" << docId << mdb_strerror(rc); 0122 } 0123 return false; 0124 } 0125 0126 return true; 0127 } 0128 0129 uint DocumentDB::size() 0130 { 0131 MDB_stat stat; 0132 int rc = mdb_stat(m_txn, m_dbi, &stat); 0133 if (rc) { 0134 qCDebug(ENGINE) << "DocumentDB::size" << mdb_strerror(rc); 0135 return 0; 0136 } 0137 0138 return stat.ms_entries; 0139 } 0140 0141 QMap<quint64, QVector<QByteArray>> DocumentDB::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, QVector<QByteArray>> map; 0150 while (1) { 0151 int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); 0152 if (rc == MDB_NOTFOUND) { 0153 break; 0154 } 0155 if (rc) { 0156 qCWarning(ENGINE) << "DocumentDB::toTestMap" << mdb_strerror(rc); 0157 break; 0158 } 0159 0160 const quint64 id = *(static_cast<quint64*>(key.mv_data)); 0161 const QVector<QByteArray> vec = DocTermsCodec::decode(QByteArray(static_cast<char*>(val.mv_data), val.mv_size)); 0162 map.insert(id, vec); 0163 } 0164 0165 mdb_cursor_close(cursor); 0166 return map; 0167 }