342d26a69f04b58020033b6af8a660cf2f8ebc6a
[qtrapids] / src / server / ServerDb.hpp
1 #ifndef _SERVERDB_HPP_
2 #define _SERVERDB_HPP_
3
4 #include <QSettings>
5 #include <QtSql>
6 #include <QDir>
7
8 namespace qtrapids
9 {
10
11 class ServerSettings
12 {
13
14 public:
15         ServerSettings(QSettings *settings)
16                         : settings_(settings) { }
17
18         ~ServerSettings() {
19
20         }
21
22         QString getDbEngine() const {
23                 return getParamAndStore("db_engine", getDefaultDbEngine()).toString();
24         }
25
26         QString getDbName() const {
27                 QString default_db_path(QDir::home().filePath(appName() + ".sqlite"));
28                 return getParamAndStore("db", default_db_path).toString();
29         }
30
31         QString getTorrentsDir() const {
32                 QString default_dir(QDir::home().filePath(QString(".") + appName()));
33                 return getParamAndStore("db", default_dir).toString();
34
35         }
36
37 private:
38
39         ServerSettings(ServerSettings const&);
40         ServerSettings& operator= (ServerSettings const&);
41
42         static inline QString appName() {
43                 return QCoreApplication::applicationName();
44         }
45
46         static QString getDefaultDbEngine() {
47                 // for (QStringListIterator p = QSqlDatabase::drivers(); p.hasNext();) {
48                 //     return p.next();
49                 // }
50                 return "QSQLITE";
51         }
52
53         QVariant getParamAndStore(QString const& name, QVariant default_value) const {
54                 QVariant v(settings_->value(name));
55                 if (!v.isNull()) {
56                         return v;
57                 }
58
59                 settings_->setValue(name, default_value);
60                 return default_value;
61         }
62
63         mutable QSettings *settings_;
64 };
65
66 class ServerDb
67 {
68
69 public:
70         ServerDb(ServerSettings *settings)
71                         : db_(QSqlDatabase::addDatabase(settings->getDbEngine())) {
72                 QString db_name(settings->getDbName());
73                 db_.setDatabaseName(db_name);
74
75                 if (!db_.open()) {
76                         qDebug() << "cant open db";
77                         return;
78                 }
79                 qDebug() << "opened " << db_name;
80
81                 QSqlQuery q;
82                 if (!q.exec("create table torrents (hash varchar primary key, path varchar, savepath varchar);\n")) {
83                         qDebug() << "cant create table: " << q.lastError().text();
84                 }
85         }
86
87         ~ServerDb() {
88                 db_.close();
89         }
90
91         void addTorrent(const QString &hash, const QString &path, const QString &save_path) {
92                 if (!db_.open()) {
93                         qDebug() << "cant open db";
94                 }
95                 QSqlQuery query_add_;
96                 query_add_.prepare("INSERT INTO torrents (hash, path, savepath) VALUES (?, ?, ?)");
97                 query_add_.bindValue(0, hash);
98                 query_add_.bindValue(1, path);
99                 query_add_.bindValue(2, save_path);
100                 if (!query_add_.exec()) {
101                         qDebug() << "cant add torrent info into db: "
102                         << query_add_.lastError().text();
103                 }
104                 db_.close();
105         }
106
107 private:
108
109         ServerDb(ServerDb const&);
110         ServerDb& operator= (ServerDb const&);
111
112         QSqlDatabase db_;
113 };
114
115 } // namespace qtrapids
116
117 #endif // _SERVERDB_HPP_