Fixed bookmarks db issues
[mdictionary] / src / mdictionary / backbone / Bookmarks.cpp
1 #include "Bookmarks.h"
2 #include "BookmarkTranslations.h"
3 #include <QThread>
4
5 Bookmarks::Bookmarks() {
6     this->dbName = QDir::homePath() + "/.mdictionary/"
7                  + "bookmarks.db";
8     mdb = QSqlDatabase::addDatabase("QSQLITE");
9     mdb.setDatabaseName(dbName);
10     checkAndCreateDb(dbName);
11     initAccents();
12
13 }
14
15
16 Bookmarks::~Bookmarks() {
17     mdb.close();
18 }
19
20
21 QSqlDatabase Bookmarks::getDbCnx(){
22     return mdb;
23 }
24
25
26
27 bool Bookmarks::checkAndCreateDb(QString dbName) {
28     QSqlDatabase db = QSqlDatabase::database();
29     if(dbName.size())
30         db.setDatabaseName(dbName);
31     else
32         db.setDatabaseName(this->dbName);
33     db.open();
34     QSqlQuery cur(db);
35     cur.exec("create table bookmarks(key text, normalized text, translation text)");
36     return true;
37 }
38
39
40
41 void Bookmarks::clear() {
42     checkAndCreateDb();
43     QSqlDatabase db = getDbCnx();
44     if(!db.isOpen() && !db.open()) {
45         qDebug() << "Database error: " << db.lastError().text() << endl;
46         return ;
47     }
48     QSqlQuery cur(db);
49     cur.exec("drop table bookmarks");
50     cur.exec("create table bookmarks(key text, normalized text,translation text)");
51 }
52
53
54
55 void Bookmarks::add(Translation* translation) {
56     if (!translation)
57         return ;
58     checkAndCreateDb();
59     QSqlDatabase db = getDbCnx();
60     if(!db.isOpen() && !db.open()) {
61         qDebug() << "Database error: " << db.lastError().text() << endl;
62         return ;
63     }
64     translation->setBookmark(true);
65     QSqlQuery cur(db);
66     cur.prepare("insert into bookmarks values (?,?,?)");
67     cur.addBindValue(translation->key());
68     cur.addBindValue(removeAccents(translation->key()));
69     cur.addBindValue(translation->toHtml());
70     cur.exec();
71 }
72
73
74 void Bookmarks::remove(Translation* translation) {
75     if (!translation)
76         return ;
77     checkAndCreateDb();
78     QSqlDatabase db = getDbCnx();
79     if(!db.isOpen() && !db.open()) {
80         qDebug() << "Database error: " << db.lastError().text() << endl;
81         return ;
82     }
83     QSqlQuery cur(db);
84     cur.prepare("delete from bookmarks where key=?");
85     cur.addBindValue(translation->key());
86     cur.exec();
87 }
88
89
90
91 QList<Translation*> Bookmarks::list() {
92     checkAndCreateDb();
93     QList<Translation*> res;
94     QSqlDatabase db = getDbCnx();
95     if(!db.isOpen() && !db.open()) {
96         qDebug() << "Database error: " << db.lastError().text() << endl;
97         return res;
98     }
99     QSqlQuery cur(db);
100     cur.exec("select distinct key from bookmarks");
101     while(cur.next())
102         res.append(new BookmarkTranslation(cur.value(0).toString(),
103                 this, dbName));
104     return res;
105 }
106
107
108
109 QList<Translation*> Bookmarks::searchWordList(QString word) {
110     checkAndCreateDb();
111     if(word.indexOf("*")==-1 && word.indexOf("?")== -1)
112         word+="%";
113     word = word.replace("*", "%");
114     word = word.replace("?", "_");
115
116     QList<Translation*> tr;
117     QSqlDatabase db = getDbCnx();
118     if(!db.isOpen() && !db.open()) {
119         qDebug() << "Database error: " << db.lastError().text() << endl;
120         return tr;
121     }
122     QSqlQuery cur(db);
123     cur.prepare("select key from bookmarks where key like ? or normalized like ?");
124     cur.addBindValue(word);
125     cur.addBindValue(word);
126     cur.exec();
127     QSet<QString> res;
128     while(cur.next())
129         res.insert(cur.value(0).toString());
130     foreach(QString str, res.toList())
131         tr.append(new BookmarkTranslation(str, this, dbName));
132     return tr;
133 }
134
135
136
137 QStringList Bookmarks::search(QString word, QString dbName) {
138     QStringList result;
139     QSqlDatabase db = QSqlDatabase::database();
140     db.setDatabaseName(dbName);
141     if(!db.isOpen() && !db.open()) {
142         qDebug() << "Database error: " << db.lastError().text() << endl;
143         return result;
144     }
145     QSqlQuery cur(db);
146     cur.prepare("select translation from bookmarks where key=?");
147     cur.addBindValue(word);
148     cur.exec();
149     while(cur.next())
150         result << cur.value(0).toString();
151
152     return result;
153 }
154
155
156
157
158 bool Bookmarks::inBookmarks(QString word) {
159     if(!mdb.isOpen() && !mdb.open()) {
160         qDebug() << "Database error: " << mdb.lastError().text() << endl;
161         return false;
162     }
163     QSqlQuery cur(mdb);
164     cur.prepare("select translation from bookmarks where key like ? limit 1");
165     cur.addBindValue(word);
166     cur.exec();
167     if(cur.next())
168         return true;
169     return false;
170 }