From e6b7e5e0fccef756398982bd51137bb433df7f4a Mon Sep 17 00:00:00 2001 From: Arno Date: Sat, 21 Mar 2015 07:10:32 +0100 Subject: Fixed and beefed up "Move to archive" It crashed when used on directories, because naturally md5sum was empty. So recurse through directories, collect files and check if we have a DB- Entry. If so, move the files back to archive. If not, skip them. --- archivemodel.cpp | 27 +++++++++++++++++++++++++ archivemodel.h | 2 ++ filesystemwidget.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++-- filesystemwidget.h | 1 + 4 files changed, 85 insertions(+), 2 deletions(-) diff --git a/archivemodel.cpp b/archivemodel.cpp index 695dd09..d1580de 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -1001,6 +1001,33 @@ void ArchiveFilesModel::updateSeriesPartForFile(const QString &md5sum, int newSe q.exec(); } +bool ArchiveFilesModel::hasFile(const QString &md5){ + if(md5.isEmpty()){ + return false; + } + QSqlDatabase db = QSqlDatabase::database("treedb"); + QSqlQuery fileQ(db); + fileQ.prepare("SELECT COUNT(*) FROM files WHERE cmd5sum = :md5"); + fileQ.bindValue(":md5", md5); + bool retval = false; + fileQ.exec(); + while(fileQ.next()){ + if(fileQ.value(0).toInt() == 1){ + retval = true; + } + } + return retval; +} + +bool ArchiveFilesModel::setDvdNo(const QString &md5, int dvdno){ + QSqlDatabase db = QSqlDatabase::database("treedb"); + QSqlQuery dvdNoQ(db); + dvdNoQ.prepare("UPDATE files SET idvd = :dvdno WHERE cmd5sum = :md5"); + dvdNoQ.bindValue(":dvdno", dvdno); + dvdNoQ.bindValue(":md5", md5); + return dvdNoQ.exec(); +} + void ArchiveFilesModel::refresh(){ populate(mSeriesPartIds); } diff --git a/archivemodel.h b/archivemodel.h index 8dd60f8..27cd8cf 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -105,6 +105,8 @@ class ArchiveFilesModel : public SmTreeModel { void populate(const QSet &seriesPartIds); QStringList filesForSeriespart(int seriesPartId) const; void updateSeriesPartForFile(const QString &md5sum, int newSeriesPart); + static bool hasFile(const QString &md5); + static bool setDvdNo(const QString &md5, int dvdno); public slots: void refresh(); diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp index 2dd8076..eadbac8 100644 --- a/filesystemwidget.cpp +++ b/filesystemwidget.cpp @@ -33,6 +33,7 @@ #include "delegates.h" #include "smdirmodel.h" #include "smdialog.h" +#include "archivemodel.h" FilesystemWidget::FilesystemWidget(QWidget *parent) : QWidget(parent), mClipboardMode(None) { mModel = new FileSystemModel(this); @@ -477,10 +478,47 @@ void FilesystemWidget::dvdMount(){ void FilesystemWidget::moveToArchive(){ QStringList selected = selectedFiles(); - foreach(QFileInfo fi, selected){ + QFileInfoList files; + foreach(QString f, selected){ + QFileInfo fi(f); + if(fi.isDir()){ + files.append(getRecursive(fi)); + }else{ + files.append(fi); + } + } + QMap res; + foreach(QFileInfo fi, files){ + if(!fi.exists()){ + res.insert(fi.fileName(), tr("File not found")); + continue; + } QString md5 = Helper::md5Sum(fi.absoluteFilePath()); - Helper::moveToArchive(fi.absoluteFilePath(), md5); + if(!ArchiveFilesModel::hasFile(md5)){ + res.insert(fi.fileName(), tr("Not in archive")); + continue; + } + QString mvres = Helper::moveToArchive(fi.absoluteFilePath(), md5); + if(mvres.isEmpty()){ + res.insert(fi.fileName(), tr("Move failed")); + continue; + } + if(!ArchiveFilesModel::setDvdNo(md5, -1)){ + res.insert(fi.fileName(), tr("DvdNo. update failed")); + } + res.insert(fi.fileName(), tr("Success")); } + QString msg(""); + msg.append(tr("

Result:

")); + msg.append("
    "); + QMap::const_iterator it = res.constBegin(); + while(it != res.constEnd()){ + QString m = QString(tr("
  • %1: %2
  • ")).arg(it.key()).arg(it.value()); + msg.append(m); + ++it; } + msg.append("
"); + msg.append(""); + QMessageBox::information(this, tr("Move to archive"), msg, QMessageBox::Ok); } void FilesystemWidget::selectAllPV(){ @@ -563,6 +601,21 @@ void FilesystemWidget::deleteRecursive(const QFileInfo &start){ } } +QFileInfoList FilesystemWidget::getRecursive(const QFileInfo &start) const{ + QFileInfoList retval; + if(start.isDir()){ + QDir curDir = QDir(start.absoluteFilePath()); + foreach(QFileInfo info, curDir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot)){ + if(info.isDir()){ + retval.append(getRecursive(info)); + }else{ + retval.append(info); + } + } + } + return retval; +} + void FilesystemWidget::copyFiles(const QStringList &files, const QString &dest){ foreach(const QString file, files){ QFileInfo fi(file); diff --git a/filesystemwidget.h b/filesystemwidget.h index 23f8572..c909811 100644 --- a/filesystemwidget.h +++ b/filesystemwidget.h @@ -83,6 +83,7 @@ class FilesystemWidget : public QWidget { private: void deleteRecursive(const QFileInfo &start); + QFileInfoList getRecursive(const QFileInfo &start) const; void copyFiles(const QStringList &files, const QString &dest); void moveFiles(const QStringList &files, const QString &dest); void copyRecursive(const QFileInfo &start, const QString &destdir); -- cgit v1.2.3-70-g09d2