diff options
author | Eric Wong <e@80x24.org> | 2019-12-22 22:17:39 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2019-12-24 03:48:12 +0000 |
commit | cd8dd7b08fddc7c2b5f218c3fcaa5dca5f9ad945 (patch) | |
tree | 0989e4981be20e2408dda31314da019bd1841647 /lib/PublicInbox/SearchIdx.pm | |
parent | 9484944697a1bf76d00d84d081e6a7d633074336 (diff) | |
download | public-inbox-cd8dd7b08fddc7c2b5f218c3fcaa5dca5f9ad945.tar.gz |
Xapian upstream is slowly phasing out the XS-based Search::Xapian in favor of the SWIG-generated "Xapian" package. While Debian and both FreeBSD have Search::Xapian, OpenBSD only includes the "Xapian" binding. More information about the status of the "Xapian" Perl module here: https://trac.xapian.org/ticket/523
Diffstat (limited to 'lib/PublicInbox/SearchIdx.pm')
-rw-r--r-- | lib/PublicInbox/SearchIdx.pm | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm index b56fd0ee..21ab8119 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -19,7 +19,8 @@ use POSIX qw(strftime); use PublicInbox::OverIdx; use PublicInbox::Spawn qw(spawn); use PublicInbox::Git qw(git_unquote); - +my $X = \%PublicInbox::Search::X; +my ($DB_CREATE_OR_OPEN, $DB_OPEN); use constant { BATCH_BYTES => defined($ENV{XAPIAN_FLUSH_THRESHOLD}) ? 0x7fffffff : 1_000_000, @@ -85,17 +86,28 @@ sub _xdb_release { undef; } +sub load_xapian_writable () { + return 1 if $X->{WritableDatabase}; + PublicInbox::Search::load_xapian() or return; + my $xap = $PublicInbox::Search::Xap; + for (qw(Document TermGenerator WritableDatabase)) { + $X->{$_} = $xap.'::'.$_; + } + eval 'require '.$X->{WritableDatabase} or die; + *sortable_serialise = $xap.'::sortable_serialise'; + $DB_CREATE_OR_OPEN = eval($xap.'::DB_CREATE_OR_OPEN()'); + $DB_OPEN = eval($xap.'::DB_OPEN()'); + 1; +} + sub _xdb_acquire { my ($self) = @_; my $flag; my $dir = $self->xdir; if (need_xapian($self)) { croak 'already acquired' if $self->{xdb}; - PublicInbox::Search::load_xapian(); - require Search::Xapian::WritableDatabase; - $flag = $self->{creat} ? - Search::Xapian::DB_CREATE_OR_OPEN() : - Search::Xapian::DB_OPEN(); + load_xapian_writable(); + $flag = $self->{creat} ? $DB_CREATE_OR_OPEN : $DB_OPEN; } if ($self->{creat}) { require File::Path; @@ -108,7 +120,7 @@ sub _xdb_acquire { } } return unless defined $flag; - my $xdb = eval { Search::Xapian::WritableDatabase->new($dir, $flag) }; + my $xdb = eval { ($X->{WritableDatabase})->new($dir, $flag) }; if ($@) { die "Failed opening $dir: ", $@; } @@ -117,7 +129,7 @@ sub _xdb_acquire { sub add_val ($$$) { my ($doc, $col, $num) = @_; - $num = Search::Xapian::sortable_serialise($num); + $num = sortable_serialise($num); $doc->add_value($col, $num); } @@ -274,7 +286,7 @@ sub index_body ($$$) { sub add_xapian ($$$$$) { my ($self, $mime, $num, $oid, $mids, $mid0) = @_; my $smsg = PublicInbox::SearchMsg->new($mime); - my $doc = Search::Xapian::Document->new; + my $doc = $X->{Document}->new; my $subj = $smsg->subject; add_val($doc, PublicInbox::Search::TS(), $smsg->ts); my @ds = gmtime($smsg->ds); @@ -458,7 +470,7 @@ sub term_generator { # write-only my $tg = $self->{term_generator}; return $tg if $tg; - $tg = Search::Xapian::TermGenerator->new; + $tg = $X->{TermGenerator}->new; $tg->set_stemmer($self->stemmer); $self->{term_generator} = $tg; |