Fixed some leaks and minor bookmark bug
[mdictionary] / trunk / src / base / backbone / Bookmarks.cpp
index 09516b7..c39f868 100644 (file)
@@ -1,4 +1,175 @@
 #include "Bookmarks.h"
-Bookmarks::Bookmarks()
-{
+#include "BookmarkTranslations.h"
+#include <QThread>
+
+Bookmarks::Bookmarks() {
+    this->dbName = QDir::homePath() + "/.mdictionary/"
+                 + "bookmarks.db";
+    checkAndCreateDb();
+    initAccents();
+
+    mdb = QSqlDatabase::addDatabase("QSQLITE",
+            QString("%2").arg((int)QThread::currentThreadId()));
+    mdb.setDatabaseName(dbName);
+}
+
+
+Bookmarks::~Bookmarks() {
+    mdb.close();
+}
+
+
+QSqlDatabase Bookmarks::getDbCnx(QString dbName) {
+    QSqlDatabase::removeDatabase(
+            QString("%2").arg((int)QThread::currentThreadId()));
+    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE",
+            QString("%2").arg((int)QThread::currentThreadId()));
+    db.setDatabaseName(dbName);
+    return db;
+}
+
+
+
+bool Bookmarks::checkAndCreateDb() {
+    QSqlDatabase db = getDbCnx(dbName);
+    db.open();
+    QSqlQuery cur(db);
+    cur.exec("create table bookmarks(key text, normalized text, translation text)");
+    db.close();
+    return true;
+}
+
+
+
+void Bookmarks::clear() {
+    checkAndCreateDb();
+    QSqlDatabase db = getDbCnx(dbName);
+    if(!db.isOpen() && !db.open()) {
+        qDebug() << "Database error: " << db.lastError().text() << endl;
+        return ;
+    }
+    QSqlQuery cur(db);
+    cur.exec("drop table bookmarks");
+    cur.exec("create table bookmarks(key text, normalized text,translation text)");
+    db.close();
+}
+
+
+
+void Bookmarks::add(Translation* translation) {
+    checkAndCreateDb();
+    QSqlDatabase db = getDbCnx(dbName);
+    if(!db.isOpen() && !db.open()) {
+        qDebug() << "Database error: " << db.lastError().text() << endl;
+        return ;
+    }
+    translation->setBookmark(true);
+    QSqlQuery cur(db);
+    cur.prepare("insert into bookmarks values (?,?,?)");
+    cur.addBindValue(translation->key());
+    cur.addBindValue(removeAccents(translation->key()));
+    cur.addBindValue(translation->toHtml());
+    cur.exec();
+    db.close();
+}
+
+
+void Bookmarks::remove(Translation* translation) {
+    checkAndCreateDb();
+    QSqlDatabase db = getDbCnx(dbName);
+    if(!db.isOpen() && !db.open()) {
+        qDebug() << "Database error: " << db.lastError().text() << endl;
+        return ;
+    }
+    QSqlQuery cur(db);
+    cur.prepare("delete from bookmarks where key=?");
+    cur.addBindValue(translation->key());
+    cur.exec();
+    db.close();
+}
+
+
+
+QList<Translation*> Bookmarks::list() {
+    checkAndCreateDb();
+    QList<Translation*> res;
+    QSqlDatabase db = getDbCnx(dbName);
+    if(!db.isOpen() && !db.open()) {
+        qDebug() << "Database error: " << db.lastError().text() << endl;
+        return res;
+    }
+    QSqlQuery cur(db);
+    cur.exec("select distinct key from bookmarks");
+    while(cur.next())
+        res.append(new BookmarkTranslation(cur.value(0).toString(),
+                this, dbName));
+    db.close();
+    return res;
+}
+
+
+
+QList<Translation*> Bookmarks::searchWordList(QString word) {
+    checkAndCreateDb();
+    if(word.indexOf("*")==-1 && word.indexOf("?")== -1)
+        word+="%";
+    word = word.replace("*", "%");
+    word = word.replace("?", "_");
+
+    QList<Translation*> tr;
+    QSqlDatabase db = getDbCnx(dbName);
+    if(!db.isOpen() && !db.open()) {
+        qDebug() << "Database error: " << db.lastError().text() << endl;
+        return tr;
+    }
+    QSqlQuery cur(db);
+    cur.prepare("select key from bookmarks where key like ? or normalized like ?");
+    cur.addBindValue(word);
+    cur.addBindValue(word);
+    cur.exec();
+    QSet<QString> res;
+    while(cur.next())
+        res.insert(cur.value(0).toString());
+    foreach(QString str, res.toList())
+        tr.append(new BookmarkTranslation(str, this, dbName));
+    db.close();
+    return tr;
+}
+
+
+
+QStringList Bookmarks::search(QString word, QString dbName) {
+    //checkAndCreateDb();
+    QStringList result;
+    QSqlDatabase db = getDbCnx(dbName);
+    if(!db.isOpen() && !db.open()) {
+        qDebug() << "Database error: " << db.lastError().text() << endl;
+        return result;
+    }
+    QSqlQuery cur(db);
+    cur.prepare("select translation from bookmarks where key=?");
+    cur.addBindValue(word);
+    cur.exec();
+    while(cur.next())
+        result << cur.value(0).toString();
+
+    db.close();
+    return result;
+}
+
+
+
+
+bool Bookmarks::inBookmarks(QString word) {
+    if(!mdb.isOpen() && !mdb.open()) {
+        qDebug() << "Database error: " << mdb.lastError().text() << endl;
+        return false;
+    }
+    QSqlQuery cur(mdb);
+    cur.prepare("select translation from bookmarks where key like ? limit 1");
+    cur.addBindValue(word);
+    cur.exec();
+    if(cur.next())
+        return true;
+    return false;
 }