Seite 1 von 1

QT Sqlite Problem

Verfasst: 19. April 2014 17:41
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

Re: QT Sqlite Problem

Verfasst: 26. April 2014 08:51
von Christian81
Was denkst Du dass 'update.exec("UPDATE filesystem SET foundflag=0");' wohl macht?

Re: QT Sqlite Problem

Verfasst: 26. April 2014 12:20
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