Skip to content

Commit

Permalink
Better deactivate xapian support.
Browse files Browse the repository at this point in the history
Simply remove the search api if libzim is compiled without xapian.
  • Loading branch information
mgautierfr committed Dec 15, 2020
1 parent 43278f0 commit 16b4b44
Show file tree
Hide file tree
Showing 9 changed files with 16 additions and 74 deletions.
10 changes: 8 additions & 2 deletions include/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,19 @@ install_headers(
'zim/error.h',
'zim/item.h',
'zim/entry.h',
'zim/search.h',
'zim/search_iterator.h',
'zim/uuid.h',
'zim/zim.h',
subdir:'zim'
)

if xapian_dep.found()
install_headers(
'zim/search.h',
'zim/search_iterator.h',
subdir:'zim'
)
endif

install_headers(
'zim/writer/item.h',
'zim/writer/creator.h',
Expand Down
2 changes: 1 addition & 1 deletion meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ if target_machine.system() == 'freebsd'
endif

xapian_dep = dependency('xapian-core',
required:false,
required:get_option('with_xapian'),
static:static_linkage)
conf.set('ENABLE_XAPIAN', xapian_dep.found())

Expand Down
2 changes: 2 additions & 0 deletions meson_options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,5 @@ option('static-linkage', type : 'boolean', value : false,
description : 'Link statically with the dependencies.')
option('doc', type : 'boolean', value : false,
description : 'Build the documentations.')
option('with_xapian', type : 'feature', value: 'enabled',
description: 'Build libzim with xapian support')
6 changes: 3 additions & 3 deletions src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,8 @@ common_sources = [
'blob.cpp',
'buffer.cpp',
'md5.c',
'search.cpp',
'search_iterator.cpp',
'template.cpp',
'uuid.cpp',
'levenshtein.cpp',
'tools.cpp',
'compression.cpp',
'istreamreader.cpp',
Expand All @@ -44,6 +41,9 @@ else
endif

xapian_sources = [
'search.cpp',
'search_iterator.cpp',
'levenshtein.cpp',
'xapian/htmlparse.cc',
'xapian/myhtmlparse.cc',
'writer/xapianIndexer.cpp'
Expand Down
13 changes: 0 additions & 13 deletions src/search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,14 @@
#endif
#include <errno.h>

#if defined(ENABLE_XAPIAN)
#include "xapian.h"
#include <unicode/locid.h>
#endif

#define MAX_MATCHES_TO_SORT 10000

namespace zim
{

#if defined(ENABLE_XAPIAN)
namespace {
/* Split string in a token array */
std::vector<std::string> split(const std::string & str,
Expand Down Expand Up @@ -136,7 +133,6 @@ class LevenshteinDistanceMaker : public Xapian::KeyMaker {
};

}
#endif

Search::Search(const std::vector<Archive>& archives) :
internal(new InternalData),
Expand Down Expand Up @@ -242,7 +238,6 @@ Search& Search::set_suggestion_mode(const bool suggestion_mode) {
#define WITH_LEV 1

Search::iterator Search::begin() const {
#if defined(ENABLE_XAPIAN)
if ( this->search_started ) {
return new search_iterator::InternalData(this, internal->results.begin());
}
Expand Down Expand Up @@ -416,21 +411,13 @@ Search::iterator Search::begin() const {
search_started = true;
estimated_matches_number = internal->results.get_matches_estimated();
return new search_iterator::InternalData(this, internal->results.begin());
#else
estimated_matches_number = 0;
return nullptr;
#endif
}

Search::iterator Search::end() const {
#if defined(ENABLE_XAPIAN)
if ( ! has_database ) {
return nullptr;
}
return new search_iterator::InternalData(this, internal->results.end());
#else
return nullptr;
#endif
}

int Search::get_matches_estimated() const {
Expand Down
15 changes: 0 additions & 15 deletions src/search_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,34 +20,25 @@
#ifndef ZIM_SEARCH_INTERNAL_H
#define ZIM_SEARCH_INTERNAL_H

#include "config.h"

#if defined(ENABLE_XAPIAN)
#include <xapian.h>
#endif

#include <zim/entry.h>

namespace zim {

struct Search::InternalData {
#if defined(ENABLE_XAPIAN)
std::vector<Xapian::Database> xapian_databases;
Xapian::Database database;
Xapian::MSet results;
#endif
};

struct search_iterator::InternalData {
#if defined(ENABLE_XAPIAN)
const Search* search;
Xapian::MSetIterator iterator;
Xapian::Document _document;
bool document_fetched;
#endif
std::unique_ptr<Entry> _entry;

#if defined(ENABLE_XAPIAN)
InternalData(const InternalData& other) :
search(other.search),
iterator(other.iterator),
Expand Down Expand Up @@ -84,24 +75,18 @@ struct search_iterator::InternalData {
}
return _document;
}
#endif

int get_databasenumber() {
#if defined(ENABLE_XAPIAN)
Xapian::docid docid = *iterator;
return (docid - 1) % search->m_archives.size();
#endif
return 0;
}

Entry& get_entry() {
#if defined(ENABLE_XAPIAN)
if ( !_entry ) {
int databasenumber = get_databasenumber();
auto archive = search->m_archives.at(databasenumber);
_entry.reset(new Entry(archive.getEntryByPath(get_document().get_data())));
}
#endif
return *_entry.get();
}
};
Expand Down
40 changes: 2 additions & 38 deletions src/search_iterator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,51 +41,37 @@ search_iterator::search_iterator(InternalData* internal_data)
search_iterator::search_iterator(const search_iterator& it)
: internal(nullptr)
{
#if defined(ENABLE_XAPIAN)
// Without xapian, internal is allways null
if (it.internal) internal = std::unique_ptr<InternalData>(new InternalData(*it.internal));
#endif
}

search_iterator & search_iterator::operator=(const search_iterator& it) {
#if defined(ENABLE_XAPIAN)
// Without xapian, internal is allways null
if ( ! it.internal ) internal.reset();
else if ( ! internal ) internal = std::unique_ptr<InternalData>(new InternalData(*it.internal));
else *internal = *it.internal;
#endif

return *this;
}

bool search_iterator::operator==(const search_iterator& it) const {
#if defined(ENABLE_XAPIAN)
if ( ! internal && ! it.internal)
return true;
if ( ! internal || ! it.internal)
return false;
return (internal->search == it.internal->search
&& internal->iterator == it.internal->iterator);
#else
// If there is no xapian, there is no search. There is only one iterator: end.
// So all iterators are equal.
return true;
#endif
}

bool search_iterator::operator!=(const search_iterator& it) const {
return ! (*this == it);
}

search_iterator& search_iterator::operator++() {
#if defined(ENABLE_XAPIAN)
if ( ! internal ) {
return *this;
}
++(internal->iterator);
internal->document_fetched = false;
internal->_entry.reset();
#endif
return *this;
}

Expand All @@ -96,14 +82,12 @@ search_iterator search_iterator::operator++(int) {
}

search_iterator& search_iterator::operator--() {
#if defined(ENABLE_XAPIAN)
if ( ! internal ) {
return *this;
}
--(internal->iterator);
internal->document_fetched = false;
internal->_entry.reset();
#endif
return *this;
}

Expand All @@ -114,18 +98,13 @@ search_iterator search_iterator::operator--(int) {
}

std::string search_iterator::get_url() const {
#if defined(ENABLE_XAPIAN)
if ( ! internal ) {
return "";
}
return internal->get_document().get_data();
#else
return "";
#endif
}

std::string search_iterator::get_title() const {
#if defined(ENABLE_XAPIAN)
if ( ! internal ) {
return "";
}
Expand All @@ -138,23 +117,17 @@ std::string search_iterator::get_title() const {
{
return internal->get_document().get_value(internal->search->valuesmap["title"]);
}
#endif
return "";
}

int search_iterator::get_score() const {
#if defined(ENABLE_XAPIAN)
if ( ! internal ) {
return 0;
}
return internal->iterator.get_percent();
#else
return 0;
#endif
}

std::string search_iterator::get_snippet() const {
#if defined(ENABLE_XAPIAN)
if ( ! internal ) {
return "";
}
Expand All @@ -179,19 +152,15 @@ std::string search_iterator::get_snippet() const {
zim::MyHtmlParser htmlParser;
std::string content = entry.getItem().getData();
try {
htmlParser.parse_html(content, "UTF-8", true);
htmlParser.parse_html(content, "UTF-8", true);
} catch (...) {}
return internal->search->internal->results.snippet(htmlParser.dump, 500);
} catch(...) {
} catch (...) {
return "";
}
#else
return "";
#endif
}

int search_iterator::get_size() const {
#if defined(ENABLE_XAPIAN)
if ( ! internal ) {
return -1;
}
Expand All @@ -204,14 +173,12 @@ int search_iterator::get_size() const {
{
return atoi(internal->get_document().get_value(internal->search->valuesmap["size"]).c_str());
}
#endif
/* The size is never used. Do we really want to get the content and
calculate the size ? */
return -1;
}

int search_iterator::get_wordCount() const {
#if defined(ENABLE_XAPIAN)
if ( ! internal ) {
return -1;
}
Expand All @@ -224,16 +191,13 @@ int search_iterator::get_wordCount() const {
{
return atoi(internal->get_document().get_value(internal->search->valuesmap["wordcount"]).c_str());
}
#endif
return -1;
}

int search_iterator::get_fileIndex() const {
#if defined(ENABLE_XAPIAN)
if ( internal ) {
return internal->get_databasenumber();
}
#endif
return 0;
}

Expand Down
1 change: 0 additions & 1 deletion src/writer/creatordata.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@

#if defined(ENABLE_XAPIAN)
#include "xapianIndexer.h"
class XapianIndexer;
#endif

namespace zim
Expand Down
1 change: 0 additions & 1 deletion src/writer/xapianIndexer.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ namespace zim {
class IndexTask;
}
}
class XapianIndexer;

enum class IndexingMode {
TITLE,
Expand Down

0 comments on commit 16b4b44

Please sign in to comment.