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