summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2015-03-21 07:10:32 +0100
committerArno <am@disconnect.de>2015-03-21 07:10:32 +0100
commite6b7e5e0fccef756398982bd51137bb433df7f4a (patch)
tree7ed19e9f60d30269124ef54ec47fc9e68718d6e1
parentd4708602ac2ec4f23161ae154eb86e3f6a2740fb (diff)
downloadSheMov-e6b7e5e0fccef756398982bd51137bb433df7f4a.tar.gz
SheMov-e6b7e5e0fccef756398982bd51137bb433df7f4a.tar.bz2
SheMov-e6b7e5e0fccef756398982bd51137bb433df7f4a.zip
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.
-rw-r--r--archivemodel.cpp27
-rw-r--r--archivemodel.h2
-rw-r--r--filesystemwidget.cpp57
-rw-r--r--filesystemwidget.h1
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<int> &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<QString, QString> 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("<html>");
+ msg.append(tr("<p>Result:</p>"));
+ msg.append("<ul>");
+ QMap<QString, QString>::const_iterator it = res.constBegin();
+ while(it != res.constEnd()){
+ QString m = QString(tr("<li>%1: %2</li>")).arg(it.key()).arg(it.value());
+ msg.append(m);
+ ++it; }
+ msg.append("</ul>");
+ msg.append("</html>");
+ 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);