Fixed sigsev after searching in bookmarks
authorBartosz Szatkowski <bulislaw@linux.com>
Tue, 17 Aug 2010 10:58:23 +0000 (12:58 +0200)
committerBartosz Szatkowski <bulislaw@linux.com>
Tue, 17 Aug 2010 10:58:23 +0000 (12:58 +0200)
trunk/src/base/backbone/BookmarkTranslations.h
trunk/src/base/backbone/Bookmarks.cpp
trunk/src/base/backbone/Bookmarks.h
trunk/src/base/backbone/backbone.cpp
trunk/src/base/backbone/backbone.h

index 73c200e..5a89ce4 100644 (file)
@@ -37,9 +37,9 @@
 class BookmarkTranslation : public Translation
 {
 public:
-    BookmarkTranslation(QString key, Bookmarks* bookmarks) {
+    BookmarkTranslation(QString key, Bookmarks* bookmarks, QString dbName) {
         _key = key;
-        _dictionaryInfo = "Bookmarks";
+        _dictionaryInfo = dbName;
         _bookmarks = bookmarks;
     }
 
@@ -60,7 +60,7 @@ public:
             return "";
         qDebug() << ">toHtml";
 
-        QStringList list = _bookmarks->search(_key);
+        QStringList list = _bookmarks->search(_key, _dictionaryInfo);
         qDebug() << "toHtml" << list.size();
         QString result;
         foreach(QString translation, list)
index 8d68911..ff44f84 100644 (file)
@@ -1,23 +1,26 @@
 #include "Bookmarks.h"
 #include "BookmarkTranslations.h"
+#include <QThread>
 
 Bookmarks::Bookmarks() {
-    dbName = QDir::homePath() + "/.mdictionary/"
+    this->dbName = QDir::homePath() + "/.mdictionary/"
                  + "bookmarks.db";
-    db = QSqlDatabase::addDatabase("QSQLITE", "bookmarks");
-    db.setDatabaseName(dbName);
     checkAndCreateDb();
 }
 
 
 
 bool Bookmarks::checkAndCreateDb() {
-    if(!db.open()) {
+    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
+            QString((int)QThread::currentThreadId()));
+    db.setDatabaseName(dbName);
+    if(!db.isOpen() && !db.open()) {
         qDebug() << "Database error: " << db.lastError().text() << endl;
         return false;
     }
     QSqlQuery cur(db);
     cur.exec("create table bookmarks(key text ,translation text)");
+    db.close();
 
     return true;
 }
@@ -25,40 +28,72 @@ bool Bookmarks::checkAndCreateDb() {
 
 
 void Bookmarks::clear() {
+    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
+            QString((int)QThread::currentThreadId()));
+    db.setDatabaseName(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 ,translation text)");
+    db.close();
 }
 
 
 
 void Bookmarks::add(Translation* translation) {
-    qDebug()<<"added";
+    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
+            QString((int)QThread::currentThreadId()));
+    db.setDatabaseName(dbName);
+    if(!db.isOpen() && !db.open()) {
+        qDebug() << "Database error: " << db.lastError().text() << endl;
+        return ;
+    }
     QSqlQuery cur(db);
     cur.prepare("insert into bookmarks values (?,?)");
     cur.addBindValue(translation->key());
     cur.addBindValue(translation->toHtml());
     cur.exec();
+    db.close();
 }
 
 
 
 void Bookmarks::remove(Translation* translation) {
+    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
+            QString((int)QThread::currentThreadId()));
+
+    db.setDatabaseName(dbName);
+    if(!db.isOpen() && !db.open()) {
+        qDebug() << "Database error: " << db.lastError().text() << endl;
+        return ;
+    }
     QSqlQuery cur(db);
     cur.prepare("delete from bookmarks where key=? and translation=?");
     cur.addBindValue(translation->key());
     cur.addBindValue(translation->key());
     cur.exec();
+    db.close();
 }
 
 
 
 QList<Translation*> Bookmarks::list() {
+    QList<Translation*> res;
+    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
+            QString((int)QThread::currentThreadId()));
+    db.setDatabaseName(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");
-    QList<Translation*> res;
     while(cur.next())
-        res.append(new BookmarkTranslation(cur.value(0).toString(), this));
+        res.append(new BookmarkTranslation(cur.value(0).toString(), this, dbName));
+    db.close();
     return res;
 }
 
@@ -72,6 +107,14 @@ QList<Translation*> Bookmarks::searchWordList(QString word) {
     word = word.replace("?", "_");
     word = removeAccents(word);
 
+    QList<Translation*> tr;
+    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
+            QString((int)QThread::currentThreadId()));
+    db.setDatabaseName(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 ?");
     cur.addBindValue(word);
@@ -80,18 +123,27 @@ QList<Translation*> Bookmarks::searchWordList(QString word) {
     while(cur.next())
         res.insert(cur.value(0).toString());
     qDebug() << "searchWordList " << res.size();
-    QList<Translation*> tr;
     foreach(QString str, res.toList())
-        tr.append(new BookmarkTranslation(str, this));
+        tr.append(new BookmarkTranslation(str, this, dbName));
+    db.close();
     return tr;
 }
 
 
 
-QStringList Bookmarks::search(QString word) {
-    qDebug() << "bookmarks::search";
-    QSqlQuery cur(db);
+QStringList Bookmarks::search(QString word, QString dbName) {
+    qDebug() << "bookmarks::search  " << word << " |" << dbName;
     QStringList result;
+    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
+            QString((int)QThread::currentThreadId()));
+    db.setDatabaseName(dbName);
+    if(!db.isOpen() && !db.open()) {
+        qDebug() << "Database error: " << db.lastError().text() << endl;
+        return result;
+    }
+    qDebug() << "bookmarks::search " << word;
+    QSqlQuery cur(db);
+    qDebug() << "bookmarks::search " << word;
     cur.prepare("select translation from bookmarks where key=?");
     cur.addBindValue(word);
     cur.exec();
@@ -99,6 +151,7 @@ QStringList Bookmarks::search(QString word) {
         result << cur.value(0).toString();
 
     qDebug() << result.size() << " " << result;
+    db.close();
     return result;
 }
 
@@ -123,11 +176,19 @@ QString Bookmarks::removeAccents(QString string) {
 
 
 bool Bookmarks::inBookmarks(QString word) {
+    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE", 
+            QString((int)QThread::currentThreadId()));
+    db.setDatabaseName(dbName);
+    if(!db.isOpen() && !db.open()) {
+        qDebug() << "Database error: " << db.lastError().text() << endl;
+        return false;
+    }
     QSqlQuery cur(db);
     cur.prepare("select translation from bookmarks where key like ? limit 1");
     cur.addBindValue(word);
     cur.exec();
     if(cur.next())
         return true;
+    db.close();
     return false;
 }
index eeaa594..07950fb 100644 (file)
@@ -83,7 +83,7 @@ public:
         and displayed
       \param word word to search for
       */
-    QStringList search(QString word);
+    QStringList search(QString word, QString dbname);
 
 
     /*! clars bookmarks database */
@@ -97,7 +97,6 @@ public:
 
 private:
     QString dbName;
-    QSqlDatabase db;
 
     bool checkAndCreateDb();
     QString removeAccents(QString);
index 44ffcad..74d9952 100644 (file)
@@ -179,6 +179,8 @@ void Backbone::search(QString word) {
     mappedSearch = word.toLower();
 
     stopped = false;
+    dictFin = 0;
+    bookmarkFin = 0;
 
     _innerResult = QtConcurrent::mapped(activeDicts(), mapSearch);
     _resultWatcher.setFuture(_innerResult);
@@ -230,7 +232,8 @@ void Backbone::addDictionary(CommonDictInterface *dict, bool active) {
 
 
 void Backbone::translationReady() {
-    if(_innerResult.isFinished()) {
+    if(_innerResult.isFinished() && !dictFin) {
+        dictFin = 1;
         QFutureIterator<QList<Translation*> > it(_innerResult);
 
         while(it.hasNext()) {
@@ -240,7 +243,8 @@ void Backbone::translationReady() {
         }
     }
 
-    if(_innerBookmarks.isFinished()) {
+    if(_innerBookmarks.isFinished() && !bookmarkFin) {
+        bookmarkFin = 1;
         QList<Translation*> list = _innerBookmarks.result();
         qDebug() << "translation bookmarks" << list.size();
         foreach(Translation* trans, list)
@@ -432,6 +436,7 @@ QStringList Backbone::htmls() {
 
 void Backbone::searchHtml(QList<Translation *> translations) {
     _htmlResult.clear();
+
     QList<TranslationPtr> dummy;
     stopped = false;
     qDebug()<< "search html";
@@ -441,8 +446,8 @@ void Backbone::searchHtml(QList<Translation *> translations) {
 
    _innerHtmlResult = QtConcurrent::mapped(dummy,
                                             &TranslationPtr::toHtml);
-    qDebug()<< "search html after map";
    _htmlResultWatcher.setFuture(_innerHtmlResult);
+    qDebug()<< "search html after map";
 }
 
 void Backbone::htmlTranslationReady() {
index 8ebcc99..9c3a2b6 100644 (file)
@@ -146,7 +146,8 @@ public Q_SLOTS:
       */
     void addBookmark(QList<Translation*> translations) {
         foreach(Translation* translation, translations)
-            QtConcurrent::run(&bookmarks, &Bookmarks::add, translation);
+            bookmarks.add(translation);
+            //QtConcurrent::run(&bookmarks, &Bookmarks::add, translation);
     }
 
 
@@ -165,8 +166,8 @@ public Q_SLOTS:
        */
    void fetchBookmarks() {
        _bookmarksResult.clear();
-       _innerBookmarks = QtConcurrent::run(bookmarks, &Bookmarks::list);
-       _bookmarkWatcher.setFuture(_innerBookmarks);
+       _innerListBookmarks = QtConcurrent::run(bookmarks, &Bookmarks::list);
+       _bookmarkWatcher.setFuture(_innerListBookmarks);
    }
 
    /*! \return list of all bookmarks
@@ -206,6 +207,7 @@ private:
     QFuture<QList<Translation*> > _innerResult; //Res of concurent word search
     QFuture<QString> _innerHtmlResult;  // Result of html search
     QFuture<QList<Translation*> > _innerBookmarks; //Res of search in bookmarks
+    QFuture<QList<Translation*> > _innerListBookmarks; //Res of search in bookmarks
     QFuture<QStringList> _innerHtmlBookmarks; //Html result of bookmarks search
 
     QMultiHash<QString, Translation*> _result; //Final result of word search
@@ -228,6 +230,7 @@ private:
     int _historyLen, _defaultHistoryLen;
     bool dryRun;
     bool stopped;
+    bool bookmarkFin, dictFin; // inform whether givent search type is ready
     Bookmarks bookmarks;