forked from openkylin/ukui-search
add inotify create or delete index and fix first index makes the size of database increase unlimitedly
This commit is contained in:
parent
4fa288b97a
commit
e2fd50baa1
|
@ -103,15 +103,18 @@ QStringList GlobalSettings::getBlockDirs()
|
|||
return m_block_dirs_settings->allKeys();
|
||||
}
|
||||
|
||||
//here should be override
|
||||
//MouseZhangZh
|
||||
void GlobalSettings::setValue(const QString &key, const QVariant &value)
|
||||
{
|
||||
m_cache.insert(key, value);
|
||||
QtConcurrent::run([=]() {
|
||||
if (m_mutex.tryLock(1000)) {
|
||||
// if (m_mutex.tryLock(1000)) {
|
||||
m_mutex.lock();
|
||||
m_settings->setValue(key, value);
|
||||
m_settings->sync();
|
||||
m_mutex.unlock();
|
||||
}
|
||||
// }
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -14,9 +14,15 @@ FirstIndex::FirstIndex(const QString& path) : Traverse_BFS(path)
|
|||
if (indexDataBaseStatus == "" || contentIndexDataBaseStatus == ""){
|
||||
this->bool_dataBaseExist = false;
|
||||
}
|
||||
else{
|
||||
this->bool_dataBaseExist = true;
|
||||
}
|
||||
if (indexDataBaseStatus != "2" || contentIndexDataBaseStatus != "2"){
|
||||
this->bool_dataBaseStatusOK = false;
|
||||
}
|
||||
else{
|
||||
this->bool_dataBaseStatusOK = true;
|
||||
}
|
||||
|
||||
this->q_index = new QQueue<QVector<QString>>();
|
||||
this->q_content_index = new QQueue<QString>();
|
||||
|
@ -26,10 +32,13 @@ FirstIndex::FirstIndex(const QString& path) : Traverse_BFS(path)
|
|||
|
||||
FirstIndex::~FirstIndex()
|
||||
{
|
||||
qDebug() << "~FirstIndex";
|
||||
delete this->q_index;
|
||||
this->q_index = nullptr;
|
||||
this->q_content_index = nullptr;
|
||||
delete this->q_content_index;
|
||||
this->q_content_index = nullptr;
|
||||
delete this->p_indexGenerator;
|
||||
this->p_indexGenerator;
|
||||
// delete this->mlm;
|
||||
// this->mlm = nullptr;
|
||||
}
|
||||
|
@ -95,6 +104,10 @@ void FirstIndex::run(){
|
|||
mutex2.unlock();
|
||||
mutex3.unlock();
|
||||
qDebug() << "first index end;";
|
||||
//don't use it now!!!!
|
||||
//MouseZhangZh
|
||||
// this->~FirstIndex();
|
||||
// qDebug() << "~FirstIndex end;";
|
||||
this->quit();
|
||||
// this->wait();
|
||||
}
|
||||
|
|
|
@ -123,6 +123,7 @@ IndexGenerator::~IndexGenerator()
|
|||
if(m_database_content)
|
||||
delete m_database_content;
|
||||
GlobalSettings::getInstance()->setValue(INDEX_DATABASE_STATE,"2");
|
||||
GlobalSettings::getInstance()->setValue(CONTENT_INDEX_DATABASE_STATE,"2");
|
||||
GlobalSettings::getInstance()->setValue(INDEX_GENERATOR_NORMAL_EXIT,"2");
|
||||
}
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ class IndexGenerator : public QObject
|
|||
Q_OBJECT
|
||||
public:
|
||||
static IndexGenerator *getInstance(bool rebuild = false);
|
||||
~IndexGenerator();
|
||||
bool setIndexdataPath();
|
||||
bool isIndexdataExist();
|
||||
//for search test
|
||||
|
@ -29,7 +30,6 @@ public Q_SLOTS:
|
|||
|
||||
private:
|
||||
explicit IndexGenerator(bool rebuild = false,QObject *parent = nullptr);
|
||||
~IndexGenerator();
|
||||
//For file name index
|
||||
void HandlePathList(QList<QVector<QString>> *messageList);
|
||||
//For file content index
|
||||
|
|
|
@ -9,6 +9,7 @@ HEADERS += \
|
|||
$$PWD/first-index.h \
|
||||
$$PWD/index-generator.h \
|
||||
# $$PWD/inotify-manager.h \
|
||||
$$PWD/inotify-index.h \
|
||||
$$PWD/inotify.h \
|
||||
$$PWD/messagelist-manager.h \
|
||||
$$PWD/traverse_bfs.h \
|
||||
|
@ -25,6 +26,7 @@ SOURCES += \
|
|||
$$PWD/first-index.cpp \
|
||||
$$PWD/index-generator.cpp \
|
||||
# $$PWD/inotify-manager.cpp \
|
||||
$$PWD/inotify-index.cpp \
|
||||
$$PWD/inotify.cpp \
|
||||
$$PWD/messagelist-manager.cpp \
|
||||
$$PWD/test-Inotify-Manager.cpp \
|
||||
|
|
|
@ -0,0 +1,141 @@
|
|||
#include "inotify-index.h"
|
||||
|
||||
|
||||
InotifyIndex::InotifyIndex(const QString& path) : Traverse_BFS(path)
|
||||
{
|
||||
/*-------------ukuisearchdbus Test start-----------------*/
|
||||
qDebug() << "setInotifyMaxUserWatches start";
|
||||
UkuiSearchQDBus usQDBus;
|
||||
usQDBus.setInotifyMaxUserWatches();
|
||||
qDebug() << "setInotifyMaxUserWatches end";
|
||||
|
||||
/*-------------ukuisearchdbus Test End-----------------*/
|
||||
m_fd = inotify_init();
|
||||
qDebug() << "m_fd----------->" <<m_fd;
|
||||
|
||||
this->AddWatch("/home");
|
||||
this->Traverse();
|
||||
}
|
||||
|
||||
InotifyIndex::~InotifyIndex()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void InotifyIndex::DoSomething(const QFileInfo& fileInfo){
|
||||
if(fileInfo.isDir()){
|
||||
this->AddWatch(fileInfo.absoluteFilePath());
|
||||
}
|
||||
}
|
||||
|
||||
bool InotifyIndex::AddWatch(const QString &path){
|
||||
int ret = inotify_add_watch(m_fd, path.toStdString().c_str(), (IN_MOVED_FROM | IN_MOVED_TO | IN_CREATE | IN_DELETE));
|
||||
if (ret == -1) {
|
||||
qDebug() << "AddWatch error:" << path;
|
||||
return false;
|
||||
}
|
||||
Q_ASSERT(ret != -1);
|
||||
currentPath[ret] = path;
|
||||
//qDebug() << "Watch:" << path;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool InotifyIndex::RemoveWatch(const QString &path){
|
||||
int ret = inotify_rm_watch(m_fd, currentPath.key(path));
|
||||
if (ret){
|
||||
qDebug() << "remove path error";
|
||||
return false;
|
||||
}
|
||||
Q_ASSERT(ret != 0);
|
||||
|
||||
for (QMap<int, QString>::Iterator i = currentPath.begin(); i != currentPath.end();){
|
||||
if (i.value().length() > path.length()){
|
||||
if (i.value().mid(0, path.length()) == path){
|
||||
// qDebug() << i.value();
|
||||
/*--------------------------------*/
|
||||
//在此调用删除索引
|
||||
IndexGenerator::getInstance()->deleteAllIndex(new QStringList(path));
|
||||
/*--------------------------------*/
|
||||
currentPath.erase(i++);
|
||||
}
|
||||
else{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
// qDebug() << path;
|
||||
//这个貌似不用删,先mark一下
|
||||
//currentPath.remove(currentPath.key(path));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void InotifyIndex::run(){
|
||||
|
||||
char * p;
|
||||
char buf[BUF_LEN] __attribute__((aligned(8)));
|
||||
|
||||
ssize_t numRead;
|
||||
|
||||
QList<QVector<QString>>* indexList = new QList<QVector<QString>>();
|
||||
QList<QString>* contentIndexList = new QList<QString>();
|
||||
|
||||
for (;;) { /* Read events forever */
|
||||
numRead = read(m_fd, buf, BUF_LEN);
|
||||
if (numRead == 0) {
|
||||
qDebug() << "read() from inotify fd returned 0!";
|
||||
}
|
||||
if (numRead == -1) {
|
||||
qDebug() << "read";
|
||||
}
|
||||
qDebug() << "Read " << numRead << " bytes from inotify fd";
|
||||
|
||||
/* Process all of the events in buffer returned by read() */
|
||||
|
||||
for (p = buf; p < buf + numRead;) {
|
||||
struct inotify_event * event = reinterpret_cast<inotify_event *>(p);
|
||||
if(event->name[0] != '.'){
|
||||
|
||||
//传创建或移动过来的文件路径
|
||||
if((event->mask & IN_CREATE) | (event->mask & IN_MOVED_TO)){
|
||||
//添加监视要先序遍历,先添加top节点
|
||||
if (event->mask & IN_ISDIR){
|
||||
AddWatch(currentPath[event->wd] + '/' + event->name);
|
||||
this->setPath(currentPath[event->wd] + '/' + event->name);
|
||||
Traverse();
|
||||
}
|
||||
|
||||
/*--------------------------------*/
|
||||
// IndexGenerator::getInstance()->creatAllIndex(QQueue<QVector<QString>>(QVector<QString>() << fileInfo.fileName() << fileInfo.absoluteFilePath() << QString(fileInfo.isDir() ? "1" : "0")));
|
||||
indexList->append(QVector<QString>() << QString(event->name) << QString(currentPath[event->wd] + '/' + event->name) << QString((event->mask & IN_ISDIR) ? "1" : "0"));
|
||||
IndexGenerator::getInstance()->creatAllIndex(indexList);
|
||||
indexList->clear();
|
||||
for (auto i : this->targetFileTypeVec){
|
||||
if (QString(currentPath[event->wd] + '/' + event->name).endsWith(i)){
|
||||
contentIndexList->append(QString(currentPath[event->wd] + '/' + event->name));
|
||||
IndexGenerator::getInstance()->creatAllIndex(contentIndexList);
|
||||
contentIndexList->clear();
|
||||
}
|
||||
}
|
||||
/*--------------------------------*/
|
||||
}
|
||||
else if((event->mask & IN_DELETE) | (event->mask & IN_MOVED_FROM)){
|
||||
if (event->mask & IN_ISDIR){
|
||||
RemoveWatch(currentPath[event->wd] + '/' + event->name);
|
||||
}
|
||||
IndexGenerator::getInstance()->deleteAllIndex(new QStringList(currentPath[event->wd] + '/' + event->name));
|
||||
}
|
||||
/*--------------------------------*/
|
||||
}
|
||||
p += sizeof(struct inotify_event) + event->len;
|
||||
}
|
||||
}
|
||||
|
||||
delete indexList;
|
||||
indexList = nullptr;
|
||||
delete contentIndexList;
|
||||
contentIndexList = nullptr;
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
#ifndef INOTIFYINDEX_H
|
||||
#define INOTIFYINDEX_H
|
||||
|
||||
#include <QThread>
|
||||
#include <unistd.h>
|
||||
#include <sys/inotify.h>
|
||||
#include "index-generator.h"
|
||||
#include "traverse_bfs.h"
|
||||
#include "ukui-search-qdbus.h"
|
||||
|
||||
#define BUF_LEN 1024
|
||||
|
||||
class InotifyIndex : public QThread, public Traverse_BFS
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
InotifyIndex(const QString&);
|
||||
~InotifyIndex();
|
||||
|
||||
bool AddWatch(const QString&);
|
||||
bool RemoveWatch(const QString&);
|
||||
virtual void DoSomething(const QFileInfo &) final;
|
||||
protected:
|
||||
void run() override;
|
||||
private:
|
||||
QString* m_watch_path;
|
||||
int m_fd;
|
||||
|
||||
QMap<int, QString> currentPath;
|
||||
const QVector<QString> targetFileTypeVec ={
|
||||
// QString(".doc"),
|
||||
QString(".docx"),
|
||||
// QString(".ppt"),
|
||||
// QString(".pptx"),
|
||||
// QString(".xls"),
|
||||
// QString(".xlsx"),
|
||||
QString(".txt")};
|
||||
};
|
||||
|
||||
#endif // INOTIFYINDEX_H
|
|
@ -33,7 +33,7 @@ InotifyManagerRefact::InotifyManagerRefact(const QString& path) : Traverse_BFS(p
|
|||
num2string.insert(IN_UNMOUNT, "IN_UNMOUNT");
|
||||
num2string.insert(IN_Q_OVERFLOW, "IN_Q_OVERFLOW");
|
||||
num2string.insert(IN_IGNORED, "IN_IGNORED");
|
||||
this->mlm = new MessageListManager();
|
||||
// this->mlm = new MessageListManager();
|
||||
|
||||
this->AddWatch("/home");
|
||||
this->Traverse();
|
||||
|
@ -44,14 +44,14 @@ InotifyManagerRefact::InotifyManagerRefact(const QString& path) : Traverse_BFS(p
|
|||
}
|
||||
|
||||
InotifyManagerRefact::~InotifyManagerRefact(){
|
||||
delete this->mlm;
|
||||
this->mlm = nullptr;
|
||||
// delete this->mlm;
|
||||
// this->mlm = nullptr;
|
||||
// delete dirPath;
|
||||
// dirPath = nullptr;
|
||||
}
|
||||
|
||||
void InotifyManagerRefact::DoSomething(const QFileInfo& fileInfo){
|
||||
this->mlm->AddMessage(QVector<QString>() << fileInfo.fileName() << fileInfo.absoluteFilePath() << QString(fileInfo.isDir()?"1":"0"));
|
||||
// this->mlm->AddMessage(QVector<QString>() << fileInfo.fileName() << fileInfo.absoluteFilePath() << QString(fileInfo.isDir()?"1":"0"));
|
||||
// if(QString(bool((fileInfo.isDir()))) == QString("1"))
|
||||
// qDebug()<<"bool((fileInfo.isDir())"<<QString(fileInfo.isDir());
|
||||
// this->mlm->AddMessage(QVector<QString>() << "PLog" << "/home/zpf/baidunetdisk/PLog" << "1");
|
||||
|
@ -65,7 +65,7 @@ void InotifyManagerRefact::DoSomething(const QFileInfo& fileInfo){
|
|||
|
||||
void InotifyManagerRefact::SendRestMessage()
|
||||
{
|
||||
this->mlm->SendMessage();
|
||||
// this->mlm->SendMessage();
|
||||
}
|
||||
|
||||
bool InotifyManagerRefact::AddWatch(const QString &path){
|
||||
|
@ -73,6 +73,7 @@ bool InotifyManagerRefact::AddWatch(const QString &path){
|
|||
// qDebug() << "m_fd: " <<m_fd;
|
||||
//int ret = inotify_add_watch(m_fd, path.toStdString().c_str(), IN_ALL_EVENTS);
|
||||
int ret = inotify_add_watch(m_fd, path.toStdString().c_str(), (IN_MOVED_FROM | IN_MOVED_TO | IN_CREATE | IN_DELETE));
|
||||
Q_ASSERT(ret == 0);
|
||||
if (ret == -1) {
|
||||
qDebug() << "AddWatch error:" << path;
|
||||
return false;
|
||||
|
@ -155,8 +156,8 @@ void InotifyManagerRefact::run(){
|
|||
// else {
|
||||
|
||||
//IndexGenerator::getInstance()->creatAllIndex(new QStringList(currentPath[event->wd] + '/' + event->name));
|
||||
this->mlm->AddMessage(QVector<QString>() << event->name << (currentPath[event->wd] + '/' + event->name) << QString(bool((event->mask & IN_ISDIR))));
|
||||
this->mlm->SendMessage();
|
||||
// this->mlm->AddMessage(QVector<QString>() << event->name << (currentPath[event->wd] + '/' + event->name) << QString(bool((event->mask & IN_ISDIR))));
|
||||
// this->mlm->SendMessage();
|
||||
// }
|
||||
}
|
||||
else if((event->mask & IN_DELETE) | (event->mask & IN_MOVED_FROM)){
|
||||
|
|
|
@ -29,7 +29,7 @@ private:
|
|||
int m_fd;
|
||||
QMap<int, QString> currentPath;
|
||||
QMap<int, QString> num2string;
|
||||
MessageListManager* mlm;
|
||||
// MessageListManager* mlm;
|
||||
|
||||
QMap<QString, QStringList>* dirPath;
|
||||
};
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "index/filetypefilter.h"
|
||||
|
||||
#include "index/ukui-search-qdbus.h"
|
||||
#include "index/inotify-index.h"
|
||||
|
||||
class LIBSEARCH_EXPORT GlobalSearch
|
||||
{
|
||||
|
|
|
@ -94,8 +94,10 @@ int main(int argc, char *argv[])
|
|||
qInstallMessageHandler(messageOutput);
|
||||
|
||||
qDebug() << "main start";
|
||||
FirstIndex* fi = new FirstIndex("/home");
|
||||
fi->start();
|
||||
FirstIndex fi("/home");
|
||||
fi.start();
|
||||
InotifyIndex ii("/home");
|
||||
ii.start();
|
||||
/*-------------ukuisearchdbus Test start-----------------*/
|
||||
// UkuiSearchQDBus usQDBus;
|
||||
// usQDBus.setInotifyMaxUserWatches();
|
||||
|
|
Loading…
Reference in New Issue