diff options
author | Arno <am@disconnect.de> | 2010-10-31 13:41:52 +0100 |
---|---|---|
committer | Arno <am@disconnect.de> | 2010-10-31 13:41:52 +0100 |
commit | 78d26758184cd23b0ea27ab714a9e1d1c3aeba9b (patch) | |
tree | 0dd48b7e5038ca8ede582dab2a2e2dd131127d78 /consistencycheck.cpp | |
parent | 31bc791cb48e110db8f7b994931c1879974168a1 (diff) | |
download | SheMov-78d26758184cd23b0ea27ab714a9e1d1c3aeba9b.tar.gz SheMov-78d26758184cd23b0ea27ab714a9e1d1c3aeba9b.tar.bz2 SheMov-78d26758184cd23b0ea27ab714a9e1d1c3aeba9b.zip |
First try on ConsistencyChecker
Well, it works, so let's shit it :) Unfortunately the database is
inconsistent, so add a checker for that. Still needs some work, though.
Eg. display errors seperately and make it possible to delete stray
files. Also the Filesystem check must be implemented.
Diffstat (limited to 'consistencycheck.cpp')
-rw-r--r-- | consistencycheck.cpp | 176 |
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; +} |