summaryrefslogtreecommitdiffstats
path: root/consistencycheck.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'consistencycheck.cpp')
-rw-r--r--consistencycheck.cpp176
1 files changed, 176 insertions, 0 deletions
diff --git a/consistencycheck.cpp b/consistencycheck.cpp
new file mode 100644
index 0000000..38aa4a1
--- /dev/null
+++ b/consistencycheck.cpp
@@ -0,0 +1,176 @@
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version
+ 2 of the License, or (at your option) any later version.
+*/
+
+#include <QLabel>
+#include <QPushButton>
+#include <QTextEdit>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QSqlQuery>
+#include <QFileInfo>
+#include <QSignalMapper>
+#include <QTextCursor>
+#include <QMutexLocker>
+#include <QMutex>
+#include <QTextCharFormat>
+#include <QBrush>
+
+#include "consistencycheck.h"
+#include "helper.h"
+
+ConsistencyCheck::ConsistencyCheck(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f), mChecker(0){
+ // setup widget
+ mCheckLabel = new QLabel(tr("Checking database consistency"));
+ mDisplay = new QTextEdit;
+ mCancelExit = new QPushButton(tr("Cancel"));
+ mCheckDb = new QPushButton(tr("Check database"));
+ mCheckFs = new QPushButton(tr("Check Filesystem"));
+ QHBoxLayout *buttonLayout = new QHBoxLayout;
+ buttonLayout->addWidget(mCheckDb);
+ buttonLayout->addWidget(mCheckFs);
+ buttonLayout->addStretch();
+ buttonLayout->addWidget(mCancelExit);
+ connect(mCancelExit, SIGNAL(clicked()), this, SLOT(cancelExit()));
+
+ // signal mapper
+ QSignalMapper *mapper = new QSignalMapper(this);
+ connect(mCheckDb, SIGNAL(clicked()), mapper, SLOT(map()));
+ mapper->setMapping(mCheckDb, ConsistencyCheck::DbCheck);
+ connect(mCheckFs, SIGNAL(clicked()), mapper, SLOT(map()));
+ mapper->setMapping(mCheckFs, ConsistencyCheck::FsCheck);
+ connect(mapper, SIGNAL(mapped(int)), this, SLOT(startChecker(int)));
+
+ // main layout
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addWidget(mCheckLabel);
+ mainLayout->addWidget(mDisplay);
+ mainLayout->addLayout(buttonLayout);
+ setWindowTitle(tr("Checking consistency"));
+ setLayout(mainLayout);
+}
+
+void ConsistencyCheck::startChecker(int checkerType){
+ mChecker = new ConsistencyChecker;
+ if(mChecker->status() == ConsistencyChecker::Fail){
+ return;
+ }
+ switch(checkerType){
+ case DbCheck:
+ mChecker->setMode(ConsistencyCheck::DbCheck);
+ break;
+ case FsCheck:
+ ;
+ break;
+ default:
+ ;
+ }
+ connect(mChecker, SIGNAL(consistencyMsg(QString)), this, SLOT(addMessage(QString)));
+ mChecker->check();
+}
+
+void ConsistencyCheck::addMessage(const QString &message){
+ QTextCursor cursor(mDisplay->textCursor());
+ QTextCharFormat fmt;
+ if(message.startsWith("OK")){
+ fmt.setForeground(QBrush(Qt::green));
+ }else{
+ fmt.setForeground(QBrush(Qt::red));
+ }
+ cursor.insertBlock();
+ cursor.setCharFormat(fmt);
+ cursor.insertText(message);
+}
+
+void ConsistencyCheck::cancelExit(){
+ if(mChecker->isRunning()){
+ mChecker->cancel(true);
+ mCancelExit->setText(tr("Close"));
+ connect(mCancelExit, SIGNAL(clicked()), this, SLOT(accept()));
+ }else{
+ close();
+ }
+}
+
+ConsistencyChecker::ConsistencyChecker(QObject *parent) : QThread(parent), mCanceled(false), mMode(-1), mStatus(Ok){
+ mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), "checkerDb");
+ if(!mDb.open()){
+ mStatus = Fail;
+ }
+}
+
+void ConsistencyChecker::check(){
+ if(!isRunning()){
+ start();
+ }
+}
+
+void ConsistencyChecker::cancel(bool cancel){
+ if(!cancel){
+ return;
+ }
+ QMutexLocker locker(&mCancelMutex);
+ mCanceled = true;
+}
+
+ConsistencyChecker::~ConsistencyChecker(){
+ mDb.close();
+}
+
+void ConsistencyChecker::run(){
+ switch(mMode){
+ case ConsistencyCheck::DbCheck:
+ dbCheck();
+ break;
+ default:
+ ;
+ }
+}
+
+void ConsistencyChecker::dbCheck(){
+ QSqlQuery fileDbQuery = QSqlQuery("SELECT tfilename, cmd5sum, idvd FROM files ORDER BY tfilename", mDb);
+ while(fileDbQuery.next()){
+ QMutexLocker locker(&mCancelMutex);
+ if(mCanceled){
+ return;
+ }
+ QString fileName = fileDbQuery.value(0).toString();
+ QString md5sum = fileDbQuery.value(1).toString();
+ int dvdNo = fileDbQuery.value(2).toInt();
+ QString fullPath = archivePath(fileName, md5sum);
+ if(fullPath.isEmpty()){
+ if(dvdNo != -1){
+ emit consistencyMsg(QString(tr("OK: %1")).arg(fileName));
+ }else{
+ emit consistencyMsg(QString(tr("NOT FOUND: %1")).arg(fileName));
+ }
+ }else{
+ if(dvdNo == -1){
+ emit consistencyMsg(QString(tr("OK: %1")).arg(fileName));
+ }else{
+ QString mimeType = Helper::mimeType(fullPath);
+ if(mimeType.startsWith("image")){
+ emit consistencyMsg(QString(tr("OK: %1")).arg(fileName));
+ }else{
+ emit consistencyMsg(QString(tr("FOUND: %1")).arg(fileName));
+ }
+ }
+ }
+ }
+}
+
+QString ConsistencyChecker::archivePath(const QString &fileName, const QString &md5sum) const {
+ QString filePath = Helper::createArchivePath(fileName, md5sum);
+ QFileInfo fi(filePath);
+ if(!fi.exists()){
+ filePath = Helper::createArchivePath(fileName, md5sum, true);
+ fi = QFileInfo(filePath);
+ if(!fi.exists()){
+ filePath.clear();
+ }
+ }
+ return filePath;
+}