QT Sqlite Problem

Alles rund um die Programmierung mit Qt
Antworten
loewe.xy
Beiträge: 2
Registriert: 26. April 2013 21:53

QT Sqlite Problem

Beitrag von loewe.xy »

Hallo Zusammen,

ich habe gerade ein Problem mit meiner QT Anwendung. Ich versuche Dateisystemveränderungen mithilfe einer Datenbank zu erkennen. Leider habe ich das Problem das der Eintrag für die Spalte foundflag fast immer auf 0 bleibt, und nicht auf 1 gesetzt wird wie es der code vorgibt.

Der Betreffende code ist der hier.

Code: Alles auswählen

#include "sfilesystemcompare.h"

SFileSystemCompare::SFileSystemCompare(QString path, QObject *parent) : QThread(parent)
{
    sqlmanager = new SSqlManager(this);

    rootpath = path;
}

SFileSystemCompare::~SFileSystemCompare()
{
    delete sqlmanager;
}

void SFileSystemCompare::run()
{
    QDirIterator iterator(rootpath, FS_FILTER_FLAGS, QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);

    qDebug() << "Starting comparison!";

    while(iterator.hasNext())
    {
        iterator.next();

        QString path = iterator.filePath();

        QString permissions;
        if(iterator.fileInfo().permission(QFile::ReadOwner)) permissions.append("r");
        else permissions.append("-");
        if(iterator.fileInfo().permission(QFile::WriteOwner)) permissions.append("w");
        else permissions.append("-");
        if(iterator.fileInfo().permission(QFile::ExeOwner)) permissions.append("x");
        else permissions.append("-");
        if(iterator.fileInfo().permission(QFile::ReadGroup)) permissions.append("r");
        else permissions.append("-");
        if(iterator.fileInfo().permission(QFile::WriteGroup)) permissions.append("w");
        else permissions.append("-");
        if(iterator.fileInfo().permission(QFile::ExeGroup)) permissions.append("x");
        else permissions.append("-");
        if(iterator.fileInfo().permission(QFile::ReadOther)) permissions.append("r");
        else permissions.append("-");
        if(iterator.fileInfo().permission(QFile::WriteOther)) permissions.append("w");
        else permissions.append("-");
        if(iterator.fileInfo().permission(QFile::ExeOther)) permissions.append("x");
        else permissions.append("-");

        QString lastChange = iterator.fileInfo().lastModified().toString("yyyyMMdd-hhmmsszzz");

        QString size = QString::number(iterator.fileInfo().size());

        QString isDir;
        if(iterator.fileInfo().isDir()) isDir = "1";
        else isDir = "0";

        QSqlQuery query(sqlmanager->getDB());
        QSqlQuery update(sqlmanager->getDB());
        query.exec("SELECT id, permissions, lastChange, size, isDir FROM filesystem WHERE path='" + path + "'");
        update.exec("UPDATE filesystem SET foundflag=0");

        if(query.next())
        {
            //File existed before
            if(query.value(1).toString() != permissions)
            {
                //Permissions changed
                qDebug() << "Permissions changed" << path;
                update.exec("UPDATE filesystem SET permissions='" + permissions + "' WHERE id=" + query.value(0).toString());
                emit fsChanged(SFileSystemWatcherEvent(SFileSystemWatcherEvent::attrib, path));
            }
            if((query.value(2).toString() != lastChange || query.value(3).toString() != size) && isDir=="0")
            {
                qDebug() << "File changed" << path;
                update.exec("UPDATE filesystem SET lastChange='" + lastChange + "' WHERE id=" + query.value(0).toString());
                update.exec("UPDATE filesystem SET size=" + size + " WHERE id=" + query.value(0).toString());
                emit fsChanged(SFileSystemWatcherEvent(SFileSystemWatcherEvent::modify, path));
            }

            qDebug() << "File found!" << path;

            update.exec("UPDATE filesystem SET foundflag=1 WHERE id=" + query.value(0).toString());
            qDebug() << update.lastQuery();
        }
        else
        {
            //File is new
            qDebug() << "New file" << path;
            query.exec("INSERT INTO filesystem (path, permissions, lastChange, size, isDir, foundflag) VALUES ('" + path + "', '" + permissions + "', '" + lastChange + "', " + size + ", " + isDir + ", 1)");
            qDebug() << query.lastQuery();
            emit fsChanged(SFileSystemWatcherEvent(SFileSystemWatcherEvent::created, path));
        }

    }

}

void SFileSystemCompare::doComparison()
{
    this->start();
}

Die Debug Ausgabe die erzeugt wird ist

Code: Alles auswählen

Database already exists! 
Database opened successfully 
Starting comparison! 
File found! "test/folder" 
"UPDATE filesystem SET foundflag=1 WHERE id=2" 
File found! "test/folder/testsubfile" 
"UPDATE filesystem SET foundflag=1 WHERE id=3" 
File found! "test/folder/testsubfile2" 
"UPDATE filesystem SET foundflag=1 WHERE id=8" 
File found! "test/folder/testsubfile3" 
"UPDATE filesystem SET foundflag=1 WHERE id=6" 
File found! "test/folder/testsubfile4" 
"UPDATE filesystem SET foundflag=1 WHERE id=7" 
File found! "test/test" 
"UPDATE filesystem SET foundflag=1 WHERE id=1" 
File found! "test/test2" 
"UPDATE filesystem SET foundflag=1 WHERE id=4" 
Im Ergebniss ist nur bei dem Eintrag mit der ID 4 das foundflag auf 1 beim Rest auf 0. Woran kann das liegen? So langsam verstehe ich es nichtmehr.

Gruß Lukas
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: QT Sqlite Problem

Beitrag von Christian81 »

Was denkst Du dass 'update.exec("UPDATE filesystem SET foundflag=0");' wohl macht?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
loewe.xy
Beiträge: 2
Registriert: 26. April 2013 21:53

Re: QT Sqlite Problem

Beitrag von loewe.xy »

Danke für den Hinweis, habe den Bug gestern abend noch gefunden gehabt, das update gehört vor die While schleife um alle zurückzusetzen ...

Manchmal sieht man die einfachsten Sachen nicht, und sucht dan Ewig danach.

Gruß Lukas
Antworten