diff -Nru baloo-4.12.95/CMakeLists.txt baloo-4.12.97/CMakeLists.txt --- baloo-4.12.95/CMakeLists.txt 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/CMakeLists.txt 2014-03-26 17:07:59.000000000 +0000 @@ -2,7 +2,7 @@ set(BALOO_VERSION_MAJOR 4) set(BALOO_VERSION_MINOR 12) -set(BALOO_VERSION_RELEASE 95) +set(BALOO_VERSION_RELEASE 97) set(BALOO_VERSION "${BALOO_VERSION_MAJOR}.${BALOO_VERSION_MINOR}.${BALOO_VERSION_RELEASE}") @@ -11,7 +11,7 @@ find_package(KDE4 REQUIRED) include(KDE4Defaults) -find_package(KdepimLibs 4.12.90 CONFIG) +find_package(KdepimLibs 4.12.97 CONFIG) set_package_properties(KdepimLibs PROPERTIES DESCRIPTION "The KDEPIM libraries" URL "http://www.kde.org" @@ -48,12 +48,14 @@ include(ConfigureChecks.cmake) add_definitions(-DQT_NO_KEYWORDS) +add_definitions(${KDE4_ENABLE_EXCEPTIONS}) include_directories( ${QT_INCLUDES} ${QJSON_INCLUDE_DIR} ${KFILEMETADATA_INCLUDE_DIR} ${XAPIAN_INCLUDE_DIR} + ${KDEPIMLIBS_INCLUDE_DIRS} ${AKONADI_INCLUDE_DIR} ${KDE4_INCLUDES} ${CMAKE_SOURCE_DIR} diff -Nru baloo-4.12.95/debian/changelog baloo-4.12.97/debian/changelog --- baloo-4.12.95/debian/changelog 2014-03-23 13:37:07.000000000 +0000 +++ baloo-4.12.97/debian/changelog 2014-04-02 09:04:28.000000000 +0000 @@ -1,3 +1,9 @@ +baloo (4:4.12.97-0ubuntu1) trusty; urgency=medium + + * New upstream release candidate + + -- Philip Muškovac Wed, 02 Apr 2014 11:04:27 +0200 + baloo (4:4.12.95-0ubuntu1) trusty; urgency=medium [ Rohan Garg ] diff -Nru baloo-4.12.95/debian/control baloo-4.12.97/debian/control --- baloo-4.12.95/debian/control 2014-03-23 13:37:07.000000000 +0000 +++ baloo-4.12.97/debian/control 2014-04-02 09:04:28.000000000 +0000 @@ -4,9 +4,9 @@ Maintainer: Rohan Garg Build-Depends: debhelper (>= 9.0.0), cmake, pkg-kde-tools, - kdelibs5-dev (>= 4:4.12.95), - kdepimlibs5-dev (>= 4:4.12.95), - libkfilemetadata-dev (>= 4:4.12.95), + kdelibs5-dev (>= 4:4.12.97), + kdepimlibs5-dev (>= 4:4.12.97), + libkfilemetadata-dev (>= 4:4.12.97), libxapian-dev, libqjson-dev, libattr1-dev, diff -Nru baloo-4.12.95/debian/libbaloocore4.symbols baloo-4.12.97/debian/libbaloocore4.symbols --- baloo-4.12.95/debian/libbaloocore4.symbols 2014-03-23 13:37:07.000000000 +0000 +++ baloo-4.12.97/debian/libbaloocore4.symbols 2014-04-02 09:04:28.000000000 +0000 @@ -1,4 +1,4 @@ -# SymbolsHelper-Confirmed: 4:4.12.80 amd64 +# SymbolsHelper-Confirmed: 4:4.12.97 i386 libbaloocore.so.4 libbaloocore4 #MINVER#, baloo _ZN5Baloo11SearchStore11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:4.12.80 _ZN5Baloo11SearchStore11qt_metacastEPKc@Base 4:4.12.80 @@ -35,6 +35,7 @@ _ZN5Baloo4Term11setNegationEb@Base 4:4.12.80 _ZN5Baloo4Term11setPropertyERK7QString@Base 4:4.12.80 _ZN5Baloo4Term11setSubTermsERK5QListIS0_E@Base 4:4.12.80 + _ZN5Baloo4Term11setUserDataERK7QStringRK8QVariant@Base 4:4.12.97 _ZN5Baloo4Term12setOperationENS0_9OperationE@Base 4:4.12.80 _ZN5Baloo4Term13setComparatorENS0_10ComparatorE@Base 4:4.12.80 _ZN5Baloo4Term14fromVariantMapERK4QMapI7QString8QVariantE@Base 4:4.12.80 @@ -108,6 +109,7 @@ _ZNK5Baloo4Term7subTermEv@Base 4:4.12.80 _ZNK5Baloo4Term8propertyEv@Base 4:4.12.80 _ZNK5Baloo4Term8subTermsEv@Base 4:4.12.80 + _ZNK5Baloo4Term8userDataERK7QString@Base 4:4.12.97 _ZNK5Baloo4Term9isNegatedEv@Base 4:4.12.80 _ZNK5Baloo4Term9operationEv@Base 4:4.12.80 _ZNK5Baloo4TermeqERKS0_@Base 4:4.12.80 diff -Nru baloo-4.12.95/debian/libbaloofiles4.symbols baloo-4.12.97/debian/libbaloofiles4.symbols --- baloo-4.12.95/debian/libbaloofiles4.symbols 2014-03-23 13:37:07.000000000 +0000 +++ baloo-4.12.97/debian/libbaloofiles4.symbols 2014-04-02 09:04:28.000000000 +0000 @@ -1,4 +1,4 @@ -# SymbolsHelper-Confirmed: 4:4.12.95 amd64 i386 +# SymbolsHelper-Confirmed: 4:4.12.97 i386 libbaloofiles.so.4 libbaloofiles4 #MINVER#, baloo _ZN5Baloo10TagListJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:4.12.80 _ZN5Baloo10TagListJob11qt_metacastEPKc@Base 4:4.12.80 @@ -56,6 +56,7 @@ _ZN5Baloo13FileModifyJob11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:4.12.80 _ZN5Baloo13FileModifyJob11qt_metacastEPKc@Base 4:4.12.80 _ZN5Baloo13FileModifyJob12modifyRatingERK11QStringListi@Base 4:4.12.80 + _ZN5Baloo13FileModifyJob13slotCommittedEv@Base 4:4.12.97 _ZN5Baloo13FileModifyJob16staticMetaObjectE@Base 4:4.12.80 _ZN5Baloo13FileModifyJob17modifyUserCommentERK11QStringListRK7QString@Base 4:4.12.80 _ZN5Baloo13FileModifyJob5startEv@Base 4:4.12.80 @@ -118,7 +119,6 @@ _ZTIN6Xapian12RuntimeErrorE@Base 4:4.12.80 _ZTIN6Xapian13DatabaseErrorE@Base 4:4.12.80 _ZTIN6Xapian16DocNotFoundErrorE@Base 4:4.12.80 - _ZTIN6Xapian17DatabaseLockErrorE@Base 4:4.12.95 _ZTIN6Xapian20DatabaseOpeningErrorE@Base 4:4.12.80 _ZTIN6Xapian20InvalidArgumentErrorE@Base 4:4.12.80 _ZTIN6Xapian5ErrorE@Base 4:4.12.80 @@ -130,7 +130,6 @@ _ZTSN6Xapian12RuntimeErrorE@Base 4:4.12.80 _ZTSN6Xapian13DatabaseErrorE@Base 4:4.12.80 _ZTSN6Xapian16DocNotFoundErrorE@Base 4:4.12.80 - _ZTSN6Xapian17DatabaseLockErrorE@Base 4:4.12.95 _ZTSN6Xapian20DatabaseOpeningErrorE@Base 4:4.12.80 _ZTSN6Xapian20InvalidArgumentErrorE@Base 4:4.12.80 _ZTSN6Xapian5ErrorE@Base 4:4.12.80 diff -Nru baloo-4.12.95/debian/libbaloopim4.symbols baloo-4.12.97/debian/libbaloopim4.symbols --- baloo-4.12.95/debian/libbaloopim4.symbols 2014-03-23 13:37:07.000000000 +0000 +++ baloo-4.12.97/debian/libbaloopim4.symbols 2014-04-02 09:04:28.000000000 +0000 @@ -1,4 +1,4 @@ -# SymbolsHelper-Confirmed: 4:4.12.90 amd64 i386 +# SymbolsHelper-Confirmed: 4:4.12.97 amd64 libbaloopim.so.4 libbaloopim4 #MINVER#, baloo _ZN5Baloo3PIM10EmailQuery11addInvolvesERK7QString@Base 4:4.12.80 _ZN5Baloo3PIM10EmailQuery11bodyMatchesERK7QString@Base 4:4.12.80 @@ -81,10 +81,16 @@ _ZTIN5Baloo3PIM12ContactQueryE@Base 4:4.12.80 _ZTIN5Baloo3PIM5QueryE@Base 4:4.12.80 _ZTIN5Baloo3PIM9NoteQueryE@Base 4:4.12.80 + _ZTIN6Xapian12RuntimeErrorE@Base 4:4.12.97 + _ZTIN6Xapian13DatabaseErrorE@Base 4:4.12.97 + _ZTIN6Xapian5ErrorE@Base 4:4.12.97 _ZTSN5Baloo3PIM10EmailQueryE@Base 4:4.12.80 _ZTSN5Baloo3PIM12ContactQueryE@Base 4:4.12.80 _ZTSN5Baloo3PIM5QueryE@Base 4:4.12.80 _ZTSN5Baloo3PIM9NoteQueryE@Base 4:4.12.80 + _ZTSN6Xapian12RuntimeErrorE@Base 4:4.12.97 + _ZTSN6Xapian13DatabaseErrorE@Base 4:4.12.97 + _ZTSN6Xapian5ErrorE@Base 4:4.12.97 _ZTVN5Baloo3PIM10EmailQueryE@Base 4:4.12.80 _ZTVN5Baloo3PIM12ContactQueryE@Base 4:4.12.80 _ZTVN5Baloo3PIM5QueryE@Base 4:4.12.80 diff -Nru baloo-4.12.95/debian/libbalooxapian4.symbols baloo-4.12.97/debian/libbalooxapian4.symbols --- baloo-4.12.95/debian/libbalooxapian4.symbols 2014-03-23 13:37:07.000000000 +0000 +++ baloo-4.12.97/debian/libbalooxapian4.symbols 2014-04-02 09:04:28.000000000 +0000 @@ -1,5 +1,32 @@ -# SymbolsHelper-Confirmed: 4:4.12.80 amd64 +# SymbolsHelper-Confirmed: 4:4.12.97 amd64 libbalooxapian.so.4 libbalooxapian4 #MINVER#, baloo + _ZN5Baloo14XapianDatabase11qt_metacallEN11QMetaObject4CallEiPPv@Base 4:4.12.97 + _ZN5Baloo14XapianDatabase11qt_metacastEPKc@Base 4:4.12.97 + _ZN5Baloo14XapianDatabase11retryCommitEv@Base 4:4.12.97 + _ZN5Baloo14XapianDatabase14deleteDocumentEj@Base 4:4.12.97 + _ZN5Baloo14XapianDatabase15replaceDocumentEjRKN6Xapian8DocumentE@Base 4:4.12.97 + _ZN5Baloo14XapianDatabase16staticMetaObjectE@Base 4:4.12.97 + _ZN5Baloo14XapianDatabase6commitEv@Base 4:4.12.97 + _ZN5Baloo14XapianDatabase8documentEj@Base 4:4.12.97 + _ZN5Baloo14XapianDatabase9committedEv@Base 4:4.12.97 + _ZN5Baloo14XapianDatabaseC1ERK7QString@Base 4:4.12.97 + _ZN5Baloo14XapianDatabaseC2ERK7QString@Base 4:4.12.97 + _ZN5Baloo14XapianDatabaseD0Ev@Base 4:4.12.97 + _ZN5Baloo14XapianDatabaseD1Ev@Base 4:4.12.97 + _ZN5Baloo14XapianDatabaseD2Ev@Base 4:4.12.97 + _ZN5Baloo14XapianDocument11addBoolTermERK7QStringS3_@Base 4:4.12.97 + _ZN5Baloo14XapianDocument11addBoolTermEiRK7QString@Base 4:4.12.97 + _ZN5Baloo14XapianDocument19fetchTermStartsWithERK10QByteArray@Base 4:4.12.97 + _ZN5Baloo14XapianDocument20removeTermStartsWithERK10QByteArray@Base 4:4.12.97 + _ZN5Baloo14XapianDocument3docEv@Base 4:4.12.97 + _ZN5Baloo14XapianDocument7addTermERK7QStringS3_@Base 4:4.12.97 + _ZN5Baloo14XapianDocument8addValueEiRK7QString@Base 4:4.12.97 + _ZN5Baloo14XapianDocument9indexTextERK7QStringS3_i@Base 4:4.12.97 + _ZN5Baloo14XapianDocument9indexTextERK7QStringi@Base 4:4.12.97 + _ZN5Baloo14XapianDocumentC1ERKN6Xapian8DocumentE@Base 4:4.12.97 + _ZN5Baloo14XapianDocumentC1Ev@Base 4:4.12.97 + _ZN5Baloo14XapianDocumentC2ERKN6Xapian8DocumentE@Base 4:4.12.97 + _ZN5Baloo14XapianDocumentC2Ev@Base 4:4.12.97 _ZN5Baloo17XapianSearchStore11docForQueryEi@Base 4:4.12.80 _ZN5Baloo17XapianSearchStore13finalizeQueryERKN6Xapian5QueryE@Base 4:4.12.80 _ZN5Baloo17XapianSearchStore13toXapianQueryEN6Xapian5Query2opERK5QListINS_4TermEE@Base 4:4.12.80 @@ -25,18 +52,24 @@ _ZN5Baloo17XapianSearchStoreD2Ev@Base 4:4.12.80 (optional=templinst)_ZN6Xapian5QueryC1IPS0_EENS0_2opET_S4_j@Base 4:4.12.80 (optional=templinst)_ZN6Xapian5QueryC2IPS0_EENS0_2opET_S4_j@Base 4:4.12.80 + _ZNK5Baloo14XapianDatabase10metaObjectEv@Base 4:4.12.97 + _ZTIN5Baloo14XapianDatabaseE@Base 4:4.12.97 _ZTIN5Baloo17XapianSearchStoreE@Base 4:4.12.80 _ZTIN6Xapian12RuntimeErrorE@Base 4:4.12.80 _ZTIN6Xapian13DatabaseErrorE@Base 4:4.12.80 _ZTIN6Xapian16DocNotFoundErrorE@Base 4:4.12.80 + _ZTIN6Xapian17DatabaseLockErrorE@Base 4:4.12.97 _ZTIN6Xapian20DatabaseOpeningErrorE@Base 4:4.12.80 _ZTIN6Xapian21DatabaseModifiedErrorE@Base 4:4.12.80 _ZTIN6Xapian5ErrorE@Base 4:4.12.80 + _ZTSN5Baloo14XapianDatabaseE@Base 4:4.12.97 _ZTSN5Baloo17XapianSearchStoreE@Base 4:4.12.80 _ZTSN6Xapian12RuntimeErrorE@Base 4:4.12.80 _ZTSN6Xapian13DatabaseErrorE@Base 4:4.12.80 _ZTSN6Xapian16DocNotFoundErrorE@Base 4:4.12.80 + _ZTSN6Xapian17DatabaseLockErrorE@Base 4:4.12.97 _ZTSN6Xapian20DatabaseOpeningErrorE@Base 4:4.12.80 _ZTSN6Xapian21DatabaseModifiedErrorE@Base 4:4.12.80 _ZTSN6Xapian5ErrorE@Base 4:4.12.80 + _ZTVN5Baloo14XapianDatabaseE@Base 4:4.12.97 _ZTVN5Baloo17XapianSearchStoreE@Base 4:4.12.80 diff -Nru baloo-4.12.95/src/core/term.cpp baloo-4.12.97/src/core/term.cpp --- baloo-4.12.95/src/core/term.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/core/term.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -37,6 +37,7 @@ bool m_isNegated; QList m_subTerms; + QVariantHash m_userData; Private() { m_op = None; @@ -206,6 +207,16 @@ d->m_comp = c; } +void Term::setUserData(const QString& name, const QVariant& value) +{ + d->m_userData.insert(name, value); +} + +QVariant Term::userData(const QString& name) const +{ + return d->m_userData.value(name); +} + QVariantMap Term::toVariantMap() const { QVariantMap map; diff -Nru baloo-4.12.95/src/core/term.h baloo-4.12.97/src/core/term.h --- baloo-4.12.95/src/core/term.h 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/core/term.h 2014-03-26 17:07:59.000000000 +0000 @@ -119,6 +119,9 @@ Comparator comparator() const; void setComparator(Comparator c); + void setUserData(const QString& name, const QVariant& value); + QVariant userData(const QString& name) const; + QVariantMap toVariantMap() const; static Term fromVariantMap(const QVariantMap& map); diff -Nru baloo-4.12.95/src/file/autotest/CMakeLists.txt baloo-4.12.97/src/file/autotest/CMakeLists.txt --- baloo-4.12.95/src/file/autotest/CMakeLists.txt 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/autotest/CMakeLists.txt 2014-03-26 17:07:59.000000000 +0000 @@ -34,6 +34,7 @@ ${QT_QTSQL_LIBRARY} ${KDE4_KDECORE_LIBS} ${XAPIAN_LIBRARIES} + balooxapian ) # @@ -74,7 +75,6 @@ basicindexingqueuetest.cpp ../basicindexingqueue.cpp ../basicindexingjob.cpp - ../xapiandocument.cpp ../indexingqueue.cpp ../fileindexerconfig.cpp ../fileexcludefilters.cpp @@ -92,5 +92,6 @@ ${KDE4_KDECORE_LIBS} ${KFILEMETADATA_LIBRARY} ${XAPIAN_LIBRARIES} + balooxapian ) diff -Nru baloo-4.12.95/src/file/baloo_file.desktop baloo-4.12.97/src/file/baloo_file.desktop --- baloo-4.12.95/src/file/baloo_file.desktop 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/baloo_file.desktop 2014-03-26 17:07:59.000000000 +0000 @@ -8,6 +8,7 @@ Name=Baloo File Daemon Name[bs]=Baloo datotečni demon Name[ca]=Dimoni de fitxers Baloo +Name[ca@valencia]=Dimoni de fitxers Baloo Name[da]=Baloo fil-dæmon Name[de]=Baloo-Dateidienst Name[el]=Δαίμονας αρχείων Baloo @@ -32,6 +33,7 @@ Name[sr@ijekavianlatin]=Demon Balooa Name[sr@latin]=Demon Balooa Name[sv]=Baloo-fildemon +Name[tr]=Baloo Dosya Yardımcısı Name[uk]=Фонова служба обробки файлів Baloo Name[x-test]=xxBaloo File Daemonxx Name[zh_CN]=Baloo 文件进程 diff -Nru baloo-4.12.95/src/file/basicindexingjob.cpp baloo-4.12.97/src/file/basicindexingjob.cpp --- baloo-4.12.95/src/file/basicindexingjob.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/basicindexingjob.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -23,9 +23,11 @@ #include "basicindexingjob.h" #include "database.h" #include "xapiandocument.h" +#include "lib/baloo_xattr_p.h" #include #include +#include #include #include @@ -92,6 +94,32 @@ doc.addBoolTerm("Z1"); } + // + // X-Attr terms + // + QString val; + + baloo_getxattr(m_file.url(), QLatin1String("user.xdg.tags"), &val); + if (!val.isEmpty()) { + QStringList tags = val.split(QLatin1Char(','), QString::SkipEmptyParts); + Q_FOREACH (const QString& tag, tags) { + doc.indexText(tag, QLatin1String("TA")); + doc.addBoolTerm(QLatin1String("TAG-") + tag); + } + } + + val.clear(); + baloo_getxattr(m_file.url(), QLatin1String("user.baloo.rating"), &val); + if (!val.isEmpty()) { + doc.addBoolTerm(val, QLatin1String("R")); + } + + val.clear(); + baloo_getxattr(m_file.url(), QLatin1String("user.xdg.comment"), &val); + if (!val.isEmpty()) { + doc.indexText(val, QLatin1String("C")); + } + m_id = m_file.id(); m_doc = doc.doc(); return true; diff -Nru baloo-4.12.95/src/file/basicindexingqueue.cpp baloo-4.12.97/src/file/basicindexingqueue.cpp --- baloo-4.12.95/src/file/basicindexingqueue.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/basicindexingqueue.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -26,6 +26,8 @@ #include "database.h" #include "filemapping.h" +#include "xapiandocument.h" + #include #include @@ -142,30 +144,22 @@ return true; } - try { - m_db->xapianDatabase()->reopen(); - Xapian::Document doc = m_db->xapianDatabase()->get_document(file.id()); - Xapian::TermIterator it = doc.termlist_begin(); - it.skip_to("DT_M"); - if (it == doc.termlist_end()) { - return true; - } + XapianDocument doc = m_db->xapianDatabase()->document(file.id()); + QString dtStr = doc.fetchTermStartsWith("DT_M"); + if (dtStr.isEmpty()) { + return true; + } - // A folders mtime is updated when a new file is added / removed / renamed - // we don't really need to reindex a folder when that happens - // In fact, we never need to reindex a folder - if (mimetype == QLatin1String("inode/directory")) - return false; - - // The 4 is for "DT_M" - const std::string s = *it; - const QString str = QString::fromUtf8(s.c_str(), s.length()).mid(4); - const QDateTime mtime = QDateTime::fromString(str, Qt::ISODate); + // A folders mtime is updated when a new file is added / removed / renamed + // we don't really need to reindex a folder when that happens + // In fact, we never need to reindex a folder + if (mimetype == QLatin1String("inode/directory")) + return false; - if (mtime != fileInfo.lastModified()) - return true; - } - catch (const Xapian::DocNotFoundError&) { + // The 4 is for "DT_M" + const QDateTime mtime = QDateTime::fromString(dtStr.mid(4), Qt::ISODate); + + if (mtime != fileInfo.lastModified()) { return true; } diff -Nru baloo-4.12.95/src/file/cleaner/CMakeLists.txt baloo-4.12.97/src/file/cleaner/CMakeLists.txt --- baloo-4.12.95/src/file/cleaner/CMakeLists.txt 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/cleaner/CMakeLists.txt 2014-03-26 17:07:59.000000000 +0000 @@ -17,6 +17,7 @@ ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS} ${XAPIAN_LIBRARIES} + balooxapian ) install(TARGETS baloo_file_cleaner DESTINATION ${BIN_INSTALL_DIR}) diff -Nru baloo-4.12.95/src/file/CMakeLists.txt baloo-4.12.97/src/file/CMakeLists.txt --- baloo-4.12.95/src/file/CMakeLists.txt 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/CMakeLists.txt 2014-03-26 17:07:59.000000000 +0000 @@ -20,7 +20,6 @@ fileindexingqueue.cpp commitqueue.cpp basicindexingjob.cpp - xapiandocument.cpp fileindexingjob.cpp eventmonitor.cpp util.cpp @@ -58,6 +57,7 @@ ${QJSON_LIBRARIES} baloocore baloofiles + balooxapian ) install(TARGETS baloo_file ${INSTALL_TARGETS_DEFAULT_ARGS}) diff -Nru baloo-4.12.95/src/file/commitqueue.cpp baloo-4.12.97/src/file/commitqueue.cpp --- baloo-4.12.95/src/file/commitqueue.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/commitqueue.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -27,6 +27,8 @@ #include #include +#include "xapiandocument.h" + Baloo::CommitQueue::CommitQueue(Database* db, QObject* parent) : QObject(parent) , m_db(db) @@ -38,6 +40,9 @@ m_largeTimer.setSingleShot(true); m_largeTimer.setInterval(10000); connect(&m_largeTimer, SIGNAL(timeout()), this, SLOT(commit())); + + connect(m_db->xapianDatabase(), SIGNAL(committed()), + this, SIGNAL(committed())); } Baloo::CommitQueue::~CommitQueue() @@ -47,13 +52,13 @@ void Baloo::CommitQueue::add(unsigned id, Xapian::Document doc) { - m_docsToAdd << qMakePair(id, doc); + m_db->xapianDatabase()->replaceDocument(id, doc); startTimers(); } void Baloo::CommitQueue::remove(unsigned int docid) { - m_docsToRemove << docid; + m_db->xapianDatabase()->deleteDocument(docid); startTimers(); } @@ -80,37 +85,5 @@ m_db->sqlDatabase().transaction(); kDebug() << "SQL Committed"; - if (m_docsToAdd.isEmpty() && m_docsToRemove.isEmpty()) - return; - - const QByteArray path = m_db->path().toUtf8(); - try { - Xapian::WritableDatabase db(path.constData(), Xapian::DB_CREATE_OR_OPEN); - - kDebug() << "Adding:" << m_docsToAdd.size() << "docs"; - Q_FOREACH (const DocIdPair& doc, m_docsToAdd) { - db.replace_document(doc.first, doc.second); - } - m_docsToAdd.clear(); - - kDebug() << "Removing:" << m_docsToRemove.size() << "docs"; - Q_FOREACH (Xapian::docid id, m_docsToRemove) { - try { - db.delete_document(id); - } - catch (const Xapian::DocNotFoundError&) { - } - } - m_docsToRemove.clear(); - - db.commit(); - kDebug() << "Xapian Committed"; - m_db->xapianDatabase()->reopen(); - - Q_EMIT committed(); - } - catch (const Xapian::DatabaseLockError& err) { - kError() << err.get_msg().c_str(); - startTimers(); - } + m_db->xapianDatabase()->commit(); } diff -Nru baloo-4.12.95/src/file/commitqueue.h baloo-4.12.97/src/file/commitqueue.h --- baloo-4.12.95/src/file/commitqueue.h 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/commitqueue.h 2014-03-26 17:07:59.000000000 +0000 @@ -52,11 +52,6 @@ private: void startTimers(); - typedef QPair DocIdPair; - QVector m_docsToAdd; - - QVector m_docsToRemove; - QTimer m_smallTimer; QTimer m_largeTimer; Database* m_db; diff -Nru baloo-4.12.95/src/file/database.cpp baloo-4.12.97/src/file/database.cpp --- baloo-4.12.95/src/file/database.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/database.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -54,17 +54,8 @@ if (m_initialized) return true; - // Create the path if it does not exist - QDir().mkpath(m_path); - // Create the Xapian DB - QByteArray path = m_path.toUtf8(); - try { - Xapian::WritableDatabase(path.constData(), Xapian::DB_CREATE_OR_OPEN); - } - catch (const Xapian::DatabaseLockError&) { - } - m_xapianDb = new Xapian::Database(path.constData()); + m_xapianDb = new Baloo::XapianDatabase(m_path); m_sqlDb = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE")); m_sqlDb->setDatabaseName(m_path + "/fileMap.sqlite3"); @@ -120,7 +111,7 @@ return *m_sqlDb; } -Xapian::Database* Database::xapianDatabase() +Baloo::XapianDatabase* Database::xapianDatabase() { return m_xapianDb; } diff -Nru baloo-4.12.95/src/file/database.h baloo-4.12.97/src/file/database.h --- baloo-4.12.95/src/file/database.h 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/database.h 2014-03-26 17:07:59.000000000 +0000 @@ -26,7 +26,7 @@ #include #include -#include +#include "xapiandatabase.h" class Database : public QObject { @@ -41,14 +41,14 @@ bool isInitialized(); QSqlDatabase& sqlDatabase(); - Xapian::Database* xapianDatabase(); + Baloo::XapianDatabase* xapianDatabase(); private: QString m_path; QString m_connectionName; bool m_initialized; - Xapian::Database* m_xapianDb; + Baloo::XapianDatabase* m_xapianDb; QSqlDatabase* m_sqlDb; }; diff -Nru baloo-4.12.95/src/file/extractor/app.cpp baloo-4.12.97/src/file/extractor/app.cpp --- baloo-4.12.95/src/file/extractor/app.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/extractor/app.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -49,7 +49,13 @@ m_path = KGlobal::dirs()->localxdgdatadir() + "baloo/file"; m_db.setPath(m_path); - m_db.init(); + if (!m_db.init()) { + QTimer::singleShot(0, QCoreApplication::instance(), SLOT(quit())); + return; + } + + connect(m_db.xapianDatabase(), SIGNAL(committed()), + this, SLOT(slotCommitted())); const KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); m_bData = args->isSet("bdata"); @@ -120,7 +126,7 @@ Xapian::Document doc; if (file.fetched()) { try { - doc = m_db.xapianDatabase()->get_document(file.id()); + doc = m_db.xapianDatabase()->db()->get_document(file.id()); } catch (const Xapian::DocNotFoundError&) { BasicIndexingJob basicIndexer(&m_db.sqlDatabase(), file, mimetype); @@ -134,6 +140,7 @@ Result result(url, mimetype); result.setId(file.id()); result.setDocument(doc); + result.setReadOnly(m_bData); QList exList = m_manager.fetchExtractors(mimetype); @@ -144,7 +151,7 @@ m_termCount += result.document().termlist_count(); // Documents with these many terms occupy about 10 mb - if (m_termCount >= 10000) { + if (m_termCount >= 10000 && !m_bData) { saveChanges(); return; } @@ -186,38 +193,24 @@ if (m_results.isEmpty()) return; - QList updatedFiles; + m_updatedFiles.clear(); - try { - Xapian::WritableDatabase db(m_path.toUtf8().constData(), Xapian::DB_CREATE_OR_OPEN); - for (int i = 0; ireplaceDocument(res.id(), res.document()); + m_updatedFiles << res.inputUrl(); + } - Q_FOREACH (Xapian::docid id, m_docsToRemove) { - try { - db.delete_document(id); - } - catch (const Xapian::DocNotFoundError&) { - } - } + m_db.xapianDatabase()->commit(); +} - db.commit(); - m_db.xapianDatabase()->reopen(); - m_results.clear(); - m_docsToRemove.clear(); - m_termCount = 0; - - Q_EMIT saved(); - } - catch (const Xapian::DatabaseLockError& err) { - kError() << "Cannot open database in write mode:" << err.get_msg().c_str(); - QTimer::singleShot(100, this, SLOT(saveChanges())); - return; - } +void App::slotCommitted() +{ + m_results.clear(); + m_termCount = 0; + m_updatedFiles.clear(); QDBusMessage message = QDBusMessage::createSignal(QLatin1String("/files"), QLatin1String("org.kde"), @@ -225,14 +218,17 @@ QVariantList vl; vl.reserve(1); - vl << QVariant(updatedFiles); + vl << QVariant(m_updatedFiles); message.setArguments(vl); QDBusConnection::sessionBus().send(message); + + Q_EMIT saved(); } + void App::deleteDocument(unsigned docid) { - m_docsToRemove << docid; + m_db.xapianDatabase()->deleteDocument(docid); } diff -Nru baloo-4.12.95/src/file/extractor/app.h baloo-4.12.97/src/file/extractor/app.h --- baloo-4.12.95/src/file/extractor/app.h 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/extractor/app.h 2014-03-26 17:07:59.000000000 +0000 @@ -45,6 +45,7 @@ private Q_SLOTS: void processNextUrl(); void saveChanges(); + void slotCommitted(); Q_SIGNALS: void saved(); @@ -53,7 +54,6 @@ void deleteDocument(unsigned docid); QVector m_results; - QVector m_docsToRemove; QStringList m_urls; bool m_bData; @@ -64,6 +64,7 @@ KFileMetaData::ExtractorPluginManager m_manager; int m_termCount; + QList m_updatedFiles; }; } diff -Nru baloo-4.12.95/src/file/extractor/CMakeLists.txt baloo-4.12.97/src/file/extractor/CMakeLists.txt --- baloo-4.12.95/src/file/extractor/CMakeLists.txt 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/extractor/CMakeLists.txt 2014-03-26 17:07:59.000000000 +0000 @@ -4,7 +4,6 @@ result.cpp ../priority.cpp ../basicindexingjob.cpp - ../xapiandocument.cpp ../database.cpp ../util.cpp ) @@ -19,6 +18,7 @@ ${XAPIAN_LIBRARIES} ${QJSON_LIBRARIES} baloofiles + balooxapian ) install(TARGETS baloo_file_extractor DESTINATION ${BIN_INSTALL_DIR}) diff -Nru baloo-4.12.95/src/file/extractor/result.cpp baloo-4.12.97/src/file/extractor/result.cpp --- baloo-4.12.95/src/file/extractor/result.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/extractor/result.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -31,12 +31,12 @@ #include // In order to use it in a vector -Result::Result(): ExtractionResult(QString(), QString()), m_docId(0) +Result::Result(): ExtractionResult(QString(), QString()), m_docId(0), m_readOnly(false) { } Result::Result(const QString& url, const QString& mimetype) - : KFileMetaData::ExtractionResult(url, mimetype), m_docId(0) + : KFileMetaData::ExtractionResult(url, mimetype), m_docId(0), m_readOnly(false) { } @@ -72,7 +72,9 @@ void Result::append(const QString& text) { - m_termGenForText.index_text(text.toUtf8().constData()); + if (!m_readOnly) { + m_termGenForText.index_text(text.toUtf8().constData()); + } } void Result::addType(KFileMetaData::Type::Type type) @@ -82,23 +84,17 @@ m_doc.add_boolean_term(t.toUtf8().constData()); } -void Result::save(Xapian::WritableDatabase& db) +void Result::setReadOnly(bool readOnly) +{ + m_readOnly = readOnly; +} + +void Result::finish() { QJson::Serializer serializer; QByteArray json = serializer.serialize(m_map); m_doc.set_data(json.constData()); Baloo::updateIndexingLevel(m_doc, 2); - - // We keep trying to write if someone else has modified the database - while (true) { - try { - db.replace_document(m_docId, m_doc); - break; - } - catch (const Xapian::DatabaseModifiedError&) { - db.reopen(); - } - } } void Result::setDocument(const Xapian::Document& doc) diff -Nru baloo-4.12.95/src/file/extractor/result.h baloo-4.12.97/src/file/extractor/result.h --- baloo-4.12.95/src/file/extractor/result.h 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/extractor/result.h 2014-03-26 17:07:59.000000000 +0000 @@ -36,7 +36,11 @@ virtual void append(const QString& text); virtual void addType(KFileMetaData::Type::Type type); - void save(Xapian::WritableDatabase& db); + /** + * Read only mode is a special mode where plain text changes are ignored + * so this way, this class will consume less memory + */ + void setReadOnly(bool readOnly); void setId(uint id); void setDocument(const Xapian::Document& doc); @@ -48,6 +52,12 @@ return m_doc; } + /** + * Applies the finishing touches on the document, and makes + * it ready to be pushed into the db + */ + void finish(); + private: uint m_docId; Xapian::Document m_doc; @@ -55,6 +65,7 @@ Xapian::TermGenerator m_termGenForText; QVariantMap m_map; + bool m_readOnly; }; #endif // EXTRACTIONRESULT_H diff -Nru baloo-4.12.95/src/file/fileindexingqueue.cpp baloo-4.12.97/src/file/fileindexingqueue.cpp --- baloo-4.12.95/src/file/fileindexingqueue.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/fileindexingqueue.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -45,14 +45,22 @@ if (m_fileQueue.size() >= m_maxSize) return; - Xapian::Enquire enquire(*m_db->xapianDatabase()); - enquire.set_query(Xapian::Query("Z1")); - - m_db->xapianDatabase()->reopen(); - Xapian::MSet mset = enquire.get_mset(0, m_maxSize - m_fileQueue.size()); - Xapian::MSetIterator it = mset.begin(); - for (; it != mset.end(); it++) { - m_fileQueue << *it; + try { + Xapian::Database* db = m_db->xapianDatabase()->db(); + Xapian::Enquire enquire(*db); + enquire.set_query(Xapian::Query("Z1")); + + Xapian::MSet mset = enquire.get_mset(0, m_maxSize - m_fileQueue.size()); + Xapian::MSetIterator it = mset.begin(); + for (; it != mset.end(); it++) { + m_fileQueue << *it; + } + } + catch (const Xapian::DatabaseModifiedError&) { + fillQueue(); + } + catch (const Xapian::Error&) { + return; } } @@ -80,7 +88,7 @@ void FileIndexingQueue::slotFinishedIndexingFile(KJob*) { // The process would have modified the db - m_db->xapianDatabase()->reopen(); + m_db->xapianDatabase()->db()->reopen(); if (m_fileQueue.isEmpty()) { fillQueue(); } @@ -89,8 +97,8 @@ void FileIndexingQueue::slotIndexingFailed(uint id) { - m_db->xapianDatabase()->reopen(); - Xapian::Document doc = m_db->xapianDatabase()->get_document(id); + m_db->xapianDatabase()->db()->reopen(); + Xapian::Document doc = m_db->xapianDatabase()->db()->get_document(id); updateIndexingLevel(doc, -1); Q_EMIT newDocument(id, doc); diff -Nru baloo-4.12.95/src/file/inotify/org.kde.baloo.filewatch.actions baloo-4.12.97/src/file/inotify/org.kde.baloo.filewatch.actions --- baloo-4.12.95/src/file/inotify/org.kde.baloo.filewatch.actions 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/inotify/org.kde.baloo.filewatch.actions 2014-03-26 17:07:59.000000000 +0000 @@ -2,6 +2,7 @@ Name=Folder Watch Limit Name[bs]=Ograničenje praćenja direktorija Name[ca]=Límit de vigilància de carpetes +Name[ca@valencia]=Límit de vigilància de carpetes Name[cs]=Limit sledovaných složek Name[da]=Grænse for mappeovervågning Name[de]=Begrenzung für Ordnerüberwachung @@ -26,6 +27,7 @@ Name[sr@ijekavianlatin]=Ograničenje nadgledanja fascikli Name[sr@latin]=Ograničenje nadgledanja fascikli Name[sv]=Gräns för katalogbevakning +Name[tr]=Klasör İzleme Sınırı Name[uk]=Обмеження щодо нагляду за теками Name[x-test]=xxFolder Watch Limitxx Name[zh_CN]=文件夹监视限制 @@ -33,6 +35,7 @@ Description=To avoid missing file changes, raise the inotify folder watch limit Description[bs]=Da izbjegnete nedostajuće izmjene datoteka, povećajte limit za inofity direktorij. Description[ca]=Per evitar la pèrdua de canvis de fitxers, eleveu el límit de vigilància de carpetes de l'«inotify» +Description[ca@valencia]=Per evitar la pèrdua de canvis de fitxers, eleveu el límit de vigilància de carpetes de l'«inotify» Description[cs]=Abyste nepřehlédli změny souborů, zvyšte limit sledovaných složek inotify Description[da]=Hæv inotify mappeovervågningsgrænsen for ikke at gå glip af filændringer Description[de]=Damit Sie keine Dateiänderungen verpassen, setzen Sie die Begrenzung für Ordnerüberwachung durch inotify nach oben @@ -56,6 +59,7 @@ Description[sr@ijekavianlatin]=Veće ograničenje nadgledanja fascikli (inotify) izbegava propuštene izmene fajlova Description[sr@latin]=Veće ograničenje nadgledanja fascikli (inotify) izbegava propuštene izmene fajlova Description[sv]=För att undvika att missa filändringar, höj gränsen för katalogbevakning i inotify. +Description[tr]=Eksik dosya değişikliklerini önlemek için, klasör izleme sınırını arttırın Description[uk]=Щоб не пропустити змін у файлах, збільшіть значення обмеження щодо кількості тек, за якими спостерігає система (inotify). Description[x-test]=xxTo avoid missing file changes, raise the inotify folder watch limitxx Description[zh_CN]=为了监视所有文件的修改,请提升 inotify 目录监视上限 diff -Nru baloo-4.12.95/src/file/kcm/kcm_baloofile.desktop baloo-4.12.97/src/file/kcm/kcm_baloofile.desktop --- baloo-4.12.95/src/file/kcm/kcm_baloofile.desktop 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/kcm/kcm_baloofile.desktop 2014-03-26 17:07:59.000000000 +0000 @@ -12,6 +12,7 @@ Name=Desktop Search Name[bs]=Pretraga površi Name[ca]=Cerca a l'escriptori +Name[ca@valencia]=Cerca a l'escriptori Name[cs]=Vyhledávací služby Name[da]=Skrivebordssøgning Name[de]=Desktop-Suche @@ -37,12 +38,14 @@ Name[sr@ijekavianlatin]=Pretraga površi Name[sr@latin]=Pretraga površi Name[sv]=Skrivbordssökning +Name[tr]=Masaüstü Araması Name[uk]=Стільничний пошук Name[x-test]=xxDesktop Searchxx Name[zh_CN]=桌面搜索 Name[zh_TW]=桌面搜尋 Comment=Configure Desktop Search Comment[ca]=Configuració de la cerca a l'escriptori +Comment[ca@valencia]=Configuració de la cerca a l'escriptori Comment[cs]=Nastavit vyhledávací služby Comment[da]=Indstil skrivebordssøgning Comment[de]=Desktop-Suche einrichten @@ -67,12 +70,14 @@ Comment[sr@ijekavianlatin]=Podešavanje pretrage površi Comment[sr@latin]=Podešavanje pretrage površi Comment[sv]=Anpassa skrivbordssökning +Comment[tr]=Masaüstü Aramasını Yapılandır Comment[uk]=Налаштовування стільничного пошуку Comment[x-test]=xxConfigure Desktop Searchxx Comment[zh_CN]=配置桌面搜索 Comment[zh_TW]=設定桌面搜尋 X-KDE-Keywords=Search, File, Baloo X-KDE-Keywords[ca]=Cerca, Fitxer, Baloo +X-KDE-Keywords[ca@valencia]=Cerca, Fitxer, Baloo X-KDE-Keywords[cs]=Hledat, Soubor, Baloo X-KDE-Keywords[da]=Søg, fil, Baloo X-KDE-Keywords[de]=Suchen, Datei, Baloo @@ -98,6 +103,7 @@ X-KDE-Keywords[sr@ijekavianlatin]=search;file;baloo;pretraga;fajl;Baloo X-KDE-Keywords[sr@latin]=search;file;baloo;pretraga;fajl;Baloo X-KDE-Keywords[sv]=Sök, Fil, Baloo +X-KDE-Keywords[tr]=Ara, Dosya, Baloo X-KDE-Keywords[uk]=Search,File,Baloo,пошук,файл X-KDE-Keywords[x-test]=xxSearch, File, Balooxx X-KDE-Keywords[zh_CN]=Search, File, Baloo,搜索,文件 diff -Nru baloo-4.12.95/src/file/lib/autotests/CMakeLists.txt baloo-4.12.97/src/file/lib/autotests/CMakeLists.txt --- baloo-4.12.95/src/file/lib/autotests/CMakeLists.txt 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/lib/autotests/CMakeLists.txt 2014-03-26 17:07:59.000000000 +0000 @@ -42,6 +42,7 @@ ${XAPIAN_LIBRARIES} ${QJSON_LIBRARIES} baloocore + balooxapian ) # Pass CMAKE_CURRENT_BINARY_DIR so tests can use it to create some of the diff -Nru baloo-4.12.95/src/file/lib/autotests/filefetchjobtest.cpp baloo-4.12.97/src/file/lib/autotests/filefetchjobtest.cpp --- baloo-4.12.95/src/file/lib/autotests/filefetchjobtest.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/lib/autotests/filefetchjobtest.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -22,6 +22,7 @@ #include "filefetchjob.h" #include "../baloo_xattr_p.h" #include "../db.h" +#include "../xattrdetector.h" #include "filemapping.h" #include "file.h" @@ -92,7 +93,13 @@ { QTemporaryFile tempFile(QLatin1String(BUILDDIR "testExtendedAttributes.XXXXXX")); tempFile.open(); + QString fileName = tempFile.fileName(); + XattrDetector detector; + if (!detector.isSupported(fileName)) { + kWarning() << "Xattr not supported on this filesystem"; + return; + } FileMapping fileMap(tempFile.fileName()); QSqlDatabase sqlDb = fileMappingDb(); @@ -128,6 +135,12 @@ KTempDir tmpDir(f.fileName().mid(0, f.fileName().lastIndexOf('/') + 1)); QString fileName = tmpDir.name(); + XattrDetector detector; + if (!detector.isSupported(fileName)) { + kWarning() << "Xattr not supported on this filesystem"; + return; + } + FileMapping fileMap(tmpDir.name()); QSqlDatabase sqlDb = fileMappingDb(); QVERIFY(fileMap.create(sqlDb)); diff -Nru baloo-4.12.95/src/file/lib/autotests/filemodifyjobtest.cpp baloo-4.12.97/src/file/lib/autotests/filemodifyjobtest.cpp --- baloo-4.12.95/src/file/lib/autotests/filemodifyjobtest.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/lib/autotests/filemodifyjobtest.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -21,6 +21,7 @@ #include "filemodifyjobtest.h" #include "filemodifyjob.h" #include "../baloo_xattr_p.h" +#include "../xattrdetector.h" #include "../db.h" #include "filemapping.h" #include "file.h" @@ -58,16 +59,22 @@ QString value; - int len = baloo_getxattr(fileUrl, QLatin1String("user.baloo.rating"), &value); - QVERIFY(len > 0); - QCOMPARE(value.toInt(), 5); - - len = baloo_getxattr(fileUrl, "user.xdg.tags", &value); - QCOMPARE(len, 0); - - len = baloo_getxattr(fileUrl, "user.xdg.comment", &value); - QVERIFY(len > 0); - QCOMPARE(value, QString("User Comment")); + XattrDetector detector; + if (detector.isSupported(tmpFile.fileName())) { + int len = baloo_getxattr(fileUrl, QLatin1String("user.baloo.rating"), &value); + QVERIFY(len > 0); + QCOMPARE(value.toInt(), 5); + + len = baloo_getxattr(fileUrl, "user.xdg.tags", &value); + QCOMPARE(len, 0); + + len = baloo_getxattr(fileUrl, "user.xdg.comment", &value); + QVERIFY(len > 0); + QCOMPARE(value, QString("User Comment")); + } + else { + kWarning() << "Xattr not supported on this filesystem"; + } // // Check in Xapian @@ -110,13 +117,19 @@ QString value; - int len = baloo_getxattr(fileUrl1, "user.baloo.rating", &value); - QVERIFY(len > 0); - QCOMPARE(value.toInt(), 5); - - len = baloo_getxattr(fileUrl2, "user.baloo.rating", &value); - QVERIFY(len > 0); - QCOMPARE(value.toInt(), 5); + XattrDetector detector; + if (detector.isSupported(tmpFile1.fileName())) { + int len = baloo_getxattr(fileUrl1, "user.baloo.rating", &value); + QVERIFY(len > 0); + QCOMPARE(value.toInt(), 5); + + len = baloo_getxattr(fileUrl2, "user.baloo.rating", &value); + QVERIFY(len > 0); + QCOMPARE(value.toInt(), 5); + } + else { + kWarning() << "Xattr not supported on this filesystem"; + } } void FileModifyJobTest::testXapianUpdate() @@ -200,9 +213,15 @@ QString value; - int len = baloo_getxattr(url, QLatin1String("user.baloo.rating"), &value); - QVERIFY(len > 0); - QCOMPARE(value.toInt(), 5); + XattrDetector detector; + if (detector.isSupported(f.fileName())) { + int len = baloo_getxattr(url, QLatin1String("user.baloo.rating"), &value); + QVERIFY(len > 0); + QCOMPARE(value.toInt(), 5); + } + else { + kWarning() << "Xattr not supported on this filesystem"; + } } diff -Nru baloo-4.12.95/src/file/lib/CMakeLists.txt baloo-4.12.97/src/file/lib/CMakeLists.txt --- baloo-4.12.95/src/file/lib/CMakeLists.txt 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/lib/CMakeLists.txt 2014-03-26 17:07:59.000000000 +0000 @@ -25,6 +25,7 @@ ${XAPIAN_LIBRARIES} ${QJSON_LIBRARIES} baloocore + balooxapian ) set_target_properties(baloofiles PROPERTIES diff -Nru baloo-4.12.95/src/file/lib/filemodifyjob.cpp baloo-4.12.97/src/file/lib/filemodifyjob.cpp --- baloo-4.12.95/src/file/lib/filemodifyjob.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/lib/filemodifyjob.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -25,6 +25,9 @@ #include "searchstore.h" #include "filecustommetadata.h" +#include "xapiandatabase.h" +#include "xapiandocument.h" + #include #include @@ -49,11 +52,15 @@ bool commentSet; bool tagsSet; + XapianDatabase* m_db; + QStringList m_updatedFiles; + Private() : rating(0) , ratingSet(false) , commentSet(false) , tagsSet(false) + , m_db(0) {} }; @@ -85,42 +92,8 @@ QTimer::singleShot(0, this, SLOT(doStart())); } -namespace { - -void removeTerms(Xapian::Document& doc, const std::string& p) { - QByteArray prefix = QByteArray::fromRawData(p.c_str(), p.size()); - - Xapian::TermIterator it = doc.termlist_begin(); - it.skip_to(p); - while (it != doc.termlist_end()){ - const std::string t = *it; - const QByteArray term = QByteArray::fromRawData(t.c_str(), t.size()); - if (!term.startsWith(prefix)) { - break; - } - - // The term should not just be the prefix - if (term.size() <= prefix.size()) { - break; - } - - // The term should not contain any more upper case letters - if (isupper(term.at(prefix.size()))) { - it++; - continue; - } - - it++; - doc.remove_term(t); - } -} - -} - void FileModifyJob::doStart() { - QStringList updatedFiles; - Q_FOREACH (const File& file, d->files) { FileMapping fileMap(file.url()); if (!file.id().isEmpty()) { @@ -148,7 +121,7 @@ return; } - updatedFiles << fileMap.url(); + d->m_updatedFiles << fileMap.url(); const QString furl = fileMap.url(); if (d->ratingSet) { @@ -166,56 +139,36 @@ } // Save in Xapian - Xapian::WritableDatabase db; - try { - db = Xapian::WritableDatabase(fileIndexDbPath(), Xapian::DB_CREATE_OR_OPEN); - } - catch (const Xapian::DatabaseLockError& err) { - kError() << err.get_msg().c_str(); - kError() << "Trying again in 20 msecs"; - QTimer::singleShot(20, this, SLOT(doStart())); - } - Xapian::Document doc; - - try { - doc = db.get_document(fileMap.id()); - - removeTerms(doc, "R"); - removeTerms(doc, "TA"); - removeTerms(doc, "TAG"); - removeTerms(doc, "C"); - } - catch (const Xapian::DocNotFoundError&) { - } + d->m_db = new XapianDatabase(QString::fromUtf8(fileIndexDbPath().c_str())); + XapianDocument doc = d->m_db->document(fileMap.id()); + + doc.removeTermStartsWith("R"); + doc.removeTermStartsWith("TA"); + doc.removeTermStartsWith("TAG"); + doc.removeTermStartsWith("C"); const int rating = d->rating; if (rating > 0) { - const QString ratingStr = QLatin1Char('R') + QString::number(d->rating); - doc.add_boolean_term(ratingStr.toUtf8().constData()); + doc.addBoolTerm(rating, "R"); } - Xapian::TermGenerator termGen; - termGen.set_document(doc); - Q_FOREACH (const QString& tag, d->tags) { - termGen.index_text(tag.toUtf8().constData(), 1, "TA"); - - const QString tagStr = QLatin1String("TAG-") + tag; - doc.add_boolean_term(tagStr.toUtf8().constData()); + doc.indexText(tag, "TA"); + doc.addBoolTerm(tag, "TAG-"); } if (!d->comment.isEmpty()) { - Xapian::TermGenerator termGen; - termGen.set_document(doc); - - const QByteArray str = d->comment.toUtf8(); - termGen.index_text(str.constData(), 1, "C"); + doc.indexText(d->comment, "C"); } - db.replace_document(fileMap.id(), doc); - db.commit(); + d->m_db->replaceDocument(fileMap.id(), doc.doc()); + connect(d->m_db, SIGNAL(committed()), this, SLOT(slotCommitted())); + d->m_db->commit(); } +} +void FileModifyJob::slotCommitted() +{ // Notify the world? QDBusMessage message = QDBusMessage::createSignal(QLatin1String("/files"), QLatin1String("org.kde"), @@ -223,7 +176,7 @@ QVariantList vl; vl.reserve(1); - vl << QVariant(updatedFiles); + vl << QVariant(d->m_updatedFiles); message.setArguments(vl); QDBusConnection::sessionBus().send(message); diff -Nru baloo-4.12.95/src/file/lib/filemodifyjob.h baloo-4.12.97/src/file/lib/filemodifyjob.h --- baloo-4.12.95/src/file/lib/filemodifyjob.h 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/lib/filemodifyjob.h 2014-03-26 17:07:59.000000000 +0000 @@ -46,8 +46,10 @@ Error_FileDoesNotExist = KJob::UserDefinedError + 1, Error_EmptyFile, }; + private Q_SLOTS: void doStart(); + void slotCommitted(); private: class Private; diff -Nru baloo-4.12.95/src/file/search/autotest/filesearchstoretest.cpp baloo-4.12.97/src/file/search/autotest/filesearchstoretest.cpp --- baloo-4.12.95/src/file/search/autotest/filesearchstoretest.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/search/autotest/filesearchstoretest.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -94,7 +94,7 @@ wdb->replace_document(id, doc); wdb->commit(); - m_db->xapianDatabase()->reopen(); + m_db->xapianDatabase()->db()->reopen(); } void FileSearchStoreTest::insertRating(int id, int rating) @@ -110,7 +110,7 @@ wdb->replace_document(id, doc); wdb->commit(); - m_db->xapianDatabase()->reopen(); + m_db->xapianDatabase()->db()->reopen(); } diff -Nru baloo-4.12.95/src/file/tests/basicindexingqueuetest.cpp baloo-4.12.97/src/file/tests/basicindexingqueuetest.cpp --- baloo-4.12.95/src/file/tests/basicindexingqueuetest.cpp 1970-01-01 00:00:00.000000000 +0000 +++ baloo-4.12.97/src/file/tests/basicindexingqueuetest.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -0,0 +1,60 @@ +/* + * This file is part of the KDE Baloo Project + * Copyright (C) 2014 Vishesh Handa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + */ + +#include +#include +#include +#include + +#include "../basicindexingqueue.h" +#include "../commitqueue.h" +#include "../database.h" +#include "../fileindexerconfig.h" +#include "../lib/filemapping.h" + +int main(int argc, char** argv) +{ + KTempDir tempDir; + + Database db; + db.setPath(tempDir.name()); + db.init(); + + Baloo::FileIndexerConfig config; + QCoreApplication app(argc, argv); + + Baloo::BasicIndexingQueue basicIQ(&db, &config); + QObject::connect(&basicIQ, SIGNAL(finishedIndexing()), &app, SLOT(quit())); + + Baloo::CommitQueue commitQueue(&db); + QObject::connect(&basicIQ, SIGNAL(newDocument(uint,Xapian::Document)), + &commitQueue, SLOT(add(uint,Xapian::Document))); + + basicIQ.enqueue(Baloo::FileMapping(QDir::homePath())); + + QTime timer; + timer.start(); + int ret = app.exec(); + + qDebug() << "Elapsed:" << timer.elapsed(); + return ret; +} diff -Nru baloo-4.12.95/src/file/tests/CMakeLists.txt baloo-4.12.97/src/file/tests/CMakeLists.txt --- baloo-4.12.95/src/file/tests/CMakeLists.txt 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/tests/CMakeLists.txt 2014-03-26 17:07:59.000000000 +0000 @@ -14,3 +14,27 @@ ${KDE4_KDEUI_LIBS} baloocore ) + +kde4_add_executable(basicindexingqueuetest + basicindexingqueuetest.cpp + ../fileindexerconfig.cpp + ../regexpcache.cpp + ../fileexcludefilters.cpp + ../basicindexingqueue.cpp + ../indexingqueue.cpp + ../basicindexingjob.cpp + ../database.cpp + ../lib/filemapping.cpp + ../commitqueue.cpp +) + +target_link_libraries(basicindexingqueuetest + ${QT_QTCORE_LIBRARY} + ${QT_QTSQL_LIBRARY} + ${KDE4_KDECORE_LIBS} + ${KDE4_KIO_LIBS} + ${XAPIAN_LIBRARIES} + ${KFILEMETADATA_LIBRARY} + baloocore + balooxapian +) diff -Nru baloo-4.12.95/src/file/xapiandocument.cpp baloo-4.12.97/src/file/xapiandocument.cpp --- baloo-4.12.95/src/file/xapiandocument.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/xapiandocument.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -/* - * - * Copyright (C) 2014 Vishesh Handa - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include "xapiandocument.h" - -using namespace Baloo; - -XapianDocument::XapianDocument() -{ - m_termGen.set_document(m_doc); -} - -void XapianDocument::addTerm(const QString& term, const QString& prefix) -{ - QByteArray arr = prefix.toUtf8(); - arr += term.toUtf8(); - - m_doc.add_term(arr.constData()); -} - -void XapianDocument::addBoolTerm(int term, const QString& prefix) -{ - addBoolTerm(QString::number(term), prefix); -} - -void XapianDocument::addBoolTerm(const QString& term, const QString& prefix) -{ - QByteArray arr = prefix.toUtf8(); - arr += term.toUtf8(); - - m_doc.add_boolean_term(arr.constData()); -} - -void XapianDocument::indexText(const QString& text, const QString& prefix, int wdfInc) -{ - const QByteArray tarr = text.toUtf8(); - const QByteArray par = prefix.toUtf8(); - m_termGen.index_text(tarr.constData(), wdfInc, par.constData()); -} - -void XapianDocument::indexText(const QString& text, int wdfInc) -{ - indexText(text, QString(), wdfInc); -} - -Xapian::Document XapianDocument::doc() -{ - return m_doc; -} - -void XapianDocument::addValue(int pos, const QString& value) -{ - m_doc.add_value(pos, value.toUtf8().constData()); -} - diff -Nru baloo-4.12.95/src/file/xapiandocument.h baloo-4.12.97/src/file/xapiandocument.h --- baloo-4.12.95/src/file/xapiandocument.h 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/file/xapiandocument.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -/* - * - * Copyright (C) 2014 Vishesh Handa - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef BALOO_XAPIANDOCUMENT_H -#define BALOO_XAPIANDOCUMENT_H - -#include -#include - -namespace Baloo { - -/** - * This class is just a light wrapper over Xapian::Document - * which provides nice Qt apis. - */ -class XapianDocument -{ -public: - XapianDocument(); - - void addTerm(const QString& term, const QString& prefix); - void addBoolTerm(const QString& term, const QString& prefix = QString()); - void addBoolTerm(int term, const QString& prefix); - - void indexText(const QString& text, int wdfInc = 1); - void indexText(const QString& text, const QString& prefix, int wdfInc = 1); - - void addValue(int pos, const QString& value); - - Xapian::Document doc(); - -private: - Xapian::Document m_doc; - Xapian::TermGenerator m_termGen; -}; -} - -#endif // BALOO_XAPIANDOCUMENT_H diff -Nru baloo-4.12.95/src/pim/agent/agent.cpp baloo-4.12.97/src/pim/agent/agent.cpp --- baloo-4.12.95/src/pim/agent/agent.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/pim/agent/agent.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -371,6 +371,8 @@ const Akonadi::Collection& destinationCollection) { AbstractIndexer *indexer = indexerForItem(items.first()); + if (!indexer) + return; Q_FOREACH (const Akonadi::Item& item, items) { try { indexer->move(item.id(), sourceCollection.id(), destinationCollection.id()); diff -Nru baloo-4.12.95/src/pim/agent/akonadibalooindexingagent.desktop baloo-4.12.97/src/pim/agent/akonadibalooindexingagent.desktop --- baloo-4.12.95/src/pim/agent/akonadibalooindexingagent.desktop 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/pim/agent/akonadibalooindexingagent.desktop 2014-03-26 17:07:59.000000000 +0000 @@ -2,6 +2,7 @@ Name=Akonadi Baloo Indexing Agent Name[bs]=Akonadi Baloo agent za indeksiranje Name[ca]=Agent d'indexació Baloo de l'Akonadi +Name[ca@valencia]=Agent d'indexació Baloo de l'Akonadi Name[da]=Baloo indekseringsagent til Akonadi Name[de]=Akonadi-Indizierungsagent für Baloo Name[el]=Πράκτορας δεικτοδότησης Baloo Akonadi @@ -25,6 +26,7 @@ Name[sr@ijekavianlatin]=Balooov agent indeksiranja nad Akonadijem Name[sr@latin]=Balooov agent indeksiranja nad Akonadijem Name[sv]=Akonadi Baloo-indexeringsmodul +Name[tr]=Akonadi Baloo Dizinleme Aracı Name[uk]=Агент індексування Baloo для Akonadi Name[x-test]=xxAkonadi Baloo Indexing Agentxx Name[zh_CN]=Akonadi Baloo 索引器 diff -Nru baloo-4.12.95/src/pim/agent/akonotesindexer.cpp baloo-4.12.97/src/pim/agent/akonotesindexer.cpp --- baloo-4.12.95/src/pim/agent/akonotesindexer.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/pim/agent/akonotesindexer.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -26,7 +26,7 @@ AkonotesIndexer::AkonotesIndexer(const QString& path) - : AbstractIndexer() + : AbstractIndexer(), m_termGen( 0 ) { m_db = new Xapian::WritableDatabase(path.toStdString(), Xapian::DB_CREATE_OR_OPEN); } diff -Nru baloo-4.12.95/src/pim/agent/emailindexer.cpp baloo-4.12.97/src/pim/agent/emailindexer.cpp --- baloo-4.12.95/src/pim/agent/emailindexer.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/pim/agent/emailindexer.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -28,7 +28,7 @@ #include EmailIndexer::EmailIndexer(const QString& path, const QString& contactDbPath): - AbstractIndexer(), m_termGen( 0 ) + AbstractIndexer(), m_doc( 0 ), m_termGen( 0 ) { m_db = new Xapian::WritableDatabase(path.toStdString(), Xapian::DB_CREATE_OR_OPEN); m_contactDb = new Xapian::WritableDatabase(contactDbPath.toStdString(), Xapian::DB_CREATE_OR_OPEN); diff -Nru baloo-4.12.95/src/pim/akonadiplugin/akonadibaloosearchplugin.desktop baloo-4.12.97/src/pim/akonadiplugin/akonadibaloosearchplugin.desktop --- baloo-4.12.95/src/pim/akonadiplugin/akonadibaloosearchplugin.desktop 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/pim/akonadiplugin/akonadibaloosearchplugin.desktop 2014-03-26 17:07:59.000000000 +0000 @@ -2,6 +2,7 @@ Type=AkonadiSearchPlugin Name=Akonadi Baloo Search Plugin Name[ca]=Connector de cerca Baloo de l'Akonadi +Name[ca@valencia]=Connector de cerca Baloo de l'Akonadi Name[da]=Akonadi-søgeplugin til Baloo Name[de]=Akonadi-Suchmodul für Baloo Name[el]=Πράκτορας αναζήτησης Baloo Akonadi @@ -25,6 +26,7 @@ Name[sr@ijekavianlatin]=Balooov priključak pretrage nad Akonadijem Name[sr@latin]=Balooov priključak pretrage nad Akonadijem Name[sv]=Akonadi Baloo-sökinsticksprogram +Name[tr]=Akonadi Baloo Arama Eklentisi Name[uk]=Агент пошуку Baloo для Akonadi Name[x-test]=xxAkonadi Baloo Search Pluginxx Name[zh_CN]=Akonadi Baloo 搜索插件 diff -Nru baloo-4.12.95/src/pim/lib/contactcompleter.cpp baloo-4.12.97/src/pim/lib/contactcompleter.cpp --- baloo-4.12.95/src/pim/lib/contactcompleter.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/pim/lib/contactcompleter.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -38,7 +38,14 @@ QStringList ContactCompleter::complete() { const QString dir = KGlobal::dirs()->localxdgdatadir() + "baloo/emailContacts/"; - Xapian::Database db(dir.toUtf8().constData()); + Xapian::Database db; + try { + db = Xapian::Database(dir.toUtf8().constData()); + } + catch (const Xapian::DatabaseError& e) { + kWarning() << QString::fromStdString(e.get_type()) << QString::fromStdString(e.get_description()); + return QStringList(); + } Xapian::QueryParser parser; parser.set_database(db); diff -Nru baloo-4.12.95/src/pim/search/email/emailsearchstore.cpp baloo-4.12.97/src/pim/search/email/emailsearchstore.cpp --- baloo-4.12.95/src/pim/search/email/emailsearchstore.cpp 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/pim/search/email/emailsearchstore.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -100,7 +100,14 @@ QString EmailSearchStore::text(int queryId) { - std::string data = docForQuery(queryId).get_data(); + Xapian::Document doc = docForQuery(queryId); + std::string data; + try { + data = doc.get_data(); + } + catch (const Xapian::DatabaseError&) { + // Nothing to do, move along + } QString subject = QString::fromUtf8(data.c_str(), data.length()); if (subject.isEmpty()) diff -Nru baloo-4.12.95/src/runner/plasma-runner-baloosearch.desktop baloo-4.12.97/src/runner/plasma-runner-baloosearch.desktop --- baloo-4.12.95/src/runner/plasma-runner-baloosearch.desktop 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/runner/plasma-runner-baloosearch.desktop 2014-03-26 17:07:59.000000000 +0000 @@ -2,6 +2,7 @@ Name=Desktop Search Name[bs]=Pretraga površi Name[ca]=Cerca a l'escriptori +Name[ca@valencia]=Cerca a l'escriptori Name[cs]=Vyhledávací služby Name[da]=Skrivebordssøgning Name[de]=Desktop-Suche @@ -27,6 +28,7 @@ Name[sr@ijekavianlatin]=Pretraga površi Name[sr@latin]=Pretraga površi Name[sv]=Skrivbordssökning +Name[tr]=Masaüstü Araması Name[uk]=Стільничний пошук Name[x-test]=xxDesktop Searchxx Name[zh_CN]=桌面搜索 @@ -34,6 +36,7 @@ Comment=Runner which searches through files, emails and contacts Comment[bs]=Trkač koji traži kroz datoteke, elektronsku poštu i kontakte Comment[ca]=Executor que cerca per fitxers, correus electrònics i contactes +Comment[ca@valencia]=Executor que cerca per fitxers, correus electrònics i contactes Comment[da]=Runner som gennemsøger filer, e-mails og kontakter Comment[de]=Runner, der Dateien, E-Mails und Kontakte durchsucht Comment[el]=Αναζήτηση για αρχεία, μηνύματα ηλ. ταχυδρομείου και επαφές @@ -57,6 +60,7 @@ Comment[sr@ijekavianlatin]=Izvođač koji traži kroz fajlove, e‑poštu i kontakte Comment[sr@latin]=Izvođač koji traži kroz fajlove, e‑poštu i kontakte Comment[sv]=Körprogram som söker igenom filer, e-post och kontakter +Comment[tr]=Dosya, e-posta ve kişilerde arama yapabilen çalıştırıcı Comment[uk]=Модуль, який виконує пошук у файлах, повідомлення електронної пошти і записах контактів Comment[x-test]=xxRunner which searches through files, emails and contactsxx Comment[zh_CN]=在文件、电子邮件和联系人中进行搜索的 Runner diff -Nru baloo-4.12.95/src/xapian/CMakeLists.txt baloo-4.12.97/src/xapian/CMakeLists.txt --- baloo-4.12.95/src/xapian/CMakeLists.txt 2014-03-19 15:13:57.000000000 +0000 +++ baloo-4.12.97/src/xapian/CMakeLists.txt 2014-03-26 17:07:59.000000000 +0000 @@ -2,6 +2,8 @@ set(XAPIAN_SRCS xapiansearchstore.cpp + xapiandocument.cpp + xapiandatabase.cpp ) kde4_add_library(balooxapian SHARED ${XAPIAN_SRCS}) diff -Nru baloo-4.12.95/src/xapian/xapiandatabase.cpp baloo-4.12.97/src/xapian/xapiandatabase.cpp --- baloo-4.12.95/src/xapian/xapiandatabase.cpp 1970-01-01 00:00:00.000000000 +0000 +++ baloo-4.12.97/src/xapian/xapiandatabase.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -0,0 +1,133 @@ +/* + * + * Copyright (C) 2014 Vishesh Handa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "xapiandatabase.h" +#include "xapiandocument.h" + +#include +#include +#include + +#include + +using namespace Baloo; + +XapianDatabase::XapianDatabase(const QString& path) + : QObject() + , m_db(0) +{ + QDir().mkpath(path); + m_path = path.toUtf8().constData(); + + try { + Xapian::WritableDatabase(m_path, Xapian::DB_CREATE_OR_OPEN); + m_db = new Xapian::Database(m_path); + } + catch (const Xapian::DatabaseError& err) { + kError() << "Serious Error: " << err.get_error_string(); + kError() << err.get_msg().c_str() << err.get_context().c_str() << err.get_description().c_str(); + } + + // Possible errors - DatabaseLock error + // Corrupt and InvalidID error +} + +void XapianDatabase::replaceDocument(uint id, const Xapian::Document& doc) +{ + m_docsToAdd << qMakePair(id, doc); +} + +void XapianDatabase::deleteDocument(uint id) +{ + m_docsToRemove << id; +} + +void XapianDatabase::commit() +{ + if (m_docsToAdd.isEmpty() && m_docsToRemove.isEmpty()) { + Q_EMIT committed(); + return; + } + + try { + Xapian::WritableDatabase wdb(m_path, Xapian::DB_CREATE_OR_OPEN); + + kDebug() << "Adding:" << m_docsToAdd.size() << "docs"; + Q_FOREACH (const DocIdPair& doc, m_docsToAdd) { + wdb.replace_document(doc.first, doc.second); + } + + kDebug() << "Removing:" << m_docsToRemove.size() << "docs"; + Q_FOREACH (Xapian::docid id, m_docsToRemove) { + try { + wdb.delete_document(id); + } + catch (const Xapian::DocNotFoundError&) { + } + } + + wdb.commit(); + m_db->reopen(); + kDebug() << "Xapian Committed"; + + m_docsToAdd.clear(); + m_docsToRemove.clear(); + + malloc_trim(0); + + Q_EMIT committed(); + } + catch (const Xapian::DatabaseLockError& err) { + kError() << err.get_msg().c_str(); + retryCommit(); + } + catch (const Xapian::DatabaseModifiedError& err) { + kError() << err.get_msg().c_str(); + kError() << "Commit failed, retrying in another 200 msecs"; + retryCommit(); + } + catch (const Xapian::DatabaseError& err) { + kError() << err.get_msg().c_str(); + retryCommit(); + } +} + +void XapianDatabase::retryCommit() +{ + QTimer::singleShot(200, this, SLOT(commit())); +} + +XapianDocument XapianDatabase::document(uint id) +{ + try { + Xapian::Document xdoc = m_db->get_document(id); + return XapianDocument(xdoc); + } + catch (const Xapian::DatabaseModifiedError&) { + m_db->reopen(); + return document(id); + } + catch (const Xapian::Error&) { + return XapianDocument(); + } +} + + + diff -Nru baloo-4.12.95/src/xapian/xapiandatabase.h baloo-4.12.97/src/xapian/xapiandatabase.h --- baloo-4.12.95/src/xapian/xapiandatabase.h 1970-01-01 00:00:00.000000000 +0000 +++ baloo-4.12.97/src/xapian/xapiandatabase.h 2014-03-26 17:07:59.000000000 +0000 @@ -0,0 +1,81 @@ +/* + * + * Copyright (C) 2014 Vishesh Handa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef BALOO_XAPIANDATABASE_H +#define BALOO_XAPIANDATABASE_H + +#include +#include "xapian_export.h" + +#include +#include +#include +#include + +namespace Baloo { + +class XapianDocument; + +class BALOO_XAPIAN_EXPORT XapianDatabase : public QObject +{ + Q_OBJECT +public: + XapianDatabase(const QString& path); + + void replaceDocument(uint id, const Xapian::Document& doc); + void deleteDocument(uint id); + + /** + * Commit all the pending changes. This may not commit + * at this instance as the db might be locked by another process + * It emits the committed signal on completion + */ + void commit(); + + XapianDocument document(uint id); + + /** + * A pointer to the actual db. Only use this when doing queries + */ + Xapian::Database* db() { + if (m_db) { + m_db->reopen(); + } + return m_db; + } + +Q_SIGNALS: + void committed(); + +private: + Xapian::Database* m_db; + + typedef QPair DocIdPair; + QVector m_docsToAdd; + QVector m_docsToRemove; + + std::string m_path; + + void retryCommit(); +}; + +} + +#endif // BALOO_XAPIANDATABASE_H diff -Nru baloo-4.12.95/src/xapian/xapiandocument.cpp baloo-4.12.97/src/xapian/xapiandocument.cpp --- baloo-4.12.95/src/xapian/xapiandocument.cpp 1970-01-01 00:00:00.000000000 +0000 +++ baloo-4.12.97/src/xapian/xapiandocument.cpp 2014-03-26 17:07:59.000000000 +0000 @@ -0,0 +1,122 @@ +/* + * + * Copyright (C) 2014 Vishesh Handa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "xapiandocument.h" + +using namespace Baloo; + +XapianDocument::XapianDocument() +{ + m_termGen.set_document(m_doc); +} + +XapianDocument::XapianDocument(const Xapian::Document& doc) + : m_doc(doc) +{ + m_termGen.set_document(m_doc); +} + +void XapianDocument::addTerm(const QString& term, const QString& prefix) +{ + QByteArray arr = prefix.toUtf8(); + arr += term.toUtf8(); + + m_doc.add_term(arr.constData()); +} + +void XapianDocument::addBoolTerm(int term, const QString& prefix) +{ + addBoolTerm(QString::number(term), prefix); +} + +void XapianDocument::addBoolTerm(const QString& term, const QString& prefix) +{ + QByteArray arr = prefix.toUtf8(); + arr += term.toUtf8(); + + m_doc.add_boolean_term(arr.constData()); +} + +void XapianDocument::indexText(const QString& text, const QString& prefix, int wdfInc) +{ + const QByteArray tarr = text.toUtf8(); + const QByteArray par = prefix.toUtf8(); + m_termGen.index_text(tarr.constData(), wdfInc, par.constData()); +} + +void XapianDocument::indexText(const QString& text, int wdfInc) +{ + indexText(text, QString(), wdfInc); +} + +Xapian::Document XapianDocument::doc() +{ + return m_doc; +} + +void XapianDocument::addValue(int pos, const QString& value) +{ + m_doc.add_value(pos, value.toUtf8().constData()); +} + +QString XapianDocument::fetchTermStartsWith(const QByteArray& term) +{ + try { + Xapian::TermIterator it = m_doc.termlist_begin(); + it.skip_to(term.constData()); + + if (it == m_doc.termlist_end()) { + return QString(); + } + std::string str = *it; + return QString::fromUtf8(str.c_str(), str.length()); + } + catch (const Xapian::Error&) { + return QString(); + } +} + +void XapianDocument::removeTermStartsWith(const QByteArray& prefix) +{ + Xapian::TermIterator it = m_doc.termlist_begin(); + it.skip_to(prefix.constData()); + while (it != m_doc.termlist_end()){ + const std::string t = *it; + const QByteArray term = QByteArray::fromRawData(t.c_str(), t.size()); + if (!term.startsWith(prefix)) { + break; + } + + // The term should not just be the prefix + if (term.size() <= prefix.size()) { + break; + } + + // The term should not contain any more upper case letters + if (isupper(term.at(prefix.size()))) { + it++; + continue; + } + + it++; + m_doc.remove_term(t); + } +} + diff -Nru baloo-4.12.95/src/xapian/xapiandocument.h baloo-4.12.97/src/xapian/xapiandocument.h --- baloo-4.12.95/src/xapian/xapiandocument.h 1970-01-01 00:00:00.000000000 +0000 +++ baloo-4.12.97/src/xapian/xapiandocument.h 2014-03-26 17:07:59.000000000 +0000 @@ -0,0 +1,61 @@ +/* + * + * Copyright (C) 2014 Vishesh Handa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef BALOO_XAPIANDOCUMENT_H +#define BALOO_XAPIANDOCUMENT_H + +#include +#include + +#include "xapian_export.h" + +namespace Baloo { + +/** + * This class is just a light wrapper over Xapian::Document + * which provides nice Qt apis. + */ +class BALOO_XAPIAN_EXPORT XapianDocument +{ +public: + XapianDocument(); + XapianDocument(const Xapian::Document& doc); + + void addTerm(const QString& term, const QString& prefix); + void addBoolTerm(const QString& term, const QString& prefix = QString()); + void addBoolTerm(int term, const QString& prefix); + + void indexText(const QString& text, int wdfInc = 1); + void indexText(const QString& text, const QString& prefix, int wdfInc = 1); + + void addValue(int pos, const QString& value); + + Xapian::Document doc(); + + QString fetchTermStartsWith(const QByteArray& term); + + void removeTermStartsWith(const QByteArray& prefix); +private: + Xapian::Document m_doc; + Xapian::TermGenerator m_termGen; +}; +} + +#endif // BALOO_XAPIANDOCUMENT_H