about summary refs log tree commit homepage
path: root/lib/PublicInbox/SearchIdx.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-12-22 22:17:39 +0000
committerEric Wong <e@80x24.org>2019-12-24 03:48:12 +0000
commitcd8dd7b08fddc7c2b5f218c3fcaa5dca5f9ad945 (patch)
tree0989e4981be20e2408dda31314da019bd1841647 /lib/PublicInbox/SearchIdx.pm
parent9484944697a1bf76d00d84d081e6a7d633074336 (diff)
downloadpublic-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.pm32
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;