forked from openkylin/ukui-search
调整索引建立和增加的逻辑,可以实现单独重建某个数据库。
This commit is contained in:
parent
4294019e28
commit
1a440bf78f
|
@ -26,8 +26,7 @@ void FileIndexManager::searchMethod(FileUtils::SearchMethod sm) {
|
||||||
}
|
}
|
||||||
if(FileUtils::SearchMethod::INDEXSEARCH == sm && 0 == FileUtils::indexStatus) {
|
if(FileUtils::SearchMethod::INDEXSEARCH == sm && 0 == FileUtils::indexStatus) {
|
||||||
qDebug() << "start first index";
|
qDebug() << "start first index";
|
||||||
m_semaphore.acquire();
|
m_fi->rebuildDatebase();
|
||||||
m_fi->start();
|
|
||||||
qDebug() << "start inotify index";
|
qDebug() << "start inotify index";
|
||||||
if(!this->m_iw->isRunning()) {
|
if(!this->m_iw->isRunning()) {
|
||||||
this->m_iw->start();
|
this->m_iw->start();
|
||||||
|
|
|
@ -35,6 +35,7 @@ FirstIndex::FirstIndex() : m_semaphore(INDEX_SEM, 1, QSystemSemaphore::AccessMod
|
||||||
{
|
{
|
||||||
m_pool.setMaxThreadCount(2);
|
m_pool.setMaxThreadCount(2);
|
||||||
m_pool.setExpiryTimeout(100);
|
m_pool.setExpiryTimeout(100);
|
||||||
|
connect(this, &FirstIndex::needRebuild, this, &FirstIndex::rebuildDatebase, Qt::QueuedConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
FirstIndex *FirstIndex::getInstance()
|
FirstIndex *FirstIndex::getInstance()
|
||||||
|
@ -118,9 +119,18 @@ void FirstIndex::work(const QFileInfo& fileInfo) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FirstIndex::rebuildDatebase()
|
||||||
|
{
|
||||||
|
m_semaphore.acquire();
|
||||||
|
m_isRebuildProcess = true;
|
||||||
|
this->wait();
|
||||||
|
this->start();
|
||||||
|
}
|
||||||
|
|
||||||
void FirstIndex::addIndexPath(const QString path, const QStringList blockList)
|
void FirstIndex::addIndexPath(const QString path, const QStringList blockList)
|
||||||
{
|
{
|
||||||
m_semaphore.acquire();
|
m_semaphore.acquire();
|
||||||
|
m_isRebuildProcess = false;
|
||||||
setPath(QStringList() << path);
|
setPath(QStringList() << path);
|
||||||
setBlockPath(blockList);
|
setBlockPath(blockList);
|
||||||
this->wait();
|
this->wait();
|
||||||
|
@ -139,20 +149,34 @@ void FirstIndex::run() {
|
||||||
// qInfo() << "ocrIndexDatabaseStatus: " << ocrIndexDatabaseStatus;
|
// qInfo() << "ocrIndexDatabaseStatus: " << ocrIndexDatabaseStatus;
|
||||||
qInfo() << "inotifyIndexStatus: " << inotifyIndexStatus;
|
qInfo() << "inotifyIndexStatus: " << inotifyIndexStatus;
|
||||||
|
|
||||||
m_allDatadaseStatus = inotifyIndexStatus == "2" ? true : false;
|
m_inotifyIndexStatus = inotifyIndexStatus == "2" ? true : false;
|
||||||
m_indexDatabaseStatus = indexDataBaseStatus == "2" ? true : false;
|
m_indexDatabaseStatus = indexDataBaseStatus == "2" ? true : false;
|
||||||
m_contentIndexDatabaseStatus = contentIndexDataBaseStatus == "2" ? true : false;
|
m_contentIndexDatabaseStatus = contentIndexDataBaseStatus == "2" ? true : false;
|
||||||
// m_ocrIndexDatabaseStatus = ocrIndexDatabaseStatus == "2" ? true : false;
|
// m_ocrIndexDatabaseStatus = ocrIndexDatabaseStatus == "2" ? true : false;
|
||||||
|
|
||||||
if(m_allDatadaseStatus && m_indexDatabaseStatus && m_contentIndexDatabaseStatus /*&& m_ocrIndexDatabaseStatus*/) {
|
if(m_inotifyIndexStatus && m_indexDatabaseStatus && m_contentIndexDatabaseStatus /*&& m_ocrIndexDatabaseStatus*/) {
|
||||||
if(m_isFirstIndex) {
|
m_needRebuild = false;
|
||||||
m_isFirstIndex = false;
|
if(m_isRebuildProcess) {
|
||||||
|
m_isRebuildProcess = false;
|
||||||
m_semaphore.release(1);
|
m_semaphore.release(1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if(m_isRebuildProcess) {
|
||||||
setPath(DirWatcher::getDirWatcher()->currentIndexableDir());
|
setPath(DirWatcher::getDirWatcher()->currentIndexableDir());
|
||||||
setBlockPath(DirWatcher::getDirWatcher()->currentBlackListOfIndex());
|
setBlockPath(DirWatcher::getDirWatcher()->currentBlackListOfIndex());
|
||||||
|
} else {
|
||||||
|
if(m_inotifyIndexStatus && (!m_indexDatabaseStatus || !m_contentIndexDatabaseStatus)) {
|
||||||
|
m_needRebuild = true;
|
||||||
|
}
|
||||||
|
if(!m_inotifyIndexStatus || (!m_indexDatabaseStatus && !m_contentIndexDatabaseStatus)) {
|
||||||
|
m_needRebuild = false;
|
||||||
|
qInfo() << "Entering rebuild procedure";
|
||||||
|
Q_EMIT needRebuild();
|
||||||
|
m_semaphore.release(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -187,12 +211,15 @@ void FirstIndex::run() {
|
||||||
QtConcurrent::run(&m_pool, [&]() {
|
QtConcurrent::run(&m_pool, [&]() {
|
||||||
sem.acquire(2);
|
sem.acquire(2);
|
||||||
mutex1.unlock();
|
mutex1.unlock();
|
||||||
if(m_isFirstIndex && m_allDatadaseStatus && m_indexDatabaseStatus) {
|
if(m_isRebuildProcess && m_inotifyIndexStatus && m_indexDatabaseStatus) { //重建索引且无异常
|
||||||
sem.release(2);
|
sem.release(2);
|
||||||
return;
|
return;
|
||||||
}
|
} else if(m_isRebuildProcess) { //重建索引且有异常
|
||||||
if (!m_allDatadaseStatus || !m_indexDatabaseStatus || !m_contentIndexDatabaseStatus) {
|
|
||||||
IndexGenerator::getInstance()->rebuildIndexDatabase();
|
IndexGenerator::getInstance()->rebuildIndexDatabase();
|
||||||
|
} else if(!m_inotifyIndexStatus || !m_indexDatabaseStatus) { //添加目录且有异常
|
||||||
|
qWarning() << "Index database need rebuild!";
|
||||||
|
sem.release(2);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
qDebug() << "index start;" << m_indexData->size();
|
qDebug() << "index start;" << m_indexData->size();
|
||||||
|
|
||||||
|
@ -218,12 +245,15 @@ void FirstIndex::run() {
|
||||||
QtConcurrent::run(&m_pool,[&]() {
|
QtConcurrent::run(&m_pool,[&]() {
|
||||||
sem.acquire(2);
|
sem.acquire(2);
|
||||||
mutex2.unlock();
|
mutex2.unlock();
|
||||||
if(m_isFirstIndex && m_allDatadaseStatus && m_contentIndexDatabaseStatus) {
|
if(m_isRebuildProcess && m_inotifyIndexStatus && m_contentIndexDatabaseStatus) {
|
||||||
sem.release(2);
|
sem.release(2);
|
||||||
return;
|
return;
|
||||||
}
|
} else if(m_isRebuildProcess) { //重建索引且有异常
|
||||||
if (!m_allDatadaseStatus || !m_contentIndexDatabaseStatus || !m_indexDatabaseStatus) {
|
|
||||||
IndexGenerator::getInstance()->rebuildContentIndexDatabase();
|
IndexGenerator::getInstance()->rebuildContentIndexDatabase();
|
||||||
|
} else if(!m_inotifyIndexStatus || !m_contentIndexDatabaseStatus) { //添加目录且有异常
|
||||||
|
qWarning() << "Content index database need rebuild!";
|
||||||
|
sem.release(2);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
qDebug() << "content index start:" << m_contentIndexData->size();
|
qDebug() << "content index start:" << m_contentIndexData->size();
|
||||||
QQueue<QString>* tmp2 = new QQueue<QString>();
|
QQueue<QString>* tmp2 = new QQueue<QString>();
|
||||||
|
@ -323,8 +353,12 @@ void FirstIndex::run() {
|
||||||
--FileUtils::indexStatus;
|
--FileUtils::indexStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_isFirstIndex = false; //首次索引后置为false,后续start为添加索引目录时新建索引。
|
|
||||||
IndexStatusRecorder::getInstance()->setStatus(INOTIFY_NORMAL_EXIT, "2");
|
IndexStatusRecorder::getInstance()->setStatus(INOTIFY_NORMAL_EXIT, "2");
|
||||||
|
if(m_needRebuild) {
|
||||||
|
m_needRebuild = false;
|
||||||
|
qInfo() << "Entering rebuild procedure";
|
||||||
|
Q_EMIT needRebuild();
|
||||||
|
}
|
||||||
m_semaphore.release(1);
|
m_semaphore.release(1);
|
||||||
// int retval1 = write(fifo_fd, buffer, strlen(buffer));
|
// int retval1 = write(fifo_fd, buffer, strlen(buffer));
|
||||||
// if(retval1 == -1) {
|
// if(retval1 == -1) {
|
||||||
|
|
|
@ -42,13 +42,17 @@
|
||||||
#include "file-utils.h"
|
#include "file-utils.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
namespace UkuiSearch {
|
namespace UkuiSearch {
|
||||||
class FirstIndex : public QThread, public Traverse_BFS {
|
class FirstIndex : public QThread, public Traverse_BFS
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
static FirstIndex* getInstance();
|
static FirstIndex* getInstance();
|
||||||
~FirstIndex();
|
~FirstIndex();
|
||||||
virtual void work(const QFileInfo &) final;
|
virtual void work(const QFileInfo &) final;
|
||||||
|
void rebuildDatebase();
|
||||||
void addIndexPath(const QString path, const QStringList blockList);
|
void addIndexPath(const QString path, const QStringList blockList);
|
||||||
|
Q_SIGNALS:
|
||||||
|
void needRebuild();
|
||||||
protected:
|
protected:
|
||||||
void run() override;
|
void run() override;
|
||||||
private:
|
private:
|
||||||
|
@ -61,8 +65,9 @@ private:
|
||||||
bool m_indexDatabaseStatus = false;
|
bool m_indexDatabaseStatus = false;
|
||||||
bool m_contentIndexDatabaseStatus = false;
|
bool m_contentIndexDatabaseStatus = false;
|
||||||
bool m_ocrIndexDatabaseStatus = false;
|
bool m_ocrIndexDatabaseStatus = false;
|
||||||
bool m_allDatadaseStatus = false;
|
bool m_inotifyIndexStatus = false;
|
||||||
bool m_isFirstIndex = true;
|
bool m_isRebuildProcess = true;
|
||||||
|
bool m_needRebuild = false;
|
||||||
QThreadPool m_pool;
|
QThreadPool m_pool;
|
||||||
|
|
||||||
QQueue<QVector<QString>>* m_indexData = nullptr;
|
QQueue<QVector<QString>>* m_indexData = nullptr;
|
||||||
|
|
|
@ -22,6 +22,7 @@ void IndexStatusRecorder::setStatus(const QString &key, const QVariant &value)
|
||||||
|
|
||||||
const QVariant IndexStatusRecorder::getStatus(const QString &key)
|
const QVariant IndexStatusRecorder::getStatus(const QString &key)
|
||||||
{
|
{
|
||||||
|
m_status->sync();
|
||||||
return m_status->value(key);
|
return m_status->value(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue