Page MenuHomePhorge

No OneTemporary

Authored By
Unknown
Size
45 KB
Referenced Files
None
Subscribers
None
diff --git a/src/file/CMakeLists.txt b/src/file/CMakeLists.txt
index cef8fc46..0ef5fe6e 100644
--- a/src/file/CMakeLists.txt
+++ b/src/file/CMakeLists.txt
@@ -1,100 +1,98 @@
add_definitions(-DTRANSLATION_DOMAIN=\"baloo_file\")
kde_enable_exceptions()
-add_subdirectory(search)
-
if (NOT BALOO_LIBRARIES_ONLY)
set(file_static_lib_SRCS
# File Indexer
fileindexer.cpp
fileindexerconfig.cpp
indexscheduler.cpp
indexingqueue.cpp
basicindexingqueue.cpp
fileindexingqueue.cpp
commitqueue.cpp
basicindexingjob.cpp
fileindexingjob.cpp
eventmonitor.cpp
util.cpp
# Common
database.cpp
priority.cpp
regexpcache.cpp
fileexcludefilters.cpp
../lib/filemapping.cpp
storagedevices.cpp
# File Watcher
filewatch.cpp
pendingfilequeue.cpp
metadatamover.cpp
pendingfile.cpp
)
set(BUILD_KINOTIFY False)
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
set(BUILD_KINOTIFY True)
set(file_static_lib_SRCS
${file_static_lib_SRCS}
kinotify.cpp
)
add_definitions(-DBUILD_KINOTIFY)
endif()
add_library(baloofilecommon STATIC ${file_static_lib_SRCS})
target_link_libraries(baloofilecommon
Qt5::Sql
Qt5::DBus
KF5::KIOWidgets
KF5::IdleTime
KF5::I18n
KF5::Solid
KF5::Auth
KF5::FileMetaData
KF5::Crash
KF5::ConfigCore
${XAPIAN_LIBRARIES}
KF5::BalooCore
KF5::BalooXapian
KF5::KDELibs4Support # For Solid
)
set(file_SRCS
main.cpp
)
add_executable(baloo_file ${file_SRCS})
target_compile_definitions(baloo_file PRIVATE -DPROJECT_VERSION="${PROJECT_VERSION}")
target_link_libraries(baloo_file
Qt5::Sql
Qt5::DBus
KF5::KIOWidgets
KF5::IdleTime
KF5::I18n
KF5::Solid
KF5::Auth
KF5::FileMetaData
KF5::Crash
KF5::ConfigCore
${XAPIAN_LIBRARIES}
KF5::BalooCore
KF5::BalooXapian
KF5::KDELibs4Support # For Solid
baloofilecommon
)
install(TARGETS baloo_file ${INSTALL_TARGETS_DEFAULT_ARGS})
install(FILES baloo_file.desktop DESTINATION ${AUTOSTART_INSTALL_DIR})
install(FILES org.kde.baloo.file.indexer.xml DESTINATION ${DBUS_INTERFACES_INSTALL_DIR})
add_subdirectory(autotest)
add_subdirectory(tests)
add_subdirectory(extractor)
add_subdirectory(kcm)
add_subdirectory(inotify)
add_subdirectory(cleaner)
endif()
diff --git a/src/file/search/CMakeLists.txt b/src/file/search/CMakeLists.txt
deleted file mode 100644
index 049cce78..00000000
--- a/src/file/search/CMakeLists.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-add_library(filesearchstore MODULE
- wildcardpostingsource.cpp
- pathfilterpostingsource.cpp
- filesearchstore.cpp)
-
-target_link_libraries(filesearchstore
- Qt5::Core
- Qt5::Sql
- ${XAPIAN_LIBRARIES}
- KF5::FileMetaData
- KF5::BalooCore
- KF5::BalooXapian
-)
-
-install(TARGETS filesearchstore DESTINATION ${PLUGIN_INSTALL_DIR}/kf5/baloo)
-
-add_subdirectory(autotest)
diff --git a/src/file/search/autotest/CMakeLists.txt b/src/file/search/autotest/CMakeLists.txt
deleted file mode 100644
index 5cbcd0af..00000000
--- a/src/file/search/autotest/CMakeLists.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-include(ECMAddTests)
-
-include_directories(
- ${CMAKE_CURRENT_SOURCE_DIR}/..
-)
-
-set(filesearchstore_SRCS filesearchstoretest.cpp
- ../filesearchstore.cpp
- ../pathfilterpostingsource.cpp
- ../wildcardpostingsource.cpp
- ../../../lib/filemapping.cpp
- ../../database.cpp
-)
-
-ecm_add_test(${filesearchstore_SRCS}
- TEST_NAME "filesearchstoretest"
- LINK_LIBRARIES
- Qt5::Core
- Qt5::Sql
- Qt5::Test
- ${XAPIAN_LIBRARIES}
- KF5::FileMetaData
- KF5::BalooCore
- KF5::BalooXapian
-)
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index 3110b313..d9b9c507 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -1,88 +1,94 @@
kde_enable_exceptions()
set(CORE_SRCS
searchstore.cpp
term.cpp
query.cpp
queryrunnable.cpp
resultiterator.cpp
result.cpp
advancedqueryparser.cpp
file.cpp
filefetchjob.cpp
filemapping.cpp
filemonitor.cpp
taglistjob.cpp
db.cpp
indexerconfig.cpp
../file/fileindexerconfig.cpp
../file/storagedevices.cpp
../file/regexpcache.cpp
../file/fileexcludefilters.cpp
+
+ # Search Store
+ xapiansearchstore.cpp
+ wildcardpostingsource.cpp
+ pathfilterpostingsource.cpp
+ filesearchstore.cpp
)
add_library(KF5BalooCore ${CORE_SRCS})
add_library(KF5::BalooCore ALIAS KF5BalooCore)
target_link_libraries(KF5BalooCore
PUBLIC
Qt5::Core
KF5::CoreAddons
KF5::FileMetaData
PRIVATE
KF5::ConfigCore
Qt5::DBus
Qt5::Sql
KF5::Solid
- ${XAPIAN_LIBRARIES}
+ KF5::BalooXapian
)
set_target_properties(KF5BalooCore PROPERTIES
VERSION ${BALOO_VERSION_STRING}
SOVERSION ${BALOO_SOVERSION}
EXPORT_NAME BalooCore
)
target_include_directories(KF5BalooCore INTERFACE "$<INSTALL_INTERFACE:${KF5_INCLUDE_INSTALL_DIR}/Baloo>")
generate_export_header(KF5BalooCore BASE_NAME BALOO_CORE EXPORT_FILE_NAME core_export.h)
ecm_generate_headers(KF5BalooCore_CamelCase_HEADERS
HEADER_NAMES
Term
Query
QueryRunnable
Result
ResultIterator
SearchStore
File
FileFetchJob
FileMonitor
TagListJob
IndexerConfig
PREFIX baloo
REQUIRED_HEADERS KF5BalooCore_HEADERS
)
install(TARGETS KF5BalooCore EXPORT KF5BalooTargets ${KF5_INSTALL_TARGETS_DEFAULT_ARGS})
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/core_export.h
${KF5BalooCore_HEADERS}
DESTINATION ${KF5_INCLUDE_INSTALL_DIR}/Baloo/baloo
COMPONENT Devel
)
install(FILES
${KF5BalooCore_CamelCase_HEADERS}
DESTINATION ${KF5_INCLUDE_INSTALL_DIR}/Baloo/Baloo
COMPONENT Devel
)
add_subdirectory(tests)
add_subdirectory(autotests)
diff --git a/src/lib/autotests/CMakeLists.txt b/src/lib/autotests/CMakeLists.txt
index c867ab37..876a3c03 100644
--- a/src/lib/autotests/CMakeLists.txt
+++ b/src/lib/autotests/CMakeLists.txt
@@ -1,54 +1,78 @@
#
# Query Serialization
#
set(querySerialization_SRC queryserializationtest.cpp)
ecm_add_test(${querySerialization_SRC}
TEST_NAME "queryserializationtest"
LINK_LIBRARIES Qt5::Test KF5::BalooCore
)
#
# Advanced Query Parser
#
ecm_add_test(advancedqueryparsertest.cpp
TEST_NAME "advancedqueryparsertest"
LINK_LIBRARIES Qt5::Test KF5::BalooCore
)
#
# Fetch Job
#
set(filefetchjobtest_SRC filefetchjobtest.cpp
db.cpp
../filefetchjob.cpp
../filemapping.cpp
../file.cpp)
ecm_add_test(${filefetchjobtest_SRC}
TEST_NAME "filefetchjobtest"
LINK_LIBRARIES
KF5::FileMetaData
KF5::CoreAddons
KF5::ConfigCore
KF5::Solid
Qt5::Test
Qt5::Sql
Qt5::DBus
${XAPIAN_LIBRARIES}
KF5::BalooCore
)
# Pass CMAKE_CURRENT_BINARY_DIR so tests can use it to create some of the
# temporary files they need (as XattrDetector blacklists /tmp by default).
set_target_properties(filefetchjobtest PROPERTIES COMPILE_FLAGS -DBUILDDIR="\\"${CMAKE_CURRENT_BINARY_DIR}/\\""\ -DBALOO_FILE_EXPORT=)
#
# TagList Job
#
ecm_add_test(taglistjobtest.cpp
TEST_NAME "taglistjobtest"
LINK_LIBRARIES
Qt5::Test
KF5::BalooCore
)
+
+#
+# Search Store
+#
+set(filesearchstore_SRCS filesearchstoretest.cpp
+ ../filesearchstore.cpp
+ ../pathfilterpostingsource.cpp
+ ../wildcardpostingsource.cpp
+ ../filemapping.cpp
+ ../xapiansearchstore.cpp
+ ../../file/database.cpp
+)
+
+ecm_add_test(${filesearchstore_SRCS}
+ TEST_NAME "filesearchstoretest"
+ LINK_LIBRARIES
+ Qt5::Core
+ Qt5::Sql
+ Qt5::Test
+ ${XAPIAN_LIBRARIES}
+ KF5::FileMetaData
+ KF5::BalooCore
+ KF5::BalooXapian
+)
diff --git a/src/file/search/autotest/filesearchstoretest.cpp b/src/lib/autotests/filesearchstoretest.cpp
similarity index 99%
rename from src/file/search/autotest/filesearchstoretest.cpp
rename to src/lib/autotests/filesearchstoretest.cpp
index ac816077..c61b9c95 100644
--- a/src/file/search/autotest/filesearchstoretest.cpp
+++ b/src/lib/autotests/filesearchstoretest.cpp
@@ -1,537 +1,537 @@
/*
* This file is part of the KDE Baloo Project
* Copyright (C) 2013 Vishesh Handa <me@vhanda.in>
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#include "filesearchstoretest.h"
#include "filesearchstore.h"
-#include "../../database.h"
+#include "../../file/database.h"
#include "filemapping.h"
#include "query.h"
#include "term.h"
#include <QDebug>
#include <QtTest>
#include <xapian.h>
#include <kfilemetadata/properties.h>
#include <kfilemetadata/propertyinfo.h>
using namespace Baloo;
FileSearchStoreTest::FileSearchStoreTest(QObject* parent)
: QObject(parent)
, m_tempDir(0)
, m_db(0)
, m_store(0)
{
}
void FileSearchStoreTest::init()
{
cleanupTestCase();
m_db = new Database(this);
m_tempDir = new QTemporaryDir();
m_db->setPath(m_tempDir->path());
m_db->init();
m_store = new FileSearchStore(this);
m_store->setDbPath(m_tempDir->path());
}
void FileSearchStoreTest::initTestCase()
{
}
void FileSearchStoreTest::cleanupTestCase()
{
delete m_store;
m_store = 0;
delete m_db;
m_db = 0;
delete m_tempDir;
m_tempDir = 0;
}
uint FileSearchStoreTest::insertUrl(const QString& url)
{
FileMapping file(url);
file.create(m_db->sqlDatabase());
return file.id();
}
void FileSearchStoreTest::insertType(int id, const QString& type)
{
Xapian::Document doc;
doc.add_term(("T" + type.toLower()).toUtf8().constData());
std::string dir = m_tempDir->path().toUtf8().constData();
QScopedPointer<Xapian::WritableDatabase> wdb(new Xapian::WritableDatabase(dir,
Xapian::DB_CREATE_OR_OPEN));
wdb->replace_document(id, doc);
wdb->commit();
m_db->xapianDatabase()->db()->reopen();
}
void FileSearchStoreTest::insertExactText(int id, const QString& text, const QString& prefix)
{
Xapian::Document doc;
try {
doc = m_db->xapianDatabase()->db()->get_document(id);
}
catch (...) {
}
doc.add_term((prefix + text).toUtf8().constData());
std::string dir = m_tempDir->path().toUtf8().constData();
QScopedPointer<Xapian::WritableDatabase> wdb(new Xapian::WritableDatabase(dir,
Xapian::DB_CREATE_OR_OPEN));
wdb->replace_document(id, doc);
wdb->commit();
m_db->xapianDatabase()->db()->reopen();
}
void FileSearchStoreTest::insertText(int id, const QString& text)
{
Xapian::Document doc;
Xapian::TermGenerator termGen;
termGen.set_document(doc);
termGen.index_text(text.toUtf8().constData());
std::string dir = m_tempDir->path().toUtf8().constData();
QScopedPointer<Xapian::WritableDatabase> wdb(new Xapian::WritableDatabase(dir,
Xapian::DB_CREATE_OR_OPEN));
wdb->replace_document(id, doc);
wdb->commit();
m_db->xapianDatabase()->db()->reopen();
}
void FileSearchStoreTest::insertRating(int id, int rating)
{
Xapian::Document doc;
QString str = QLatin1Char('R') + QString::number(rating);
doc.add_term(str.toUtf8().constData());
std::string dir = m_tempDir->path().toUtf8().constData();
QScopedPointer<Xapian::WritableDatabase> wdb(new Xapian::WritableDatabase(dir,
Xapian::DB_CREATE_OR_OPEN));
wdb->replace_document(id, doc);
wdb->commit();
m_db->xapianDatabase()->db()->reopen();
}
void FileSearchStoreTest::testSimpleSearchString()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertText(id1, QLatin1String("This is sample text"));
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertText(id2, QLatin1String("sample sample more sample text"));
Query q;
q.addType(QLatin1String("File"));
q.setSearchString(QLatin1String("Sample"));
int qid = m_store->exec(q);
QCOMPARE(qid, 1);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", id2));
QCOMPARE(m_store->url(qid), QUrl::fromLocalFile(url2));
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", id1));
QCOMPARE(m_store->url(qid), QUrl::fromLocalFile(url1));
QVERIFY(!m_store->next(qid));
QVERIFY(m_store->id(qid).isEmpty());
QVERIFY(m_store->url(qid).isEmpty());
m_store->close(qid);
}
void FileSearchStoreTest::testPropertyValueEqual()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertText(id1, QLatin1String("This is sample text"));
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertText(id2, QLatin1String("sample sample more sample but not text"));
Query q;
q.setTerm(Term(QString(), "Sample text", Baloo::Term::Equal));
q.addType(QLatin1String("File"));
int qid = m_store->exec(q);
QCOMPARE(qid, 1);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", id1));
QCOMPARE(m_store->url(qid), QUrl::fromLocalFile(url1));
QVERIFY(!m_store->next(qid));
QVERIFY(m_store->id(qid).isEmpty());
QVERIFY(m_store->url(qid).isEmpty());
m_store->close(qid);
}
void FileSearchStoreTest::testIncludeDir()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertText(id1, QLatin1String("This is sample text"));
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertText(id2, QLatin1String("sample sample more sample text"));
QString url3(QLatin1String("/home/garden/b"));
uint id3 = insertUrl(url3);
insertText(id3, QLatin1String("The grass is green in the garden."));
QString url4(QLatin1String("/home/tt/b"));
uint id4 = insertUrl(url4);
insertText(id4, QLatin1String("Let's see if this works."));
QString url5(QLatin1String("/home/t/c"));
uint id5 = insertUrl(url5);
insertText(id5, QLatin1String("sample sample more sample text"));
Query q;
q.addType(QLatin1String("File"));
q.addCustomOption(QLatin1String("includeFolder"), QVariant(QLatin1String("/home/t")));
int qid = m_store->exec(q);
QCOMPARE(qid, 1);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", id1));
QCOMPARE(m_store->url(qid), QUrl::fromLocalFile(url1));
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", id2));
QCOMPARE(m_store->url(qid), QUrl::fromLocalFile(url2));
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", id5));
QCOMPARE(m_store->url(qid), QUrl::fromLocalFile(url5));
QVERIFY(!m_store->next(qid));
QVERIFY(m_store->id(qid).isEmpty());
QVERIFY(m_store->url(qid).isEmpty());
m_store->close(qid);
}
void FileSearchStoreTest::testRatings()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertRating(id1, 2);
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertRating(id2, 4);
QString url3(QLatin1String("/home/garden/b"));
uint id3 = insertUrl(url3);
insertRating(id3, 6);
QString url4(QLatin1String("/home/tt/b"));
uint id4 = insertUrl(url4);
insertRating(id4, 10);
QString url5(QLatin1String("/home/tt/c"));
uint id5 = insertUrl(url5);
insertText(id5, QLatin1String("Test text"));
//
// Less than 5
//
Query q;
q.addType(QLatin1String("File"));
q.setTerm(Term(QLatin1String("rating"), 5, Term::Less));
int qid1 = m_store->exec(q);
QCOMPARE(qid1, 1);
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id1));
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id2));
QVERIFY(!m_store->next(qid1));
//
// Greater than 6
//
q.setTerm(Term(QLatin1String("rating"), 6, Term::Greater));
int qid2 = m_store->exec(q);
QCOMPARE(qid2, 2);
QVERIFY(m_store->next(qid2));
QCOMPARE(m_store->id(qid2), serialize("file", id4));
QVERIFY(!m_store->next(qid2));
}
void FileSearchStoreTest::testEmptySearchString()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertText(id1, QLatin1String("File A"));
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertText(id2, QLatin1String("File B"));
QString url3(QLatin1String("/home/garden/b"));
uint id3 = insertUrl(url3);
insertText(id3, QLatin1String("Garden B"));
QString url4(QLatin1String("/home/tt/b"));
uint id4 = insertUrl(url4);
insertText(id4, QLatin1String("TT B"));
QString url5(QLatin1String("/home/tt/c"));
uint id5 = insertUrl(url5);
insertText(id5, QLatin1String("TT C"));
Query q;
q.addType(QLatin1String("File"));
int qid1 = m_store->exec(q);
QCOMPARE(qid1, 1);
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id1));
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id2));
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id3));
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id4));
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id5));
QVERIFY(!m_store->next(qid1));
}
void FileSearchStoreTest::testAllVideos()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertType(id1, QLatin1String("Video"));
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertType(id2, QLatin1String("Image"));
QString url3(QLatin1String("/home/garden/b"));
uint id3 = insertUrl(url3);
insertType(id3, QLatin1String("Video"));
Query q;
q.addType(QLatin1String("Video"));
int qid1 = m_store->exec(q);
QCOMPARE(qid1, 1);
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id1));
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id3));
QVERIFY(!m_store->next(qid1));
}
void FileSearchStoreTest::testFileNameSearch()
{
QString url1(QLatin1String("/home/t/a"));
uint id1 = insertUrl(url1);
insertExactText(id1, QLatin1String("flowering"), "F");
insertExactText(id1, QLatin1String("dork"), "F");
insertExactText(id1, QLatin1String("dork"), "A");
insertExactText(id1, QLatin1String("dork"), "G");
QString url2(QLatin1String("/home/t/b"));
uint id2 = insertUrl(url2);
insertExactText(id2, QLatin1String("powering"), "F");
insertExactText(id2, QLatin1String("fire"), "F");
insertExactText(id2, QLatin1String("dork"), "A");
insertExactText(id2, QLatin1String("dork"), "G");
QString url3(QLatin1String("/home/garden/b"));
uint id3 = insertUrl(url3);
insertExactText(id3, QLatin1String("does"), "F");
insertExactText(id3, QLatin1String("not"), "F");
insertExactText(id3, QLatin1String("dork"), "A");
insertExactText(id3, QLatin1String("dork"), "G");
Query q;
q.addType(QLatin1String("File"));
q.setTerm(Term("filename", "dork"));
int qid1 = m_store->exec(q);
QCOMPARE(qid1, 1);
QVERIFY(m_store->next(qid1));
QCOMPARE(m_store->id(qid1), serialize("file", id1));
QVERIFY(!m_store->next(qid1));
q.setTerm(Term("filename", "do*"));
int qid2 = m_store->exec(q);
QCOMPARE(qid2, 2);
QVERIFY(m_store->next(qid2));
QCOMPARE(m_store->id(qid2), serialize("file", id1));
QVERIFY(m_store->next(qid2));
QCOMPARE(m_store->id(qid2), serialize("file", id3));
QVERIFY(!m_store->next(qid2));
q.setTerm(Term("filename", "*ing"));
int qid3 = m_store->exec(q);
QCOMPARE(qid3, 3);
QVERIFY(m_store->next(qid3));
QCOMPARE(m_store->id(qid3), serialize("file", id1));
QVERIFY(m_store->next(qid3));
QCOMPARE(m_store->id(qid3), serialize("file", id2));
QVERIFY(!m_store->next(qid3));
// Exact match
q.setTerm(Term("filename", "dork", Term::Equal));
int qid4 = m_store->exec(q);
QCOMPARE(qid4, 4);
QVERIFY(m_store->next(qid4));
QCOMPARE(m_store->id(qid4), serialize("file", id1));
QVERIFY(!m_store->next(qid4));
}
void FileSearchStoreTest::testSortingNone()
{
insertText(1, QLatin1String("Power A"));
insertText(2, QLatin1String("Power Power B"));
Query q;
q.addType(QLatin1String("File"));
q.setSearchString("Power");
int qid;
// Auto sort - Based on frequency
qid = m_store->exec(q);
QCOMPARE(qid, 1);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 2));
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 1));
QVERIFY(!m_store->next(qid));
// no sort
q.setSortingOption(Query::SortNone);
qid = m_store->exec(q);
QCOMPARE(qid, 2);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 1));
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 2));
QVERIFY(!m_store->next(qid));
}
void FileSearchStoreTest::testInvalidProperties()
{
Query q;
q.addType(QLatin1String("File"));
q.setTerm(Term("NoNExistingProperty", QVariant(1)));
int qid = m_store->exec(q);
QCOMPARE(qid, 0);
QVERIFY(!m_store->next(qid));
}
void FileSearchStoreTest::testModifiedProperty()
{
QDateTime dt(QDate(2013, 12, 02), QTime(12, 2, 2));
insertExactText(1, dt.toString(Qt::ISODate), "DT_M");
insertExactText(2, QDateTime::currentDateTime().toString(Qt::ISODate), "DT_M");
Query q;
q.addType(QLatin1String("File"));
q.setTerm(Term(("modified"), dt.date(), Term::Equal));
int qid = m_store->exec(q);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 1));
QVERIFY(!m_store->next(qid));
q.setTerm(Term(("modified"), dt, Term::Equal));
qid = m_store->exec(q);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 1));
QVERIFY(!m_store->next(qid));
}
void FileSearchStoreTest::testDateTimeProperty()
{
KFileMetaData::PropertyInfo propInfo(KFileMetaData::Property::CreationDate);
QString prefix = "X" + QString::number((int)propInfo.property());
QDateTime dt(QDate(2013, 12, 02), QTime(12, 2, 2));
insertExactText(1, dt.toString(Qt::ISODate), prefix);
insertExactText(2, QDateTime::currentDateTime().toString(Qt::ISODate), prefix);
Query q;
q.addType(QLatin1String("File"));
q.setTerm(Term(propInfo.name(), dt.date(), Term::Equal));
int qid = m_store->exec(q);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 1));
QVERIFY(!m_store->next(qid));
q.setTerm(Term((propInfo.name()), dt, Term::Equal));
qid = m_store->exec(q);
QVERIFY(m_store->next(qid));
QCOMPARE(m_store->id(qid), serialize("file", 1));
QVERIFY(!m_store->next(qid));
}
QTEST_MAIN(Baloo::FileSearchStoreTest)
diff --git a/src/file/search/autotest/filesearchstoretest.h b/src/lib/autotests/filesearchstoretest.h
similarity index 100%
rename from src/file/search/autotest/filesearchstoretest.h
rename to src/lib/autotests/filesearchstoretest.h
diff --git a/src/file/search/filesearchstore.cpp b/src/lib/filesearchstore.cpp
similarity index 100%
rename from src/file/search/filesearchstore.cpp
rename to src/lib/filesearchstore.cpp
diff --git a/src/file/search/filesearchstore.h b/src/lib/filesearchstore.h
similarity index 100%
rename from src/file/search/filesearchstore.h
rename to src/lib/filesearchstore.h
diff --git a/src/file/search/pathfilterpostingsource.cpp b/src/lib/pathfilterpostingsource.cpp
similarity index 100%
rename from src/file/search/pathfilterpostingsource.cpp
rename to src/lib/pathfilterpostingsource.cpp
diff --git a/src/file/search/pathfilterpostingsource.h b/src/lib/pathfilterpostingsource.h
similarity index 100%
rename from src/file/search/pathfilterpostingsource.h
rename to src/lib/pathfilterpostingsource.h
diff --git a/src/lib/query.cpp b/src/lib/query.cpp
index a09b47c5..25438e7a 100644
--- a/src/lib/query.cpp
+++ b/src/lib/query.cpp
@@ -1,400 +1,400 @@
/*
* This file is part of the KDE Baloo Project
* Copyright (C) 2013 Vishesh Handa <me@vhanda.in>
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#include "query.h"
#include "term.h"
-#include "searchstore.h"
+#include "filesearchstore.h"
#include <QString>
#include <QStringList>
#include <QSharedPointer>
#include <QList>
#include <QUrlQuery>
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
using namespace Baloo;
const int defaultLimit = 100000;
class Baloo::Query::Private {
public:
Private() {
m_limit = defaultLimit;
m_offset = 0;
m_yearFilter = -1;
m_monthFilter = -1;
m_dayFilter = -1;
m_sortingOption = SortAuto;
}
Term m_term;
QStringList m_types;
QString m_searchString;
uint m_limit;
uint m_offset;
int m_yearFilter;
int m_monthFilter;
int m_dayFilter;
SortingOption m_sortingOption;
QString m_sortingProperty;
QVariantMap m_customOptions;
};
Query::Query()
: d(new Private)
{
}
Query::Query(const Term& t)
: d(new Private)
{
d->m_term = t;
}
Query::Query(const Query& rhs)
: d(new Private(*rhs.d))
{
}
Query::~Query()
{
delete d;
}
void Query::setTerm(const Term& t)
{
d->m_term = t;
}
Term Query::term() const
{
return d->m_term;
}
void Query::addType(const QString& type)
{
d->m_types << type.split(QLatin1Char('/'), QString::SkipEmptyParts);
}
void Query::addTypes(const QStringList& typeList)
{
Q_FOREACH (const QString& type, typeList) {
addType(type);
}
}
void Query::setType(const QString& type)
{
d->m_types.clear();
addType(type);
}
void Query::setTypes(const QStringList& types)
{
d->m_types = types;
}
QStringList Query::types() const
{
return d->m_types;
}
QString Query::searchString() const
{
return d->m_searchString;
}
void Query::setSearchString(const QString& str)
{
d->m_searchString = str;
}
uint Query::limit() const
{
return d->m_limit;
}
void Query::setLimit(uint limit)
{
d->m_limit = limit;
}
uint Query::offset() const
{
return d->m_offset;
}
void Query::setOffset(uint offset)
{
d->m_offset = offset;
}
void Query::setDateFilter(int year, int month, int day)
{
d->m_yearFilter = year;
d->m_monthFilter = month;
d->m_dayFilter = day;
}
int Query::yearFilter() const
{
return d->m_yearFilter;
}
int Query::monthFilter() const
{
return d->m_monthFilter;
}
int Query::dayFilter() const
{
return d->m_dayFilter;
}
void Query::setSortingOption(Query::SortingOption option)
{
d->m_sortingOption = option;
}
Query::SortingOption Query::sortingOption() const
{
return d->m_sortingOption;
}
void Query::setSortingProperty(const QString& property)
{
d->m_sortingOption = SortProperty;
d->m_sortingProperty = property;
}
QString Query::sortingProperty() const
{
return d->m_sortingProperty;
}
void Query::addCustomOption(const QString& option, const QVariant& value)
{
d->m_customOptions.insert(option, value);
}
QVariant Query::customOption(const QString& option) const
{
return d->m_customOptions.value(option);
}
QVariantMap Query::customOptions() const
{
return d->m_customOptions;
}
void Query::removeCustomOption(const QString& option)
{
d->m_customOptions.remove(option);
}
Q_GLOBAL_STATIC_WITH_ARGS(SearchStore::List, s_searchStores, (SearchStore::searchStores()))
ResultIterator Query::exec()
{
// vHanda: Maybe this should default to allow searches on all search stores?
Q_ASSERT_X(!types().isEmpty(), "Baloo::Query::exec", "A query is being initialized without a type");
if (types().isEmpty())
return ResultIterator();
SearchStore* storeMatch = 0;
Q_FOREACH (QSharedPointer<SearchStore> store, *s_searchStores) {
bool matches = true;
Q_FOREACH (const QString& type, types()) {
if (!store->types().contains(type)) {
matches = false;
break;
}
}
if (matches) {
storeMatch = store.data();
break;
}
}
if (!storeMatch)
return ResultIterator();
int id = storeMatch->exec(*this);
return ResultIterator(id, storeMatch);
}
QByteArray Query::toJSON()
{
QVariantMap map;
if (!d->m_types.isEmpty())
map[QLatin1String("type")] = d->m_types;
if (d->m_limit != defaultLimit)
map[QLatin1String("limit")] = d->m_limit;
if (d->m_offset)
map[QLatin1String("offset")] = d->m_offset;
if (!d->m_searchString.isEmpty())
map[QLatin1String("searchString")] = d->m_searchString;
if (d->m_term.isValid())
map[QLatin1String("term")] = QVariant(d->m_term.toVariantMap());
if (d->m_yearFilter >= 0)
map[QLatin1String("yearFilter")] = d->m_yearFilter;
if (d->m_monthFilter >= 0)
map[QLatin1String("monthFilter")] = d->m_monthFilter;
if (d->m_dayFilter >= 0)
map[QLatin1String("dayFilter")] = d->m_dayFilter;
if (d->m_sortingOption != SortAuto)
map[QLatin1String("sortingOption")] = static_cast<int>(d->m_sortingOption);
if (!d->m_sortingProperty.isEmpty())
map[QLatin1String("sortingProperty")] = d->m_sortingProperty;
if (d->m_customOptions.size())
map[QLatin1String("customOptions")] = d->m_customOptions;
QJsonObject jo = QJsonObject::fromVariantMap(map);
QJsonDocument jdoc;
jdoc.setObject(jo);
return jdoc.toJson();
}
// static
Query Query::fromJSON(const QByteArray& arr)
{
QJsonDocument jdoc = QJsonDocument::fromJson(arr);
const QVariantMap map = jdoc.object().toVariantMap();
Query query;
query.d->m_types = map[QLatin1String("type")].toStringList();
if (map.contains(QLatin1String("limit")))
query.d->m_limit = map[QLatin1String("limit")].toUInt();
else
query.d->m_limit = defaultLimit;
query.d->m_offset = map[QLatin1String("offset")].toUInt();
query.d->m_searchString = map[QLatin1String("searchString")].toString();
query.d->m_term = Term::fromVariantMap(map[QLatin1String("term")].toMap());
if (map.contains(QLatin1String("yearFilter")))
query.d->m_yearFilter = map[QLatin1String("yearFilter")].toInt();
if (map.contains(QLatin1String("monthFilter")))
query.d->m_monthFilter = map[QLatin1String("monthFilter")].toInt();
if (map.contains(QLatin1String("dayFilter")))
query.d->m_dayFilter = map[QLatin1String("dayFilter")].toInt();
if (map.contains(QLatin1String("sortingOption"))) {
int option = map.value("sortingOption").toInt();
query.d->m_sortingOption = static_cast<SortingOption>(option);
}
if (map.contains(QLatin1String("sortingProperty"))) {
query.d->m_sortingProperty = map.value("sortingProperty").toString();
}
if (map.contains(QLatin1String("customOptions"))) {
QVariant var = map[QLatin1String("customOptions")];
if (var.type() == QVariant::Map) {
query.d->m_customOptions = map[QLatin1String("customOptions")].toMap();
}
else if (var.type() == QVariant::Hash) {
QVariantHash hash = var.toHash();
QHash<QString, QVariant>::const_iterator it = hash.constBegin();
for (; it != hash.constEnd(); ++it)
query.d->m_customOptions.insert(it.key(), it.value());
}
}
return query;
}
QUrl Query::toSearchUrl(const QString& title)
{
QUrl url;
url.setScheme(QLatin1String("baloosearch"));
QUrlQuery urlQuery;
urlQuery.addQueryItem(QLatin1String("json"), QString::fromUtf8(toJSON()));
if (title.size())
urlQuery.addQueryItem(QLatin1String("title"), title);
url.setQuery(urlQuery);
return url;
}
Query Query::fromSearchUrl(const QUrl& url)
{
if (url.scheme() != QLatin1String("baloosearch"))
return Query();
QUrlQuery urlQuery(url);
QString jsonString = urlQuery.queryItemValue(QLatin1String("json"), QUrl::FullyDecoded);
return Query::fromJSON(jsonString.toUtf8());
}
QString Query::titleFromQueryUrl(const QUrl& url)
{
QUrlQuery urlQuery(url);
return urlQuery.queryItemValue(QLatin1String("title"), QUrl::FullyDecoded);
}
bool Query::operator==(const Query& rhs) const
{
if (rhs.d->m_limit != d->m_limit || rhs.d->m_offset != d->m_offset ||
rhs.d->m_dayFilter != d->m_dayFilter || rhs.d->m_monthFilter != d->m_monthFilter ||
rhs.d->m_yearFilter != d->m_yearFilter || rhs.d->m_customOptions != d->m_customOptions ||
rhs.d->m_searchString != d->m_searchString || rhs.d->m_sortingProperty != d->m_sortingProperty ||
rhs.d->m_sortingOption != d->m_sortingOption)
{
return false;
}
if (rhs.d->m_types.size() != d->m_types.size())
return false;
Q_FOREACH (const QString& type, rhs.d->m_types) {
if (!d->m_types.contains(type))
return false;
}
return d->m_term == rhs.d->m_term;
}
Query& Query::operator=(const Query& rhs)
{
*d = *rhs.d;
return *this;
}
diff --git a/src/lib/searchstore.cpp b/src/lib/searchstore.cpp
index 61cea38e..ac0aa768 100644
--- a/src/lib/searchstore.cpp
+++ b/src/lib/searchstore.cpp
@@ -1,140 +1,94 @@
/*
* This file is part of the KDE Baloo Project
* Copyright (C) 2013 Vishesh Handa <me@vhanda.in>
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#include "searchstore.h"
+#include "filesearchstore.h"
#include <QDebug>
#include <QThreadStorage>
#include <QMutex>
#include <QSharedPointer>
#include <QCoreApplication>
-#include <QPluginLoader>
#include <QDir>
using namespace Baloo;
SearchStore::SearchStore(QObject* parent)
: QObject(parent)
{
}
SearchStore::~SearchStore()
{
}
QUrl SearchStore::url(int)
{
return QUrl();
}
QString SearchStore::icon(int)
{
return QString();
}
QString SearchStore::text(int)
{
return QString();
}
QString SearchStore::property(int, const QString&)
{
return QString();
}
Q_GLOBAL_STATIC(SearchStore::List, s_overrideSearchStores)
void SearchStore::overrideSearchStores(const QList<SearchStore*> &overrideSearchStores)
{
List* list = &(*s_overrideSearchStores);
list->clear();
Q_FOREACH (SearchStore* store, overrideSearchStores) {
list->append(QSharedPointer<SearchStore>(store));
}
}
//
// Search Stores
//
// static
SearchStore::List SearchStore::searchStores()
{
static QMutex mutex;
QMutexLocker lock(&mutex);
if (s_overrideSearchStores && !s_overrideSearchStores->isEmpty()) {
qDebug() << "Overriding search stores.";
return *s_overrideSearchStores;
}
- // Get all the plugins
- QStringList plugins;
- QStringList pluginPaths;
-
- QStringList paths = QCoreApplication::libraryPaths();
- Q_FOREACH (const QString& libraryPath, paths) {
- QString path(libraryPath + QStringLiteral("/kf5/baloo"));
- QDir dir(path);
-
- if (!dir.exists()) {
- continue;
- }
-
- QStringList entryList = dir.entryList(QDir::Files | QDir::NoDotAndDotDot);
- Q_FOREACH (const QString& fileName, entryList) {
- if (plugins.contains(fileName))
- continue;
-
- plugins << fileName;
- pluginPaths << dir.absoluteFilePath(fileName);
- }
- }
- plugins.clear();
-
SearchStore::List stores;
- Q_FOREACH (const QString& pluginPath, pluginPaths) {
- QPluginLoader loader(pluginPath);
-
- if (!loader.load()) {
- qWarning() << "Could not create Baloo Search Store: " << pluginPath;
- qWarning() << loader.errorString();
- continue;
- }
-
- QObject* obj = loader.instance();
- if (obj) {
- SearchStore* ex = qobject_cast<SearchStore*>(obj);
- if (ex) {
- stores << QSharedPointer<SearchStore>(ex);
- } else {
- qDebug() << "Plugin could not be converted to an Baloo::SearchStore";
- qDebug() << pluginPath;
- }
- }
- else {
- qDebug() << "Plugin could not create instance" << pluginPath;
- }
- }
+ stores << QSharedPointer<SearchStore>(new FileSearchStore());
return stores;
}
diff --git a/src/file/search/wildcardpostingsource.cpp b/src/lib/wildcardpostingsource.cpp
similarity index 100%
rename from src/file/search/wildcardpostingsource.cpp
rename to src/lib/wildcardpostingsource.cpp
diff --git a/src/file/search/wildcardpostingsource.h b/src/lib/wildcardpostingsource.h
similarity index 100%
rename from src/file/search/wildcardpostingsource.h
rename to src/lib/wildcardpostingsource.h
diff --git a/src/xapian/xapiansearchstore.cpp b/src/lib/xapiansearchstore.cpp
similarity index 100%
rename from src/xapian/xapiansearchstore.cpp
rename to src/lib/xapiansearchstore.cpp
diff --git a/src/xapian/xapiansearchstore.h b/src/lib/xapiansearchstore.h
similarity index 97%
rename from src/xapian/xapiansearchstore.h
rename to src/lib/xapiansearchstore.h
index 9f92a836..4939b602 100644
--- a/src/xapian/xapiansearchstore.h
+++ b/src/lib/xapiansearchstore.h
@@ -1,131 +1,130 @@
/*
* This file is part of the KDE Baloo Project
* Copyright (C) 2013 Vishesh Handa <me@vhanda.in>
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef BALOO_XAPIANSEARCHSTORE_H
#define BALOO_XAPIANSEARCHSTORE_H
#include "searchstore.h"
#include "term.h"
-#include "xapian_export.h"
#include <xapian.h>
#include <QMutex>
namespace Baloo {
/**
* Implements a search store using Xapian
*/
-class BALOO_XAPIAN_EXPORT XapianSearchStore : public SearchStore
+class XapianSearchStore : public SearchStore
{
public:
explicit XapianSearchStore(QObject* parent = 0);
virtual ~XapianSearchStore();
virtual int exec(const Query& query);
virtual void close(int queryId);
virtual bool next(int queryId);
virtual QByteArray id(int queryId);
virtual QUrl url(int queryId);
/**
* Set the path of the xapian database
*/
virtual void setDbPath(const QString& path);
virtual QString dbPath();
protected:
/**
* The derived class should implement the logic for constructing the appropriate
* Xapian::Query class from the given values.
*/
virtual Xapian::Query constructQuery(const QString& property,
const QVariant& value,
Term::Comparator com) = 0;
virtual Xapian::Query constructFilterQuery(int year, int month, int day);
/**
* Apply any final touches to the query
*/
virtual Xapian::Query finalizeQuery(const Xapian::Query& query);
/**
* Create a query for any custom options.
*/
virtual Xapian::Query applyCustomOptions(const Xapian::Query& q, const QVariantMap& options);
/**
* Returns the url for the document with id \p docid.
*/
virtual QUrl constructUrl(const Xapian::docid& docid) = 0;
/**
* Gives a list of types which have been provided with the query.
* This must return the appropriate query which will be ANDed with
* the final query
*/
virtual Xapian::Query convertTypes(const QStringList& types) = 0;
/**
* The prefix that should be used when converting an integer
* id to a byte array
*/
virtual QByteArray idPrefix() = 0;
Xapian::Document docForQuery(int queryId);
/**
* Convenience function to AND two Xapian queries together.
*/
Xapian::Query andQuery(const Xapian::Query& a, const Xapian::Query& b);
Xapian::Database* xapianDb();
protected:
QMutex m_mutex;
private:
Xapian::Query toXapianQuery(const Term& term);
Xapian::Query toXapianQuery(Xapian::Query::op op, const QList<Term>& terms);
Xapian::Query constructSearchQuery(const QString& str);
struct Result {
Xapian::MSet mset;
Xapian::MSetIterator it;
uint lastId;
QUrl lastUrl;
};
QHash<int, Result> m_queryMap;
int m_nextId;
QString m_dbPath;
Xapian::Database* m_db;
};
}
#endif // BALOO_XAPIANSEARCHSTORE_H
diff --git a/src/xapian/CMakeLists.txt b/src/xapian/CMakeLists.txt
index 33e5ca97..dcb23ea3 100644
--- a/src/xapian/CMakeLists.txt
+++ b/src/xapian/CMakeLists.txt
@@ -1,31 +1,29 @@
kde_enable_exceptions()
set(XAPIAN_SRCS
- xapiansearchstore.cpp
xapiandocument.cpp
xapiandatabase.cpp
xapiantermgenerator.cpp
xapianqueryparser.cpp
)
add_library(KF5BalooXapian ${XAPIAN_SRCS})
add_library(KF5::BalooXapian ALIAS KF5BalooXapian)
target_link_libraries(KF5BalooXapian PUBLIC
Qt5::Core
${XAPIAN_LIBRARIES}
- KF5::BalooCore
)
set_target_properties(KF5BalooXapian PROPERTIES
VERSION ${BALOO_VERSION_STRING}
SOVERSION ${BALOO_SOVERSION}
EXPORT_NAME BalooXapian
)
generate_export_header(KF5BalooXapian BASE_NAME BALOO_XAPIAN EXPORT_FILE_NAME xapian_export.h)
install(TARGETS KF5BalooXapian EXPORT KF5BalooTargets ${KF5_INSTALL_TARGETS_DEFAULT_ARGS})
add_subdirectory(autotests)
add_subdirectory(tests)

File Metadata

Mime Type
text/x-diff
Expires
Mon, Apr 6, 12:49 AM (5 d, 14 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18831752
Default Alt Text
(45 KB)

Event Timeline