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 "documenttimedb.h" 0009 #include "enginedebug.h" 0010 0011 using namespace Baloo; 0012 0013 DocumentTimeDB::DocumentTimeDB(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 DocumentTimeDB::~DocumentTimeDB() 0022 { 0023 } 0024 0025 MDB_dbi DocumentTimeDB::create(MDB_txn* txn) 0026 { 0027 MDB_dbi dbi = 0; 0028 int rc = mdb_dbi_open(txn, "documenttimedb", MDB_CREATE | MDB_INTEGERKEY, &dbi); 0029 if (rc) { 0030 qCWarning(ENGINE) << "DocumentTimeDB::create" << mdb_strerror(rc); 0031 return 0; 0032 } 0033 0034 return dbi; 0035 } 0036 0037 MDB_dbi DocumentTimeDB::open(MDB_txn* txn) 0038 { 0039 MDB_dbi dbi = 0; 0040 int rc = mdb_dbi_open(txn, "documenttimedb", MDB_INTEGERKEY, &dbi); 0041 if (rc) { 0042 qCWarning(ENGINE) << "DocumentTimeDB::open" << mdb_strerror(rc); 0043 return 0; 0044 } 0045 0046 return dbi; 0047 } 0048 0049 void DocumentTimeDB::put(quint64 docId, const TimeInfo& info) 0050 { 0051 Q_ASSERT(docId > 0); 0052 0053 MDB_val key; 0054 key.mv_size = sizeof(quint64); 0055 key.mv_data = &docId; 0056 0057 MDB_val val; 0058 val.mv_size = sizeof(TimeInfo); 0059 val.mv_data = static_cast<void*>(const_cast<TimeInfo*>(&info)); 0060 0061 int rc = mdb_put(m_txn, m_dbi, &key, &val, 0); 0062 if (rc) { 0063 qCWarning(ENGINE) << "DocumentTimeDB::put" << docId << mdb_strerror(rc); 0064 } 0065 } 0066 0067 DocumentTimeDB::TimeInfo DocumentTimeDB::get(quint64 docId) 0068 { 0069 Q_ASSERT(docId > 0); 0070 0071 MDB_val key; 0072 key.mv_size = sizeof(quint64); 0073 key.mv_data = &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) << "DocumentTimeDB::get" << docId << mdb_strerror(rc); 0080 } 0081 return TimeInfo(); 0082 } 0083 0084 return *(static_cast<TimeInfo*>(val.mv_data)); 0085 } 0086 0087 void DocumentTimeDB::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) << "DocumentTimeDB::del" << docId << mdb_strerror(rc); 0098 } 0099 } 0100 0101 bool DocumentTimeDB::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; 0110 int rc = mdb_get(m_txn, m_dbi, &key, &val); 0111 if (rc) { 0112 if (rc != MDB_NOTFOUND) { 0113 qCDebug(ENGINE) << "DocumentTimeDB::contains" << docId << mdb_strerror(rc); 0114 } 0115 return false; 0116 } 0117 0118 return true; 0119 } 0120 0121 QMap<quint64, DocumentTimeDB::TimeInfo> DocumentTimeDB::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, TimeInfo> map; 0130 while (1) { 0131 int rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); 0132 if (rc) { 0133 qCDebug(ENGINE) << "DocumentTimeDB::toTestMap" << mdb_strerror(rc); 0134 break; 0135 } 0136 0137 const quint64 id = *(static_cast<quint64*>(key.mv_data)); 0138 const TimeInfo ti = *(static_cast<TimeInfo*>(val.mv_data)); 0139 map.insert(id, ti); 0140 } 0141 0142 mdb_cursor_close(cursor); 0143 return map; 0144 }