File indexing completed on 2024-04-14 03:49:41
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 "documentiddb.h" 0009 #include "enginedebug.h" 0010 0011 using namespace Baloo; 0012 0013 DocumentIdDB::DocumentIdDB(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 DocumentIdDB::~DocumentIdDB() 0022 { 0023 } 0024 0025 MDB_dbi DocumentIdDB::create(const char* name, MDB_txn* txn) 0026 { 0027 MDB_dbi dbi = 0; 0028 int rc = mdb_dbi_open(txn, name, MDB_CREATE | MDB_INTEGERKEY, &dbi); 0029 if (rc) { 0030 qCWarning(ENGINE) << "DocumentIdDB::create" << name << mdb_strerror(rc); 0031 return 0; 0032 } 0033 0034 return dbi; 0035 } 0036 0037 MDB_dbi DocumentIdDB::open(const char* name, MDB_txn* txn) 0038 { 0039 MDB_dbi dbi = 0; 0040 int rc = mdb_dbi_open(txn, name, MDB_INTEGERKEY, &dbi); 0041 if (rc) { 0042 qCWarning(ENGINE) << "DocumentIdDB::open" << name << mdb_strerror(rc); 0043 return 0; 0044 } 0045 0046 return dbi; 0047 } 0048 0049 void DocumentIdDB::put(quint64 docId) 0050 { 0051 Q_ASSERT(docId > 0); 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 = 0; 0059 val.mv_data = nullptr; 0060 0061 int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); 0062 if (rc) { 0063 qCWarning(ENGINE) << "DocumentIdDB::put" << mdb_strerror(rc); 0064 } 0065 } 0066 0067 bool DocumentIdDB::contains(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) << "DocumentIdDB::contains" << docId << mdb_strerror(rc); 0080 } 0081 return false; 0082 } 0083 0084 return true; 0085 } 0086 0087 void DocumentIdDB::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) << "DocumentIdDB::del" << docId << mdb_strerror(rc); 0098 } 0099 } 0100 0101 QVector<quint64> DocumentIdDB::fetchItems(int size) 0102 { 0103 Q_ASSERT(size > 0); 0104 0105 MDB_cursor* cursor; 0106 mdb_cursor_open(m_txn, m_dbi, &cursor); 0107 0108 QVector<quint64> vec; 0109 vec.reserve(size); 0110 0111 for (int i = 0; i < size; i++) { 0112 MDB_val key{0, nullptr}; 0113 int rc = mdb_cursor_get(cursor, &key, nullptr, MDB_NEXT); 0114 if (rc) { 0115 if (rc != MDB_NOTFOUND) { 0116 qCWarning(ENGINE) << "DocumentIdDB::fetchItems" << size << mdb_strerror(rc); 0117 } 0118 break; 0119 } 0120 0121 quint64 id = *(static_cast<quint64*>(key.mv_data)); 0122 vec << id; 0123 } 0124 mdb_cursor_close(cursor); 0125 0126 return vec; 0127 } 0128 0129 uint DocumentIdDB::size() 0130 { 0131 MDB_stat stat; 0132 int rc = mdb_stat(m_txn, m_dbi, &stat); 0133 if (rc) { 0134 qCDebug(ENGINE) << "DocumentIdDB::size" << mdb_strerror(rc); 0135 return 0; 0136 } 0137 0138 return stat.ms_entries; 0139 } 0140 0141 QVector<quint64> DocumentIdDB::toTestVector() 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{0, nullptr}; 0148 0149 QVector<quint64> vec; 0150 while (1) { 0151 int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); 0152 if (rc) { 0153 qCDebug(ENGINE) << "DocumentTimeDB::toTestMap" << mdb_strerror(rc); 0154 break; 0155 } 0156 0157 const quint64 id = *(static_cast<quint64*>(key.mv_data)); 0158 vec << id; 0159 } 0160 0161 mdb_cursor_close(cursor); 0162 return vec; 0163 }