Added database backend for filesystemwatcher
diff --git a/filesystemwatcher/filesystemwatcher.cpp b/filesystemwatcher/filesystemwatcher.cpp
index c0fd350..98f3857 100644
--- a/filesystemwatcher/filesystemwatcher.cpp
+++ b/filesystemwatcher/filesystemwatcher.cpp
@@ -1,9 +1,9 @@
 #include "filesystemwatcher.h"
 #include "ui_filesystemwatcher.h"
 
-filesystemwatcher::filesystemwatcher(QString dirPath, QWidget *parent) :
+FileSystemWatcher::FileSystemWatcher(QString dirPath, QWidget *parent) :
     QMainWindow(parent),
-    m_ui(new Ui::filesystemwatcher),
+    m_ui(new Ui::FileSystemWatcher),
     m_watcher(new QFileSystemWatcher()),
     m_listViewModel(new QStringListModel()),
     m_listView(new QListView()),
@@ -22,36 +22,59 @@
     // set title
     setWindowTitle("ChronoShare");
 
+    // open database
+    m_db = QSqlDatabase::addDatabase("QSQLITE");
+    m_db.setDatabaseName("filesystem.db");
+
+    if(!m_db.open())
+    {
+        qDebug() << "Error: Could not open database.";
+        return;
+    }
+
+    if(!createFileTable())
+    {
+        qDebug() << "Error: Could not create table.";
+        return;
+    }
+
     // register signals (callback functions)
-    connect(m_watcher,SIGNAL(fileChanged(QString)),this,SLOT(fileChangedSlot(QString)));
-    connect(m_watcher,SIGNAL(directoryChanged(QString)),this,SLOT(dirChangedSlot(QString)));
+    connect(m_watcher, SIGNAL(directoryChanged(QString)),this,SLOT(dirChangedSlot(QString)));
 
     // bootstrap file list
     dirChangedSlot(m_dirPath);
 }
 
-filesystemwatcher::~filesystemwatcher()
+FileSystemWatcher::~FileSystemWatcher()
 {
     // clean up
     delete m_ui;
     delete m_watcher;
     delete m_listViewModel;
     delete m_listView;
+
+    // close database
+    m_db.close();
 }
 
-void filesystemwatcher::fileChangedSlot(QString filePath)
+void FileSystemWatcher::dirChangedSlot(QString dirPath)
 {
-    QStringList fileList;
-    fileList.append(filePath);
+    // scan directory and populate file list
+    QHash<QString, QFileInfo> fileList = scanDirectory(dirPath);
+
+    QStringList dirChanges = reconcileDirectory(fileList);
+
+    // update gui with list of changes in this directory
+    m_listViewModel->setStringList(dirChanges);
 }
 
-void filesystemwatcher::dirChangedSlot(QString dirPath)
+QHash<QString, QFileInfo> FileSystemWatcher::scanDirectory(QString dirPath)
 {
     // list of files in directory
-    QStringList fileList;
+    QHash<QString, QFileInfo> fileList;
 
     // directory iterator (recursive)
-    QDirIterator dirIterator(m_dirPath, QDirIterator::Subdirectories |
+    QDirIterator dirIterator(dirPath, QDirIterator::Subdirectories |
                                         QDirIterator::FollowSymlinks);
 
     // iterate through directory recursively
@@ -81,13 +104,127 @@
             else
             {
                 // add this file to the file list
-                fileList.append(fileInfo.absoluteFilePath());
+                fileList.insert(fileInfo.absoluteFilePath(), fileInfo);
             }
         }
     }
 
-    // update gui with list of files in this directory
-    m_listViewModel->setStringList(fileList);
+    return fileList;
+}
+
+QStringList FileSystemWatcher::reconcileDirectory(QHash<QString, QFileInfo> fileList)
+{
+    QStringList dirChanges;
+
+    // setup database query
+    QSqlQuery storedRecord(m_db);
+
+    // query database for list of files
+    storedRecord.exec("SELECT absFilePath, lastModified FROM files");
+
+    // Debug
+    qDebug() << storedRecord.lastQuery();
+
+    // compare result (database/stored snapshot) to fileList (current snapshot)
+    while(storedRecord.next())
+    {
+        QString absFilePath = storedRecord.value(0).toString();
+        qint64 lMStored = storedRecord.value(1).toLongLong();
+
+        // debug
+        qDebug() << absFilePath << ", " << lMStored;
+
+        // check file existence
+        /*if(fileList.contains(absFilePath))
+        {
+            QFileInfo fileInfo = fileList.value(absFilePath);
+
+            // last Modified
+            qint64 lMCurrent = fileInfo.lastModified().currentMSecsSinceEpoch();
+
+            if(lMStored != lMCurrent)
+            {
+                storedRecord.prepare("UPDATE files SET lastModified = :lastModified "
+                              "WHERE absFilePath= :absFilePath");
+                storedRecord.bindValue(":lastModified", lMCurrent);
+                storedRecord.bindValue(":absFilePath", absFilePath);
+                storedRecord.exec();
+
+                // Debug
+                qDebug() << storedRecord.lastQuery();
+
+                // this file has been modified
+                dirChanges.append(absFilePath);
+            }
+
+            // delete this file from fileList, we have processed it
+            fileList.remove(absFilePath);
+        }
+        else
+        {
+            storedRecord.prepare("DELETE FROM files WHERE absFilePath= :absFilePath");
+            storedRecord.bindValue(":absFilePath", absFilePath);
+            storedRecord.exec();
+
+            // Debug
+            qDebug() << storedRecord.lastQuery();
+
+            // this file has been deleted
+            dirChanges.append(absFilePath);
+        }*/
+    }
+
+    /*storedRecord.prepare("INSERT INTO files (absFilePath, lastModified) "
+                  "VALUES (:absFilePath, :lastModified)");
+
+    // any files left in fileList have been added
+    for(QHash<QString, QFileInfo>::iterator i = fileList.begin(); i != fileList.end(); ++i)
+    {
+        QString absFilePath = i.key();
+        qint64 lastModified = i.value().lastModified().currentMSecsSinceEpoch();
+
+        storedRecord.bindValue(":absFilePath", absFilePath);
+        storedRecord.bindValue(":lastModified", lastModified);
+        storedRecord.exec();
+
+        // this file has been added
+        dirChanges.append(absFilePath);
+    }*/
+
+    // close query
+    storedRecord.finish();
+
+    return dirChanges;
+}
+
+bool FileSystemWatcher::createFileTable()
+{
+    bool success = false;
+
+    if(m_db.isOpen())
+    {
+        if(m_db.tables().contains("files"))
+        {
+            success = true;
+        }
+        else
+        {
+            QSqlQuery query(m_db);
+
+            // create file table
+            success = query.exec("CREATE TABLE files "
+                                 "(absFilePath TEXT primary key, "
+                                 "lastModified UNSIGNED BIG INT, "
+                                 "fileSize UNSIGNED BIG INT)");
+
+            // Debug
+            qDebug() << query.lastQuery();
+
+            query.finish();
+        }
+    }
+
+    return success;
 }
 
 #if WAF