summaryrefslogtreecommitdiffstats
path: root/consistencycheck.cpp
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2010-10-31 13:41:52 +0100
committerArno <am@disconnect.de>2010-10-31 13:41:52 +0100
commit78d26758184cd23b0ea27ab714a9e1d1c3aeba9b (patch)
tree0dd48b7e5038ca8ede582dab2a2e2dd131127d78 /consistencycheck.cpp
parent31bc791cb48e110db8f7b994931c1879974168a1 (diff)
downloadSheMov-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.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;
+}