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