fix(ukui-search-service):修复索引状态监控导致的崩溃问题
This commit is contained in:
parent
524a43787b
commit
7b158ec772
|
@ -18,23 +18,12 @@
|
|||
* Authors: iaom <zhangpengfei@kylinos.cn>
|
||||
*/
|
||||
#include "database.h"
|
||||
#include <QDir>
|
||||
|
||||
using namespace UkuiSearch;
|
||||
Database::Database(const DataBaseType &type)
|
||||
Database::Database(const DataBaseType &type): m_type(type)
|
||||
{
|
||||
switch (type) {
|
||||
case DataBaseType::Basic:
|
||||
m_database = new Xapian::Database(INDEX_PATH.toStdString());
|
||||
break;
|
||||
case DataBaseType::Content:
|
||||
m_database = new Xapian::Database(CONTENT_INDEX_PATH.toStdString());
|
||||
break;
|
||||
case DataBaseType::OcrContent:
|
||||
m_database = new Xapian::Database(OCR_CONTENT_INDEX_PATH.toStdString());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
refresh();
|
||||
}
|
||||
|
||||
Database::~Database()
|
||||
|
@ -45,7 +34,43 @@ Database::~Database()
|
|||
}
|
||||
}
|
||||
|
||||
uint Database::getIndexDocCount() const
|
||||
uint Database::getIndexDocCount()
|
||||
{
|
||||
if(!valid()) {
|
||||
refresh();
|
||||
}
|
||||
if(m_database) {
|
||||
return m_database->get_doccount();
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool Database::valid() const
|
||||
{
|
||||
return m_database != nullptr;
|
||||
}
|
||||
|
||||
bool Database::refresh()
|
||||
{
|
||||
switch (m_type) {
|
||||
case DataBaseType::Basic:
|
||||
if(QDir(INDEX_PATH).exists()) {
|
||||
m_database = new Xapian::Database(INDEX_PATH.toStdString());
|
||||
break;
|
||||
}
|
||||
case DataBaseType::Content:
|
||||
if(QDir(CONTENT_INDEX_PATH).exists()) {
|
||||
m_database = new Xapian::Database(CONTENT_INDEX_PATH.toStdString());
|
||||
break;
|
||||
}
|
||||
case DataBaseType::OcrContent:
|
||||
if(QDir(OCR_CONTENT_INDEX_PATH).exists()) {
|
||||
m_database = new Xapian::Database(OCR_CONTENT_INDEX_PATH.toStdString());
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return m_database != nullptr;
|
||||
}
|
||||
|
|
|
@ -28,10 +28,14 @@ class Database
|
|||
public:
|
||||
explicit Database(const DataBaseType &type);
|
||||
~Database();
|
||||
bool valid() const;
|
||||
bool refresh();
|
||||
|
||||
uint getIndexDocCount();
|
||||
|
||||
uint getIndexDocCount() const;
|
||||
private:
|
||||
Xapian::Database *m_database;
|
||||
Xapian::Database *m_database = nullptr;
|
||||
DataBaseType m_type;
|
||||
};
|
||||
}
|
||||
#endif // DATABASE_H
|
||||
|
|
|
@ -51,7 +51,7 @@ target_include_directories(ukui-search-service PRIVATE
|
|||
|
||||
target_compile_definitions(ukui-search-service PRIVATE
|
||||
QT_DEPRECATED_WARNINGS
|
||||
VERSION="UKUI_SEARCH_SERVICE_VERSION"
|
||||
VERSION="${UKUI_SEARCH_SERVICE_VERSION}"
|
||||
QT_NO_KEYWORDS
|
||||
)
|
||||
|
||||
|
|
|
@ -32,10 +32,12 @@ Monitor::Monitor(IndexScheduler *scheduler, QObject *parent) : MonitorSource(par
|
|||
connect(scheduler, &IndexScheduler::basicIndexDone, this, &Monitor::basicIndexDone);
|
||||
connect(scheduler, &IndexScheduler::contentIndexDone, this, &Monitor::contentIndexDone);
|
||||
connect(FileIndexerConfig::getInstance(), &FileIndexerConfig::appendIndexDir, this, [&](){
|
||||
Q_EMIT currentIndexPathsChanged(FileIndexerConfig::getInstance()->currentIndexableDir());
|
||||
m_currentIndexPaths = FileIndexerConfig::getInstance()->currentIndexableDir();
|
||||
Q_EMIT currentIndexPathsChanged(m_currentIndexPaths);
|
||||
});
|
||||
connect(FileIndexerConfig::getInstance(), &FileIndexerConfig::removeIndexDir, this, [&](){
|
||||
Q_EMIT currentIndexPathsChanged(FileIndexerConfig::getInstance()->currentIndexableDir());
|
||||
m_currentIndexPaths = FileIndexerConfig::getInstance()->currentIndexableDir();
|
||||
Q_EMIT currentIndexPathsChanged(m_currentIndexPaths);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -82,24 +84,28 @@ uint Monitor::ocrIndexProgress() const
|
|||
|
||||
uint Monitor::basicIndexDocNum() const
|
||||
{
|
||||
return m_basicDatabase.getIndexDocCount();
|
||||
return m_basicIndexDocNum;
|
||||
}
|
||||
|
||||
uint Monitor::contentIndexDocNum() const
|
||||
{
|
||||
return m_contentDatabase.getIndexDocCount();
|
||||
return m_contentIndexDocNum;
|
||||
}
|
||||
|
||||
uint Monitor::ocrContentIndexDocNum() const
|
||||
{
|
||||
return m_ocrContentDatabase.getIndexDocCount();
|
||||
return m_ocrContentIndexDocNum;
|
||||
}
|
||||
|
||||
void Monitor::onIndexStateChanged(IndexScheduler::IndexerState state)
|
||||
{
|
||||
if(state == IndexScheduler::IndexerState::Idle) {
|
||||
Q_EMIT basicIndexDocNumChanged(m_basicDatabase.getIndexDocCount());
|
||||
Q_EMIT contentIndexDocNumChanged(m_contentDatabase.getIndexDocCount());
|
||||
if(state == IndexScheduler::IndexerState::Idle || state == IndexScheduler::IndexerState::Stop) {
|
||||
m_basicIndexDocNum = m_basicDatabase.getIndexDocCount();
|
||||
Q_EMIT basicIndexDocNumChanged(m_basicIndexDocNum);
|
||||
m_contentIndexDocNum = m_contentDatabase.getIndexDocCount();
|
||||
Q_EMIT contentIndexDocNumChanged(m_contentIndexDocNum);
|
||||
m_ocrContentIndexDocNum = m_ocrContentDatabase.getIndexDocCount();
|
||||
Q_EMIT ocrContentIndexDocNumChanged(m_ocrContentDatabase.getIndexDocCount());
|
||||
}
|
||||
QMetaEnum metaEnum = QMetaEnum::fromType<IndexScheduler::IndexerState>();
|
||||
Q_EMIT indexStateChanged(QString::fromLocal8Bit(metaEnum.valueToKey(state)));
|
||||
|
@ -113,18 +119,24 @@ void Monitor::processUpdate(IndexType type, uint all, uint finished)
|
|||
Q_EMIT basicIndexSizeChanged(m_basicIndexSize);
|
||||
m_basicIndexProgress = finished;
|
||||
Q_EMIT basicIndexProgressChanged(m_basicIndexProgress);
|
||||
m_basicIndexDocNum = m_basicDatabase.getIndexDocCount();
|
||||
Q_EMIT basicIndexDocNumChanged(m_basicIndexDocNum);
|
||||
break;
|
||||
case IndexType::Contents:
|
||||
m_contentIndexSize = all;
|
||||
Q_EMIT contentIndexSizeChanged(m_contentIndexSize);
|
||||
m_contentIndexProgress = finished;
|
||||
Q_EMIT contentIndexProgressChanged(m_contentIndexProgress);
|
||||
m_contentIndexDocNum = m_contentDatabase.getIndexDocCount();
|
||||
Q_EMIT contentIndexDocNumChanged(m_contentIndexDocNum);
|
||||
break;
|
||||
case IndexType::OCR:
|
||||
m_ocrIndexSize = all;
|
||||
Q_EMIT ocrIndexSizeChanged(m_ocrIndexSize);
|
||||
m_contentIndexProgress = finished;
|
||||
Q_EMIT ocrIndexProgressChanged(m_contentIndexProgress);
|
||||
m_ocrContentIndexDocNum = m_ocrContentDatabase.getIndexDocCount();
|
||||
Q_EMIT ocrContentIndexDocNumChanged(m_ocrContentDatabase.getIndexDocCount());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -103,12 +103,17 @@ Q_SIGNALS:
|
|||
*/
|
||||
void contentIndexDone();
|
||||
|
||||
void basicIndexDocNumChanged(uint);
|
||||
void contentIndexDocNumChanged(uint);
|
||||
void ocrContentIndexDocNumChanged(uint);
|
||||
|
||||
private Q_SLOTS:
|
||||
void onIndexStateChanged(IndexScheduler::IndexerState);
|
||||
void processUpdate(UkuiSearch::IndexType type, uint all, uint finished);
|
||||
|
||||
private:
|
||||
IndexScheduler *m_scheduler = nullptr;
|
||||
QStringList m_currentIndexPaths;
|
||||
Database m_basicDatabase;
|
||||
Database m_contentDatabase;
|
||||
Database m_ocrContentDatabase;
|
||||
|
@ -118,6 +123,9 @@ private:
|
|||
uint m_basicIndexProgress = 0;
|
||||
uint m_contentIndexProgress = 0;
|
||||
uint m_ocrIndexProgress = 0;
|
||||
uint m_basicIndexDocNum = 0;
|
||||
uint m_contentIndexDocNum = 0;
|
||||
uint m_ocrContentIndexDocNum = 0;
|
||||
};
|
||||
}
|
||||
#endif // MONITOR_H
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <utility>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <QVariant>
|
||||
#include "ukui-search-service.h"
|
||||
#include "dir-watcher.h"
|
||||
#include "file-utils.h"
|
||||
|
@ -125,6 +126,7 @@ void UkuiSearchService::showMonitorState()
|
|||
{
|
||||
m_qroNode.connectToNode(QUrl(QStringLiteral("local:ukui-search-service-monitor")));
|
||||
auto *m = m_qroNode.acquire<MonitorReplica>();
|
||||
|
||||
connect(m, &QRemoteObjectReplica::initialized, [&, m](){
|
||||
qDebug() << "QRemoteObjectReplica initialized";
|
||||
QString state = m->indexState();
|
||||
|
@ -137,8 +139,8 @@ void UkuiSearchService::showMonitorState()
|
|||
|
||||
} else {
|
||||
message += "Basic index progress: " + QString::number(m->basicIndexProgress()) + " of " + QString::number(m->basicIndexSize())+ " finished\n"
|
||||
+ "Content index size: " + QString::number(m->contentIndexProgress()) + " of " + QString::number(m->contentIndexSize())+ " finished\n"
|
||||
+ "Ocr content index size: " + QString::number(m->ocrIndexProgress()) + " of " + QString::number(m->ocrIndexSize())+ " finished\n";
|
||||
+ "Content index progress: " + QString::number(m->contentIndexProgress()) + " of " + QString::number(m->contentIndexSize())+ " finished\n"
|
||||
+ "Ocr content index progress: " + QString::number(m->ocrIndexProgress()) + " of " + QString::number(m->ocrIndexSize())+ " finished\n";
|
||||
}
|
||||
|
||||
delete m;
|
||||
|
|
Loading…
Reference in New Issue