File indexing completed on 2024-04-21 03:51: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 #ifndef BALOO_TRANSACTION_H 0009 #define BALOO_TRANSACTION_H 0010 0011 #include "databasedbis.h" 0012 #include "mtimedb.h" 0013 #include "postingdb.h" 0014 #include "writetransaction.h" 0015 #include "documenttimedb.h" 0016 #include <functional> 0017 #include <memory> 0018 0019 #include <lmdb.h> 0020 0021 namespace Baloo { 0022 0023 class Database; 0024 class Document; 0025 class PostingIterator; 0026 class EngineQuery; 0027 class DatabaseSize; 0028 class DBState; 0029 0030 class BALOO_ENGINE_EXPORT Transaction 0031 { 0032 public: 0033 enum TransactionType { 0034 ReadOnly, 0035 ReadWrite, 0036 }; 0037 Transaction(const Database& db, TransactionType type); 0038 Transaction(Database* db, TransactionType type); 0039 ~Transaction(); 0040 0041 // 0042 // Getters 0043 // 0044 bool hasDocument(quint64 id) const; 0045 bool inPhaseOne(quint64 id) const; 0046 bool hasFailed(quint64 id) const; 0047 QVector<quint64> failedIds(quint64 limit) const; 0048 QByteArray documentUrl(quint64 id) const; 0049 0050 /** 0051 * This method is not cheap, and does not stat the filesystem in order to convert the path 0052 * \p path into an id. 0053 */ 0054 quint64 documentId(const QByteArray& path) const; 0055 QByteArray documentData(quint64 id) const; 0056 0057 DocumentTimeDB::TimeInfo documentTimeInfo(quint64 id) const; 0058 0059 PostingIterator* postingIterator(const EngineQuery& query) const; 0060 PostingIterator* postingCompIterator(const QByteArray& prefix, qlonglong value, PostingDB::Comparator com) const; 0061 PostingIterator* postingCompIterator(const QByteArray& prefix, double value, PostingDB::Comparator com) const; 0062 PostingIterator* postingCompIterator(const QByteArray& prefix, const QByteArray& value, PostingDB::Comparator com) const; 0063 PostingIterator* mTimeRangeIter(quint32 beginTime, quint32 endTime) const; 0064 PostingIterator* docUrlIter(quint64 id) const; 0065 0066 QVector<quint64> fetchPhaseOneIds(int size) const; 0067 uint phaseOneSize() const; 0068 uint size() const; 0069 0070 QVector<QByteArray> fetchTermsStartingWith(const QByteArray& term) const; 0071 0072 // 0073 // Introspecing document data 0074 // 0075 QVector<QByteArray> documentTerms(quint64 docId) const; 0076 QVector<QByteArray> documentFileNameTerms(quint64 docId) const; 0077 QVector<QByteArray> documentXattrTerms(quint64 docId) const; 0078 0079 DatabaseSize dbSize(); 0080 0081 // 0082 // Transaction handling 0083 // 0084 bool commit(); 0085 void abort(); 0086 void reset(TransactionType type); 0087 0088 // 0089 // Write Methods 0090 // 0091 void addDocument(const Document& doc); 0092 void removeDocument(quint64 id); 0093 void removeRecursively(quint64 parentId); 0094 void addFailed(quint64 id); 0095 0096 bool removeRecursively(quint64 parentId, std::function<bool(quint64)> shouldDelete) 0097 { 0098 Q_ASSERT(m_txn); 0099 Q_ASSERT(m_writeTrans); 0100 0101 return m_writeTrans->removeRecursively(parentId, shouldDelete); 0102 } 0103 0104 void replaceDocument(const Document& doc, DocumentOperations operations); 0105 void setPhaseOne(quint64 id); 0106 void removePhaseOne(quint64 id); 0107 0108 // Debugging 0109 void checkFsTree(); 0110 void checkTermsDbinPostingDb(); 0111 void checkPostingDbinTermsDb(); 0112 0113 private: 0114 Transaction(const Transaction& rhs) = delete; 0115 void init(TransactionType type); 0116 0117 const DatabaseDbis& m_dbis; 0118 MDB_txn *m_txn = nullptr; 0119 MDB_env *m_env = nullptr; 0120 std::unique_ptr<WriteTransaction> m_writeTrans; 0121 0122 friend class DatabaseSanitizerImpl; 0123 friend class DBState; // for testing 0124 }; 0125 } 0126 0127 #endif // BALOO_TRANSACTION_H