From 24ca438e628e9f7d291eb8a0b32d0485a49d9a68 Mon Sep 17 00:00:00 2001 From: Bartosz Szatkowski Date: Tue, 17 Aug 2010 12:58:23 +0200 Subject: [PATCH] Fixed sigsev after searching in bookmarks --- trunk/src/base/backbone/BookmarkTranslations.h | 6 +- trunk/src/base/backbone/Bookmarks.cpp | 85 ++++++++++++++++++++---- trunk/src/base/backbone/Bookmarks.h | 3 +- trunk/src/base/backbone/backbone.cpp | 11 ++- trunk/src/base/backbone/backbone.h | 9 ++- 5 files changed, 91 insertions(+), 23 deletions(-) diff --git a/trunk/src/base/backbone/BookmarkTranslations.h b/trunk/src/base/backbone/BookmarkTranslations.h index 73c200e..5a89ce4 100644 --- a/trunk/src/base/backbone/BookmarkTranslations.h +++ b/trunk/src/base/backbone/BookmarkTranslations.h @@ -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) diff --git a/trunk/src/base/backbone/Bookmarks.cpp b/trunk/src/base/backbone/Bookmarks.cpp index 8d68911..ff44f84 100644 --- a/trunk/src/base/backbone/Bookmarks.cpp +++ b/trunk/src/base/backbone/Bookmarks.cpp @@ -1,23 +1,26 @@ #include "Bookmarks.h" #include "BookmarkTranslations.h" +#include 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 Bookmarks::list() { + QList 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 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 Bookmarks::searchWordList(QString word) { word = word.replace("?", "_"); word = removeAccents(word); + QList 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 Bookmarks::searchWordList(QString word) { while(cur.next()) res.insert(cur.value(0).toString()); qDebug() << "searchWordList " << res.size(); - QList 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; } diff --git a/trunk/src/base/backbone/Bookmarks.h b/trunk/src/base/backbone/Bookmarks.h index eeaa594..07950fb 100644 --- a/trunk/src/base/backbone/Bookmarks.h +++ b/trunk/src/base/backbone/Bookmarks.h @@ -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); diff --git a/trunk/src/base/backbone/backbone.cpp b/trunk/src/base/backbone/backbone.cpp index 44ffcad..74d9952 100644 --- a/trunk/src/base/backbone/backbone.cpp +++ b/trunk/src/base/backbone/backbone.cpp @@ -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 > it(_innerResult); while(it.hasNext()) { @@ -240,7 +243,8 @@ void Backbone::translationReady() { } } - if(_innerBookmarks.isFinished()) { + if(_innerBookmarks.isFinished() && !bookmarkFin) { + bookmarkFin = 1; QList list = _innerBookmarks.result(); qDebug() << "translation bookmarks" << list.size(); foreach(Translation* trans, list) @@ -432,6 +436,7 @@ QStringList Backbone::htmls() { void Backbone::searchHtml(QList translations) { _htmlResult.clear(); + QList dummy; stopped = false; qDebug()<< "search html"; @@ -441,8 +446,8 @@ void Backbone::searchHtml(QList translations) { _innerHtmlResult = QtConcurrent::mapped(dummy, &TranslationPtr::toHtml); - qDebug()<< "search html after map"; _htmlResultWatcher.setFuture(_innerHtmlResult); + qDebug()<< "search html after map"; } void Backbone::htmlTranslationReady() { diff --git a/trunk/src/base/backbone/backbone.h b/trunk/src/base/backbone/backbone.h index 8ebcc99..9c3a2b6 100644 --- a/trunk/src/base/backbone/backbone.h +++ b/trunk/src/base/backbone/backbone.h @@ -146,7 +146,8 @@ public Q_SLOTS: */ void addBookmark(QList 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 > _innerResult; //Res of concurent word search QFuture _innerHtmlResult; // Result of html search QFuture > _innerBookmarks; //Res of search in bookmarks + QFuture > _innerListBookmarks; //Res of search in bookmarks QFuture _innerHtmlBookmarks; //Html result of bookmarks search QMultiHash _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; -- 1.7.9.5