Client-server through DBus, cmake support
[qtrapids] / src / server / ServerDb.hpp
diff --git a/src/server/ServerDb.hpp b/src/server/ServerDb.hpp
new file mode 100644 (file)
index 0000000..060bb96
--- /dev/null
@@ -0,0 +1,128 @@
+#ifndef _SERVERDB_HPP_
+#define _SERVERDB_HPP_
+
+#include <QSettings>
+#include <QtSql>
+#include <QDir>
+
+namespace qtrapids
+{
+
+    class ServerSettings
+    {
+
+    public:
+        ServerSettings(QSettings *settings)
+            : settings_(settings)
+        { }
+
+        ~ServerSettings()
+        {
+            
+        }
+
+        QString getDbEngine() const
+        {
+            return getParamAndStore("db_engine", getDefaultDbEngine()).toString();
+        }
+
+        QString getDbName() const
+        {
+            QString default_db_path(QDir::home().filePath(appName() + ".sqlite"));
+            return getParamAndStore("db", default_db_path).toString();
+        }
+
+        QString getTorrentsDir() const
+        {
+            QString default_dir(QDir::home().filePath(QString(".") + appName()));
+            return getParamAndStore("db", default_dir).toString();
+          
+        }
+
+    private:
+
+        ServerSettings(ServerSettings const&);
+        ServerSettings& operator= (ServerSettings const&);
+
+        static inline QString appName()
+        {
+            return QCoreApplication::applicationName();
+        }
+
+        static QString getDefaultDbEngine()
+        {
+            // for (QStringListIterator p = QSqlDatabase::drivers(); p.hasNext();) {
+            //     return p.next();
+            // }
+            return "QSQLITE";
+        }
+
+        QVariant getParamAndStore(QString const& name, QVariant default_value) const
+        {
+            QVariant v(settings_->value(name));
+            if (!v.isNull()) {
+                return v;
+            }
+
+            settings_->setValue(name, default_value);
+            return default_value;
+        }
+
+        mutable QSettings *settings_;
+    };
+
+    class ServerDb
+    {
+
+    public:
+        ServerDb(ServerSettings *settings)
+        : db_(QSqlDatabase::addDatabase(settings->getDbEngine()))
+        {
+            QString db_name(settings->getDbName());
+            db_.setDatabaseName(db_name);
+
+            if (!db_.open()) {
+                qDebug() << "cant open db";
+                return;
+            }
+            qDebug() << "opened " << db_name;
+
+            QSqlQuery q;
+            if (!q.exec("create table torrents (hash varchar primary key, path varchar, savepath varchar);\n")) {
+                qDebug() << "cant create table: " << q.lastError().text();
+            }
+        }
+
+        ~ServerDb()
+        {
+            db_.close();
+        }
+
+        void addTorrent(const QString &hash, const QString &path, const QString &save_path)
+        {
+            if (!db_.open()) {
+                qDebug() << "cant open db";
+            }
+            QSqlQuery query_add_;
+            query_add_.prepare("INSERT INTO torrents (hash, path, savepath) VALUES (?, ?, ?)");
+            query_add_.bindValue(0, hash);
+            query_add_.bindValue(1, path);
+            query_add_.bindValue(2, save_path);
+            if (!query_add_.exec()) {
+                qDebug() << "cant add torrent info into db: " 
+                         << query_add_.lastError().text();
+            }
+            db_.close();
+        }
+
+    private:
+
+        ServerDb(ServerDb const&);
+        ServerDb& operator= (ServerDb const&);
+
+        QSqlDatabase db_;
+    };
+
+} // namespace qtrapids
+
+#endif // _SERVERDB_HPP_