Compare commits

..

No commits in common. "a41564392350d158fa44eb797ccd6d8c8b31f800" and "5272365e5a087dd2660aa2ee1f9a9b6aed08b8f2" have entirely different histories.

共有 13 個文件被更改,包括 10 次插入155 次删除

查看文件

@ -15,7 +15,6 @@ DEFINES += QT_DEPRECATED_WARNINGS
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
commandtag.cpp \
main.cpp \
commandadd.cpp \
commanddelete.cpp \
@ -28,7 +27,6 @@ HEADERS += \
command.h \
commandadd.h \
commanddelete.h \
commandtag.h \
commandupdate.h \
commandsearch.h \
commandlist.h

查看文件

@ -2,6 +2,7 @@
#include <QThread>
#include <QDebug>
#include "command.h"
#include "looqsgeneralexception.h"
void Command::execute()
{

查看文件

@ -1,5 +1,6 @@
#include <QCommandLineParser>
#include "commandsearch.h"
#include "databasefactory.h"
#include "logger.h"
int CommandSearch::handle(QStringList arguments)

查看文件

@ -1,65 +0,0 @@
#include <QCommandLineParser>
#include "commandtag.h"
#include "logger.h"
int CommandTag::handle(QStringList arguments)
{
QCommandLineParser parser;
parser.addPositionalArgument("add", "Adds a tag to a file",
"add [tag] [paths...]. Adds the tag to the specified paths");
parser.addPositionalArgument("remove", "Removes a file associated to tag", "remove [tag] [file]");
parser.addPositionalArgument("delete", "Deletes a tag", "delete [tag]");
parser.addPositionalArgument("list", "Lists paths associated with a tag, or all tags", "list [tag]");
parser.addHelpOption();
parser.parse(arguments);
QStringList args = parser.positionalArguments();
if(args.length() == 0)
{
parser.showHelp(EXIT_FAILURE);
return EXIT_FAILURE;
}
QString cmd = args[0];
qDebug() << cmd;
if(cmd == "add")
{
if(args.length() < 3)
{
Logger::error() << "Not enough arguments provided. 'add' requires a tag followed by at least one path"
<< Qt::endl;
return EXIT_FAILURE;
}
QString tag = args[1];
auto paths = args.mid(2).toVector();
for(int i = 0; i < paths.size(); i++)
{
QFileInfo info{paths[i]};
if(!info.exists())
{
Logger::error() << "Can't add tag for file " + info.absoluteFilePath() + " because it does not exist"
<< Qt::endl;
return EXIT_FAILURE;
}
QString absolutePath = info.absoluteFilePath();
if(!this->dbService->fileExistsInDatabase(absolutePath))
{
Logger::error() << "Only files that have been indexed can be tagged. File not in index: " + absolutePath
<< Qt::endl;
return EXIT_FAILURE;
}
paths[i] = absolutePath;
}
bool result = this->dbService->addTag(tag, paths);
if(!result)
{
Logger::error() << "Failed to assign tags" << Qt::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
return 0;
}

查看文件

@ -1,13 +0,0 @@
#ifndef COMMANDTAG_H
#define COMMANDTAG_H
#include "command.h"
class CommandTag : public Command
{
public:
using Command::Command;
int handle(QStringList arguments) override;
};
#endif // COMMANDTAG_H

查看文件

@ -21,7 +21,6 @@
#include "commandupdate.h"
#include "commandsearch.h"
#include "commandlist.h"
#include "commandtag.h"
#include "databasefactory.h"
#include "logger.h"
#include "sandboxedprocessor.h"
@ -32,7 +31,7 @@
void printUsage(QString argv0)
{
qInfo() << "Usage:" << argv0 << "command";
qInfo() << "Valid commands: add, update, search, delete, tag, list. Each command has a --help option.";
qInfo() << "Valid commands: add, update, delete, search, list. Each command has a --help option.";
}
Command *commandFromName(QString name, SqliteDbService &dbService)
@ -57,10 +56,6 @@ Command *commandFromName(QString name, SqliteDbService &dbService)
{
return new CommandList(dbService);
}
if(name == "tag")
{
return new CommandTag(dbService);
}
return nullptr;
}

查看文件

@ -193,7 +193,7 @@ int main(int argc, char *argv[])
Logger::error() << error << Qt::endl;
QMessageBox::critical(nullptr, "Error during upgrade",
error);
exit(EXIT_FAILURE);
qApp->quit();
}
);

查看文件

@ -877,8 +877,6 @@ void MainWindow::handleSearchResults(const QVector<SearchResult> &results)
makePreviews(1);
}
ui->tabWidget->setTabEnabled(1, previewDirty);
QString statusText = "Results: " + QString::number(results.size()) + " files";
statusText += ", previewable: " + QString::number(this->previewCoordinator.previewableCount());
if(hasDeleted)

查看文件

@ -146,7 +146,10 @@ SaveFileResult FileSaver::saveFile(const QFileInfo &fileInfo)
if(mustFillContent)
{
auto filetype = this->dbService->queryFileType(fileInfo.absolutePath());
mustFillContent = !filetype.has_value() || filetype.value() == 'c';
if(filetype)
{
mustFillContent = filetype.value() == 'c';
}
}
}

查看文件

@ -1,6 +0,0 @@
CREATE TABLE tag(id integer PRIMARY KEY, name varchar(128) UNIQUE);
CREATE TABLE filetag(fileid integer, tagid integer);
CREATE INDEX filetag_fileid ON filetag(fileid);
CREATE INDEX tag_id ON tag(id);
CREATE INDEX file_path ON file ( path );
UPDATE file SET filetype='c' WHERE filetype='f';

查看文件

@ -4,6 +4,5 @@
<file>2.sql</file>
<file>3.sql</file>
<file>4.sql</file>
<file>5.sql</file>
</qresource>
</RCC>

查看文件

@ -2,7 +2,6 @@
#include <QFileInfo>
#include <QDateTime>
#include <QSqlError>
#include "looqsgeneralexception.h"
#include "sqlitedbservice.h"
#include "filedata.h"
#include "logger.h"
@ -16,7 +15,7 @@ QVector<SearchResult> SqliteDbService::search(const LooqsQuery &query)
std::optional<QChar> SqliteDbService::queryFileType(QString absPath)
{
auto query = exec("SELECT filetype FROM file WHERE path = ?", {absPath});
auto query = exec("SELCET filetype FROM file WHERE path = ?", {absPath});
if(!query.next())
{
return {};
@ -152,7 +151,7 @@ QSqlQuery SqliteDbService::exec(QString querystr, std::initializer_list<QVariant
}
if(!query.exec())
{
throw LooqsGeneralException("Error while exec(): " + query.lastError().text() + " for query: " + querystr);
throw LooqsGeneralException("Error while exec(): " + query.lastError().text());
}
return query;
}
@ -234,56 +233,3 @@ SaveFileResult SqliteDbService::saveFile(QFileInfo fileInfo, QVector<PageData> &
}
return OK;
}
bool SqliteDbService::addTag(QString tag, QString path)
{
QVector<QString> paths;
paths.append(path);
return addTag(tag, paths);
}
bool SqliteDbService::addTag(QString tag, const QVector<QString> &paths)
{
QSqlDatabase db = dbFactory->forCurrentThread();
QSqlQuery tagQuery(db);
QSqlQuery fileTagQuery(db);
tagQuery.prepare("INSERT OR IGNORE INTO tag (name) VALUES(?)");
tagQuery.addBindValue(tag);
fileTagQuery.prepare("INSERT INTO filetag(fileid, tagid) VALUES((SELECT id FROM file WHERE path = ?), (SELECT id "
"FROM tag WHERE name = ?))");
fileTagQuery.bindValue(1, tag);
if(!db.transaction())
{
Logger::error() << "Failed to open transaction to add paths for tag " << tag << " : " << db.lastError()
<< Qt::endl;
return false;
}
if(!tagQuery.exec())
{
db.rollback();
Logger::error() << "Failed INSERT query" << tagQuery.lastError() << Qt::endl;
return false;
}
for(const QString &path : paths)
{
fileTagQuery.bindValue(0, path);
if(!fileTagQuery.exec())
{
db.rollback();
Logger::error() << "Failed to add paths to tag" << Qt::endl;
return false;
}
}
if(!db.commit())
{
db.rollback();
Logger::error() << "Failed to commit tag insertion transaction" << db.lastError() << Qt::endl;
return false;
}
return true;
}

查看文件

@ -28,8 +28,6 @@ class SqliteDbService
bool fileExistsInDatabase(QString path);
bool fileExistsInDatabase(QString path, qint64 mtime);
bool fileExistsInDatabase(QString path, qint64 mtime, QChar filetype);
bool addTag(QString tag, QString path);
bool addTag(QString tag, const QVector<QString> &paths);
QVector<SearchResult> search(const LooqsQuery &query);
std::optional<QChar> queryFileType(QString absPath);