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