CommandDelete: refactored to use sqlitedbservice

This commit is contained in:
Albert S. 2019-04-16 08:52:07 +02:00
parent c6a7663ffa
commit 4ece459d77
2 changed files with 49 additions and 64 deletions

View File

@ -5,88 +5,71 @@
#include <QRegularExpression> #include <QRegularExpression>
#include <QSqlError> #include <QSqlError>
#include "commanddelete.h" #include "commanddelete.h"
#include "logger.h"
int CommandDelete::removeNonExistent(bool verbose, bool dryRun, QString pattern)
int CommandDelete::removeNonExistent(QSqlDatabase &db, bool verbose, bool dryRun, QString pattern)
{ {
int offset = 0;
//TODO: port this to QRegularExpression once >5.12 gets more widespread because of this bug int limit = 1000;
//https://bugreports.qt.io/browse/QTBUG-72539?focusedCommentId=439053&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel QVector<FileData> files;
int processedRows = this->dbService->getFiles(files, pattern, 0, limit);
// QRegularExpression regexPattern = QRegularExpression::wildcardToRegularExpression(pattern while(processedRows > 0 )
bool usePattern = ! pattern.isEmpty();
QRegExp regexPattern(pattern);
regexPattern.setPatternSyntax(QRegExp::PatternSyntax::WildcardUnix);
//TODO: try to translate pattern to SQL WHERE statement
QSqlQuery pathsQuery("SELECT path FROM file", db);
if(!pathsQuery.exec())
{ {
Utils::error() << "Failed to query current paths" << endl; for(FileData &file : files)
return 1;
}
while(pathsQuery.next())
{
QString path = pathsQuery.value(0).toString();
bool removeFile = true;
if(usePattern)
{ {
removeFile = regexPattern.exactMatch(path); if(!dryRun)
}
if(removeFile)
{
QFile file(path);
if(!file.exists())
{ {
if(!dryRun) QFileInfo fileInfo(file.absPath);
if(fileInfo.exists())
{ {
QSqlQuery query("DELETE FROM file WHERE path = ?", db); if(this->dbService->deleteFile(file.absPath))
query.addBindValue(path);
if(!query.exec())
{ {
Utils::error() << "Failed to delete " << path << query.lastError() << endl; if(verbose)
{
Logger::info() << "Deleted" << file.absPath << endl;
}
}
else
{
Logger::error()<< "Failed to delete:" << file.absPath << ", exiting." << endl
;
return 1; return 1;
} }
if(verbose)
{
Utils::info() << "Deleted " << path << endl;
}
} }
else
{
Utils::info() << "Would delete " << path << endl;
}
} }
} else
} {
} Logger::info() << "Would delete " << file.absPath << endl;
}
int CommandDelete::removePaths(const QStringList &paths, QSqlDatabase &db, bool verbose, bool dryRun) }
offset += limit;
processedRows = this->dbService->getFiles(files, pattern, 0, limit);
}
return 0;
}
int CommandDelete::removePaths(const QStringList &paths, bool verbose, bool dryRun)
{ {
int result = 0; int result = 0;
for(const QString &file : paths) for(const QString &file : paths)
{ {
QFileInfo fileInfo(file); QFileInfo fileInfo(file);
QString absPath = fileInfo.absoluteFilePath(); QString absPath = fileInfo.absoluteFilePath();
if(fileExistsInDatabase(db, absPath)) if(this->dbService->fileExistsInDatabase(absPath))
{ {
if(!dryRun) if(!dryRun)
{ {
QSqlQuery deletionQuery("DELETE FROM file WHERE path = ?", db); if(this->dbService->deleteFile(absPath))
deletionQuery.addBindValue(absPath);
if(deletionQuery.exec())
{ {
if(verbose) if(verbose)
{ {
Utils::info() << "Deleted" << absPath << endl; Logger::info() << "Deleted" << absPath << endl;
} }
} }
else else
{ {
Utils::error()<< "Failed to delete:" << absPath << deletionQuery.lastError() << endl; Logger::error()<< "Failed to delete:" << absPath << endl;
result = 1; result = 1;
} }
} }
@ -94,12 +77,13 @@ int CommandDelete::removePaths(const QStringList &paths, QSqlDatabase &db, bool
} }
else else
{ {
Utils::error() << "No such file in database:" << absPath << endl; Logger::error() << "No such file in database:" << absPath << endl;
result = 1; result = 1;
} }
} }
return result; return result;
} }
int CommandDelete::handle(QStringList arguments) int CommandDelete::handle(QStringList arguments)
{ {
QCommandLineParser parser; QCommandLineParser parser;
@ -117,13 +101,10 @@ int CommandDelete::handle(QStringList arguments)
bool verbose = parser.isSet("verbose"); bool verbose = parser.isSet("verbose");
bool dryRun = parser.isSet("dry-run"); bool dryRun = parser.isSet("dry-run");
QString pattern = parser.value("pattern"); QString pattern = parser.value("pattern");
QSqlDatabase db = dbConnection();
if(parser.isSet("deleted")) if(parser.isSet("deleted"))
{ {
int result = removeNonExistent(db, verbose, dryRun, pattern); int result = removeNonExistent(verbose, dryRun, pattern);
if(result != 0) if(result != 0)
{ {
return result; return result;
@ -131,13 +112,17 @@ int CommandDelete::handle(QStringList arguments)
} }
QStringList files = parser.positionalArguments(); QStringList files = parser.positionalArguments();
int result = removePaths(files,db, verbose, dryRun); if(files.length() > 0)
if(result != 0)
{ {
return result; int result = removePaths(files, verbose, dryRun);
if(result != 0)
{
return result;
}
} }
return 0; return 0;
} }

View File

@ -9,8 +9,8 @@ public:
int handle(QStringList arguments) override; int handle(QStringList arguments) override;
private: private:
int removeNonExistent(QSqlDatabase &db, bool verbose, bool dryRun, QString pattern); int removeNonExistent(bool verbose, bool dryRun, QString pattern);
int removePaths(const QStringList &paths, QSqlDatabase &db, bool verbose, bool dryRun); int removePaths(const QStringList &paths, bool verbose, bool dryRun);
}; };
#endif // COMMANDDELETE_H #endif // COMMANDDELETE_H