Server session persistence is implemented
[qtrapids] / src / server / ServerDb.hpp
index 342d26a..9bda677 100644 (file)
@@ -5,6 +5,8 @@
 #include <QtSql>
 #include <QDir>
 
 #include <QtSql>
 #include <QDir>
 
+#include <qtrapids/settings.hpp>
+
 namespace qtrapids
 {
 
 namespace qtrapids
 {
 
@@ -12,12 +14,10 @@ class ServerSettings
 {
 
 public:
 {
 
 public:
-       ServerSettings(QSettings *settings)
+       ServerSettings(QSettings &settings)
                        : settings_(settings) { }
 
                        : settings_(settings) { }
 
-       ~ServerSettings() {
-
-       }
+       ~ServerSettings() { }
 
        QString getDbEngine() const {
                return getParamAndStore("db_engine", getDefaultDbEngine()).toString();
 
        QString getDbEngine() const {
                return getParamAndStore("db_engine", getDefaultDbEngine()).toString();
@@ -29,11 +29,26 @@ public:
        }
 
        QString getTorrentsDir() const {
        }
 
        QString getTorrentsDir() const {
-               QString default_dir(QDir::home().filePath(QString(".") + appName()));
-               return getParamAndStore("db", default_dir).toString();
+               QString default_dir(QDir::home().filePath(getTorrentsSubDir()));
+               return getParamAndStore("torrents_dir", default_dir).toString();
 
        }
 
 
        }
 
+       QString getDownloadDir() const {
+               QString default_dir(QDir::home().absolutePath());
+               QString v = getParamAndStore("download/directory", default_dir).toString();
+               if (!v.isEmpty()) {
+                       return v;
+               } else {
+                       settings_.setValue("download/directory", default_dir);
+                       return default_dir;
+               }
+       }
+
+       static QString getTorrentsSubDir() {
+               return QString(".") + appName();
+       }
+
 private:
 
        ServerSettings(ServerSettings const&);
 private:
 
        ServerSettings(ServerSettings const&);
@@ -51,18 +66,34 @@ private:
        }
 
        QVariant getParamAndStore(QString const& name, QVariant default_value) const {
        }
 
        QVariant getParamAndStore(QString const& name, QVariant default_value) const {
-               QVariant v(settings_->value(name));
-               if (!v.isNull()) {
-                       return v;
+               return GetSettingsStoreDefault(settings_, name, default_value);
+       }
+
+       mutable QSettings &settings_;
+};
+
+namespace {
+
+class DbAccessor
+{
+public:
+       DbAccessor(QSqlDatabase &db)
+                       : db_(db) {
+               if (!db_.open()) {
+                       qDebug() << "cant open db";
                }
                }
+       }
 
 
-               settings_->setValue(name, default_value);
-               return default_value;
+       ~DbAccessor() {
+               db_.close();
        }
 
        }
 
-       mutable QSettings *settings_;
+private:
+       QSqlDatabase &db_;
 };
 
 };
 
+}
+
 class ServerDb
 {
 
 class ServerDb
 {
 
@@ -72,6 +103,7 @@ public:
                QString db_name(settings->getDbName());
                db_.setDatabaseName(db_name);
 
                QString db_name(settings->getDbName());
                db_.setDatabaseName(db_name);
 
+               qDebug() << "opening db " << db_name;
                if (!db_.open()) {
                        qDebug() << "cant open db";
                        return;
                if (!db_.open()) {
                        qDebug() << "cant open db";
                        return;
@@ -89,9 +121,7 @@ public:
        }
 
        void addTorrent(const QString &hash, const QString &path, const QString &save_path) {
        }
 
        void addTorrent(const QString &hash, const QString &path, const QString &save_path) {
-               if (!db_.open()) {
-                       qDebug() << "cant open db";
-               }
+               DbAccessor dba(db_);
                QSqlQuery query_add_;
                query_add_.prepare("INSERT INTO torrents (hash, path, savepath) VALUES (?, ?, ?)");
                query_add_.bindValue(0, hash);
                QSqlQuery query_add_;
                query_add_.prepare("INSERT INTO torrents (hash, path, savepath) VALUES (?, ?, ?)");
                query_add_.bindValue(0, hash);
@@ -101,7 +131,15 @@ public:
                        qDebug() << "cant add torrent info into db: "
                        << query_add_.lastError().text();
                }
                        qDebug() << "cant add torrent info into db: "
                        << query_add_.lastError().text();
                }
-               db_.close();
+       }
+
+       void removeTorrent(const QString &hash) {
+               DbAccessor dba(db_);
+               QSqlQuery query(QString("DELETE FROM torrents WHERE hash='") + hash + "'");
+               if (!query.exec()) {
+                       qDebug() << "cant delete torrent info from db"
+                       << query.lastError().text();
+               }
        }
 
 private:
        }
 
 private:
@@ -112,6 +150,29 @@ private:
        QSqlDatabase db_;
 };
 
        QSqlDatabase db_;
 };
 
+class TorrentsStorage
+{
+public:
+
+       TorrentsStorage(ServerDb &db)
+                       : torrents_("SELECT hash, path, savepath from torrents") { }
+
+
+       bool nextTorrent(TorrentDownloadInfo &info) {
+               if (!torrents_.next()) {
+                       return false;
+               }
+               info.hash = torrents_.value(0).toString();
+               info.path = torrents_.value(1).toString();
+               info.download_path = torrents_.value(2).toString();
+               return true;
+       }
+
+
+private:
+       QSqlQuery torrents_;
+};
+
 } // namespace qtrapids
 
 #endif // _SERVERDB_HPP_
 } // namespace qtrapids
 
 #endif // _SERVERDB_HPP_