2021-01-29 11:43:07 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2020, 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 <https://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
* Authors: zhangzihao <zhangzihao@kylinos.cn>
|
|
|
|
* Modified by: zhangpengfei <zhangpengfei@kylinos.cn>
|
|
|
|
*
|
|
|
|
*/
|
2021-01-09 11:25:07 +08:00
|
|
|
//#include <QtConcurrent>
|
|
|
|
#include "first-index.h"
|
|
|
|
#include <QDebug>
|
|
|
|
|
2021-01-22 09:49:44 +08:00
|
|
|
#define NEW_QUEUE(a) a = new QQueue<QString>(); qDebug("---------------------------%s %s %s new at %d..",__FILE__,__FUNCTION__,#a,__LINE__);
|
2021-01-19 19:26:39 +08:00
|
|
|
//#define DELETE_QUEUE(a )
|
2021-01-11 16:59:50 +08:00
|
|
|
|
2021-01-09 11:25:07 +08:00
|
|
|
FirstIndex::FirstIndex(const QString& path) : Traverse_BFS(path)
|
|
|
|
{
|
|
|
|
QString indexDataBaseStatus = GlobalSettings::getInstance()->getValue(INDEX_DATABASE_STATE).toString();
|
|
|
|
QString contentIndexDataBaseStatus = GlobalSettings::getInstance()->getValue(CONTENT_INDEX_DATABASE_STATE).toString();
|
2021-01-13 14:04:13 +08:00
|
|
|
QString inotifyIndexStatus = GlobalSettings::getInstance()->getValue(INOTIFY_NORMAL_EXIT).toString();
|
2021-01-09 11:25:07 +08:00
|
|
|
|
|
|
|
qDebug() << "indexDataBaseStatus: " << indexDataBaseStatus;
|
|
|
|
qDebug() << "contentIndexDataBaseStatus: " << contentIndexDataBaseStatus;
|
2021-01-13 14:04:13 +08:00
|
|
|
qDebug() << "inotifyIndexStatus: " << inotifyIndexStatus;
|
2021-01-09 11:25:07 +08:00
|
|
|
|
|
|
|
|
|
|
|
if (indexDataBaseStatus == "" || contentIndexDataBaseStatus == ""){
|
|
|
|
this->bool_dataBaseExist = false;
|
|
|
|
}
|
2021-01-10 09:01:22 +08:00
|
|
|
else{
|
|
|
|
this->bool_dataBaseExist = true;
|
|
|
|
}
|
2021-01-13 14:04:13 +08:00
|
|
|
if (indexDataBaseStatus != "2" || contentIndexDataBaseStatus != "2" || inotifyIndexStatus != "2"){
|
2021-01-09 11:25:07 +08:00
|
|
|
this->bool_dataBaseStatusOK = false;
|
|
|
|
}
|
2021-01-10 09:01:22 +08:00
|
|
|
else{
|
|
|
|
this->bool_dataBaseStatusOK = true;
|
|
|
|
}
|
2021-01-09 11:25:07 +08:00
|
|
|
|
|
|
|
this->q_index = new QQueue<QVector<QString>>();
|
2021-01-19 19:26:39 +08:00
|
|
|
//this->q_content_index = new QQueue<QString>();
|
|
|
|
NEW_QUEUE(this->q_content_index);
|
2021-01-09 11:25:07 +08:00
|
|
|
// this->mlm = new MessageListManager();
|
|
|
|
}
|
|
|
|
|
|
|
|
FirstIndex::~FirstIndex()
|
|
|
|
{
|
2021-01-10 09:01:22 +08:00
|
|
|
qDebug() << "~FirstIndex";
|
2021-01-19 10:44:28 +08:00
|
|
|
if(this->q_index)
|
|
|
|
delete this->q_index;
|
2021-01-09 11:25:07 +08:00
|
|
|
this->q_index = nullptr;
|
2021-01-19 10:44:28 +08:00
|
|
|
if(this->q_content_index)
|
|
|
|
delete this->q_content_index;
|
2021-01-10 09:01:22 +08:00
|
|
|
this->q_content_index = nullptr;
|
2021-01-19 19:26:39 +08:00
|
|
|
if (this->p_indexGenerator)
|
|
|
|
delete this->p_indexGenerator;
|
|
|
|
this->p_indexGenerator = nullptr;
|
|
|
|
qDebug() << "~FirstIndex end";
|
2021-01-09 11:25:07 +08:00
|
|
|
// delete this->mlm;
|
|
|
|
// this->mlm = nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void FirstIndex::DoSomething(const QFileInfo& fileInfo){
|
2021-01-19 10:44:28 +08:00
|
|
|
// qDebug() << "there are some shit here"<<fileInfo.fileName() << fileInfo.absoluteFilePath() << QString(fileInfo.isDir() ? "1" : "0");
|
2021-04-06 16:20:29 +08:00
|
|
|
this->q_index->enqueue(QVector<QString>() << fileInfo.fileName() << fileInfo.absoluteFilePath() << QString((fileInfo.isDir() && (!fileInfo.isSymLink())) ? "1" : "0"));
|
2021-04-07 22:28:49 +08:00
|
|
|
if ((!fileInfo.fileName().split(".").isEmpty()) && (true == targetFileTypeMap[fileInfo.fileName().split(".").last()])){
|
|
|
|
this->q_content_index->enqueue(fileInfo.absoluteFilePath());
|
2021-01-09 11:25:07 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void FirstIndex::run(){
|
2021-02-27 10:51:19 +08:00
|
|
|
QTime t1 = QTime::currentTime();
|
2021-01-26 11:32:02 +08:00
|
|
|
|
2021-01-22 09:49:44 +08:00
|
|
|
int fifo_fd;
|
|
|
|
char buffer[2];
|
|
|
|
memset(buffer, 0, sizeof(buffer));
|
|
|
|
buffer[0] = 0x1;
|
|
|
|
buffer[1] = '\0';
|
|
|
|
fifo_fd = open(UKUI_SEARCH_PIPE_PATH, O_RDWR);
|
|
|
|
if(fifo_fd == -1)
|
|
|
|
{
|
|
|
|
perror("open fifo error\n");
|
|
|
|
assert(false);
|
|
|
|
}
|
|
|
|
|
2021-01-19 19:26:39 +08:00
|
|
|
// this->q_content_index->enqueue(QString("/home/zhangzihao/Desktop/qwerty/四库全书.txt"));
|
|
|
|
|
|
|
|
// this->p_indexGenerator->creatAllIndex(this->q_content_index);
|
|
|
|
|
|
|
|
|
2021-01-22 17:15:43 +08:00
|
|
|
++FileUtils::_index_status;
|
|
|
|
|
2021-01-21 13:50:21 +08:00
|
|
|
pid_t pid;
|
|
|
|
pid = fork();
|
|
|
|
if(pid == 0)
|
|
|
|
{
|
2021-01-23 09:52:44 +08:00
|
|
|
prctl(PR_SET_PDEATHSIG, SIGTERM);
|
2021-01-21 13:50:21 +08:00
|
|
|
prctl(PR_SET_NAME,"first-index");
|
2021-01-26 11:32:02 +08:00
|
|
|
if (this->bool_dataBaseExist){
|
|
|
|
if (this->bool_dataBaseStatusOK){
|
2021-02-06 15:13:05 +08:00
|
|
|
::_exit(0);
|
2021-01-26 11:32:02 +08:00
|
|
|
}
|
|
|
|
else{
|
|
|
|
//if the parameter is false, index won't be rebuild
|
|
|
|
//if it is true, index will be rebuild
|
|
|
|
p_indexGenerator = IndexGenerator::getInstance(true,this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else{
|
2021-02-27 10:51:19 +08:00
|
|
|
// p_indexGenerator = IndexGenerator::getInstance(false,this);
|
|
|
|
p_indexGenerator = IndexGenerator::getInstance(true,this);
|
|
|
|
|
2021-01-26 11:32:02 +08:00
|
|
|
}
|
2021-01-21 13:50:21 +08:00
|
|
|
QSemaphore sem(5);
|
|
|
|
QMutex mutex1, mutex2, mutex3;
|
|
|
|
mutex1.lock();
|
|
|
|
mutex2.lock();
|
|
|
|
mutex3.lock();
|
|
|
|
sem.acquire(4);
|
|
|
|
QtConcurrent::run([&](){
|
|
|
|
sem.acquire(1);
|
|
|
|
mutex1.unlock();
|
2021-01-22 17:15:43 +08:00
|
|
|
this->setPath(QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
|
2021-01-21 13:50:21 +08:00
|
|
|
this->Traverse();
|
|
|
|
FileUtils::_max_index_count = this->q_index->length();
|
2021-02-27 10:51:19 +08:00
|
|
|
qDebug()<<"max_index_count:"<<FileUtils::_max_index_count;
|
2021-01-21 13:50:21 +08:00
|
|
|
sem.release(5);
|
|
|
|
});
|
|
|
|
QtConcurrent::run([&](){
|
|
|
|
sem.acquire(2);
|
|
|
|
mutex2.unlock();
|
|
|
|
qDebug() << "index start;";
|
2021-02-27 10:51:19 +08:00
|
|
|
QQueue<QVector<QString>>* tmp = new QQueue<QVector<QString>>();
|
|
|
|
while (!this->q_index->empty()) {
|
|
|
|
for (size_t i = 0; (i < 8192) && (!this->q_index->empty()); ++i){
|
|
|
|
tmp->enqueue(this->q_index->dequeue());
|
|
|
|
}
|
|
|
|
this->p_indexGenerator->creatAllIndex(tmp);
|
|
|
|
tmp->clear();
|
|
|
|
}
|
2021-03-01 09:07:33 +08:00
|
|
|
// this->p_indexGenerator->setSynonym();
|
2021-02-27 10:51:19 +08:00
|
|
|
delete tmp;
|
2021-01-21 13:50:21 +08:00
|
|
|
qDebug() << "index end;";
|
|
|
|
sem.release(2);
|
|
|
|
});
|
|
|
|
QtConcurrent::run([&](){
|
|
|
|
sem.acquire(2);
|
|
|
|
mutex3.unlock();
|
2021-03-06 16:41:16 +08:00
|
|
|
QQueue<QString>* tmp = new QQueue<QString>();
|
|
|
|
qDebug()<<"q_content_index:"<<q_content_index->size();
|
2021-02-27 10:51:19 +08:00
|
|
|
while (!this->q_content_index->empty()) {
|
|
|
|
// for (size_t i = 0; (i < this->u_send_length) && (!this->q_content_index->empty()); ++i){
|
|
|
|
for (size_t i = 0; (i < 30) && (!this->q_content_index->empty()); ++i){
|
|
|
|
tmp->enqueue(this->q_content_index->dequeue());
|
|
|
|
}
|
|
|
|
this->p_indexGenerator->creatAllIndex(tmp);
|
|
|
|
tmp->clear();
|
|
|
|
}
|
|
|
|
delete tmp;
|
2021-01-21 13:50:21 +08:00
|
|
|
qDebug() << "content index end;";
|
|
|
|
sem.release(2);
|
|
|
|
});
|
|
|
|
mutex1.lock();
|
|
|
|
mutex2.lock();
|
|
|
|
mutex3.lock();
|
|
|
|
sem.acquire(5);
|
2021-01-09 11:25:07 +08:00
|
|
|
mutex1.unlock();
|
|
|
|
mutex2.unlock();
|
|
|
|
mutex3.unlock();
|
2021-01-11 16:59:50 +08:00
|
|
|
|
2021-01-21 13:50:21 +08:00
|
|
|
if (this->q_index)
|
|
|
|
delete this->q_index;
|
|
|
|
this->q_index = nullptr;
|
|
|
|
if (this->q_content_index)
|
|
|
|
delete this->q_content_index;
|
|
|
|
this->q_content_index = nullptr;
|
2021-01-21 21:05:53 +08:00
|
|
|
if (p_indexGenerator)
|
|
|
|
delete p_indexGenerator;
|
|
|
|
p_indexGenerator = nullptr;
|
2021-02-25 14:40:44 +08:00
|
|
|
GlobalSettings::getInstance()->forceSync();
|
2021-02-06 15:13:05 +08:00
|
|
|
::_exit(0);
|
2021-01-21 13:50:21 +08:00
|
|
|
}
|
|
|
|
else if(pid < 0)
|
|
|
|
{
|
|
|
|
qWarning()<<"First Index fork error!!";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
waitpid(pid,NULL,0);
|
2021-01-22 17:15:43 +08:00
|
|
|
--FileUtils::_index_status;
|
2021-01-21 13:50:21 +08:00
|
|
|
}
|
2021-01-11 16:59:50 +08:00
|
|
|
|
2021-01-26 11:32:02 +08:00
|
|
|
|
2021-02-25 14:40:44 +08:00
|
|
|
GlobalSettings::getInstance()->setValue(INOTIFY_NORMAL_EXIT, "2");
|
2021-01-22 09:49:44 +08:00
|
|
|
int retval = write(fifo_fd, buffer, strlen(buffer));
|
|
|
|
if(retval == -1)
|
|
|
|
{
|
2021-01-26 11:32:02 +08:00
|
|
|
qWarning("write error\n");
|
2021-01-22 09:49:44 +08:00
|
|
|
}
|
2021-01-26 11:32:02 +08:00
|
|
|
qDebug("write data ok!\n");
|
2021-02-27 10:51:19 +08:00
|
|
|
QTime t2 = QTime::currentTime();
|
|
|
|
qWarning() << t1;
|
|
|
|
qWarning() << t2;
|
2021-02-25 14:40:44 +08:00
|
|
|
|
2021-01-26 11:32:02 +08:00
|
|
|
return;
|
2021-01-11 16:59:50 +08:00
|
|
|
|
2021-01-09 11:25:07 +08:00
|
|
|
}
|