/* * Copyright (C) 2022, KylinSoft Co., Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authors: iaom * */ #ifndef INDEXSCHEDULER_H #define INDEXSCHEDULER_H #include #include #include #include "file-watcher.h" #include "index-status-recorder.h" #include "common.h" #include "batch-indexer.h" namespace UkuiSearch { class IndexScheduler : public QObject { Q_OBJECT public: enum IndexerState { Startup, Running, Idle, Stop }; Q_ENUM(IndexerState) explicit IndexScheduler(QObject *parent = nullptr); Q_SCRIPTABLE IndexerState getIndexState(); Q_SIGNALS: void stateChange(IndexerState); void process(IndexType type, uint all, uint finished); void basicIndexDone(bool success); void contentIndexDone(bool success); void done(); private Q_SLOTS: /** * @brief addNewPath * @param folders 要添加索引的目录 * @param blackList 要添加索引的目录下的黑名单 */ Q_SCRIPTABLE void addNewPath(const QString &folders, const QStringList& blackList = QStringList()); /** * @brief removeIndex * @param folders 要移除索引的目录 */ Q_SCRIPTABLE void removeIndex(const QString& folders); void start(BatchIndexer::Targets target); void stop(BatchIndexer::Targets target); void fileIndexEnable(bool enable); void contentIndexEnable(bool enable); void ocrContentIndexEnable(bool enable); void updateIndex(const QVector& files); void batchIndexerFinished(BatchIndexer::WorkMode mode, BatchIndexer::Targets targets); void updateFinished(); bool isIdle(); void onBasicIndexDone(BatchIndexer::WorkMode mode); void onContentIndexDone(BatchIndexer::WorkMode mode); void onOcrContentIndexDone(BatchIndexer::WorkMode mode); private: /** * @brief checkAndRebuild * 检查数据库状态,数据库状态处于 IndexStatusRecorder::State::Error 时,开始重建任务。 * @return 返回需要重建的数据库 */ BatchIndexer::Targets checkAndRebuild(BatchIndexer::Targets target = BatchIndexer::All); void startIndexJob(const QStringList &folders, const QStringList &blackList, BatchIndexer::WorkMode mode, BatchIndexer::Targets target); FileWatcher m_fileWatcher; IndexStatusRecorder *m_statusRecorder = nullptr; FileIndexerConfig *m_config = nullptr; IndexerState m_state; QAtomicInt m_indexStop; QAtomicInt m_contentIndexStop; QAtomicInt m_ocrContentIndexStop; QThreadPool m_threadPool; quint64 m_indexPendingWorkCount = 0; quint64 m_contentIndexPendingWorkCount = 0; quint64 m_ocrContentIndexPendingWorkCount= 0; quint64 m_updatePendingWorkCount = 0; quint64 m_addNewPathPendingWorkCount = 0; }; } #endif // INDEXSCHEDULER_H