Fixed sigsev after searching in bookmarks
[mdictionary] / trunk / src / base / 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     checkAndCreateDb();
9 }
10
11
12
13 bool Bookmarks::checkAndCreateDb() {
14     QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
15             QString((int)QThread::currentThreadId()));
16     db.setDatabaseName(dbName);
17     if(!db.isOpen() && !db.open()) {
18         qDebug() << "Database error: " << db.lastError().text() << endl;
19         return false;
20     }
21     QSqlQuery cur(db);
22     cur.exec("create table bookmarks(key text ,translation text)");
23     db.close();
24
25     return true;
26 }
27
28
29
30 void Bookmarks::clear() {
31     QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
32             QString((int)QThread::currentThreadId()));
33     db.setDatabaseName(dbName);
34     if(!db.isOpen() && !db.open()) {
35         qDebug() << "Database error: " << db.lastError().text() << endl;
36         return ;
37     }
38     QSqlQuery cur(db);
39     cur.exec("drop table bookmarks");
40     cur.exec("create table bookmarks(key text ,translation text)");
41     db.close();
42 }
43
44
45
46 void Bookmarks::add(Translation* translation) {
47     QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
48             QString((int)QThread::currentThreadId()));
49     db.setDatabaseName(dbName);
50     if(!db.isOpen() && !db.open()) {
51         qDebug() << "Database error: " << db.lastError().text() << endl;
52         return ;
53     }
54     QSqlQuery cur(db);
55     cur.prepare("insert into bookmarks values (?,?)");
56     cur.addBindValue(translation->key());
57     cur.addBindValue(translation->toHtml());
58     cur.exec();
59     db.close();
60 }
61
62
63
64 void Bookmarks::remove(Translation* translation) {
65     QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
66             QString((int)QThread::currentThreadId()));
67
68     db.setDatabaseName(dbName);
69     if(!db.isOpen() && !db.open()) {
70         qDebug() << "Database error: " << db.lastError().text() << endl;
71         return ;
72     }
73     QSqlQuery cur(db);
74     cur.prepare("delete from bookmarks where key=? and translation=?");
75     cur.addBindValue(translation->key());
76     cur.addBindValue(translation->key());
77     cur.exec();
78     db.close();
79 }
80
81
82
83 QList<Translation*> Bookmarks::list() {
84     QList<Translation*> res;
85     QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
86             QString((int)QThread::currentThreadId()));
87     db.setDatabaseName(dbName);
88     if(!db.isOpen() && !db.open()) {
89         qDebug() << "Database error: " << db.lastError().text() << endl;
90         return res;
91     }
92     QSqlQuery cur(db);
93     cur.exec("select distinct key from bookmarks");
94     while(cur.next())
95         res.append(new BookmarkTranslation(cur.value(0).toString(), this, dbName));
96     db.close();
97     return res;
98 }
99
100
101
102 QList<Translation*> Bookmarks::searchWordList(QString word) {
103
104     if(word.indexOf("*")==-1 && word.indexOf("?")== -1)
105         word+="%";
106     word = word.replace("*", "%");
107     word = word.replace("?", "_");
108     word = removeAccents(word);
109
110     QList<Translation*> tr;
111     QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
112             QString((int)QThread::currentThreadId()));
113     db.setDatabaseName(dbName);
114     if(!db.isOpen() && !db.open()) {
115         qDebug() << "Database error: " << db.lastError().text() << endl;
116         return tr;
117     }
118     QSqlQuery cur(db);
119     cur.prepare("select key from bookmarks where key like ?");
120     cur.addBindValue(word);
121     cur.exec();
122     QSet<QString> res;
123     while(cur.next())
124         res.insert(cur.value(0).toString());
125     qDebug() << "searchWordList " << res.size();
126     foreach(QString str, res.toList())
127         tr.append(new BookmarkTranslation(str, this, dbName));
128     db.close();
129     return tr;
130 }
131
132
133
134 QStringList Bookmarks::search(QString word, QString dbName) {
135     qDebug() << "bookmarks::search  " << word << " |" << dbName;
136     QStringList result;
137     QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
138             QString((int)QThread::currentThreadId()));
139     db.setDatabaseName(dbName);
140     if(!db.isOpen() && !db.open()) {
141         qDebug() << "Database error: " << db.lastError().text() << endl;
142         return result;
143     }
144     qDebug() << "bookmarks::search " << word;
145     QSqlQuery cur(db);
146     qDebug() << "bookmarks::search " << word;
147     cur.prepare("select translation from bookmarks where key=?");
148     cur.addBindValue(word);
149     cur.exec();
150     while(cur.next())
151         result << cur.value(0).toString();
152
153     qDebug() << result.size() << " " << result;
154     db.close();
155     return result;
156 }
157
158
159
160 QString Bookmarks::removeAccents(QString string) {
161     string = string.replace(QString::fromUtf8("ł"), "l", Qt::CaseInsensitive);
162     QString normalized = string.normalized(QString::NormalizationForm_D);
163     normalized = normalized;
164     for(int i=0; i<normalized.size(); i++) {
165         if( !normalized[i].isLetterOrNumber() &&
166             !normalized[i].isSpace() &&
167             !normalized[i].isDigit() &&
168             normalized[i] != '*' &&
169             normalized[i] != '%') {
170             normalized.remove(i,1);
171         }
172     }
173     return normalized;
174 }
175
176
177
178 bool Bookmarks::inBookmarks(QString word) {
179     QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
180             QString((int)QThread::currentThreadId()));
181     db.setDatabaseName(dbName);
182     if(!db.isOpen() && !db.open()) {
183         qDebug() << "Database error: " << db.lastError().text() << endl;
184         return false;
185     }
186     QSqlQuery cur(db);
187     cur.prepare("select translation from bookmarks where key like ? limit 1");
188     cur.addBindValue(word);
189     cur.exec();
190     if(cur.next())
191         return true;
192     db.close();
193     return false;
194 }