]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/SearchIdx.pm
Merge remote-tracking branch 'origin/ds'
[public-inbox.git] / lib / PublicInbox / SearchIdx.pm
index 9c291066487d03be512706442f45df4c3e1022c4..a088ce75fe62e5b32331e778b559bce7e0bc5d94 100644 (file)
@@ -30,31 +30,22 @@ my $xapianlevels = qr/\A(?:full|medium)\z/;
 
 sub new {
        my ($class, $ibx, $creat, $part) = @_;
+       ref $ibx or die "BUG: expected PublicInbox::Inbox object: $ibx";
        my $levels = qr/\A(?:full|medium|basic)\z/;
-       my $mainrepo = $ibx; # for "public-inbox-index" w/o entry in config
-       my $git_dir = $mainrepo;
-       my ($altid, $git);
-       my $version = 1;
+       my $mainrepo = $ibx->{mainrepo};
+       my $version = $ibx->{version} || 1;
        my $indexlevel = 'full';
-       if (ref $ibx) {
-               $mainrepo = $ibx->{mainrepo};
-               $altid = $ibx->{altid};
-               $version = $ibx->{version} || 1;
-               if ($altid) {
-                       require PublicInbox::AltId;
-                       $altid = [ map {
-                               PublicInbox::AltId->new($ibx, $_);
-                       } @$altid ];
-               }
-               if ($ibx->{indexlevel}) {
-                       if ($ibx->{indexlevel} =~ $levels) {
-                               $indexlevel = $ibx->{indexlevel};
-                       } else {
-                               die("Invalid indexlevel $ibx->{indexlevel}\n");
-                       }
+       my $altid = $ibx->{altid};
+       if ($altid) {
+               require PublicInbox::AltId;
+               $altid = [ map { PublicInbox::AltId->new($ibx, $_); } @$altid ];
+       }
+       if ($ibx->{indexlevel}) {
+               if ($ibx->{indexlevel} =~ $levels) {
+                       $indexlevel = $ibx->{indexlevel};
+               } else {
+                       die("Invalid indexlevel $ibx->{indexlevel}\n");
                }
-       } else { # FIXME: old tests: old tests
-               $ibx = { mainrepo => $git_dir, version => 1 };
        }
        $ibx = PublicInbox::InboxWritable->new($ibx);
        my $self = bless {
@@ -117,7 +108,11 @@ sub _xdb_acquire {
                }
        }
        return unless defined $flag;
-       $self->{xdb} = Search::Xapian::WritableDatabase->new($dir, $flag);
+       my $xdb = eval { Search::Xapian::WritableDatabase->new($dir, $flag) };
+       if ($@) {
+               die "Failed opening $dir: ", $@;
+       }
+       $self->{xdb} = $xdb;
 }
 
 sub add_val ($$$) {
@@ -694,7 +689,7 @@ sub _last_x_commit {
                $lx = $lm;
        }
        # Use last_commit from msgmap if it is older or unset
-       if (!$lm || ($lx && $lx && is_ancestor($self->{git}, $lm, $lx))) {
+       if (!$lm || ($lx && $lm && is_ancestor($self->{git}, $lm, $lx))) {
                $lx = $lm;
        }
        $lx;
@@ -828,6 +823,14 @@ sub commit_txn_lazy {
        delete $self->{txn} or return;
        $self->{-inbox}->with_umask(sub {
                if (my $xdb = $self->{xdb}) {
+
+                       # store 'indexlevel=medium' in v2 part=0 and v1 (only part)
+                       # This metadata is read by Admin::detect_indexlevel:
+                       if (!$self->{partition} # undef or 0, not >0
+                           && $self->{indexlevel} eq 'medium') {
+                               $xdb->set_metadata('indexlevel', 'medium');
+                       }
+
                        $xdb->commit_transaction;
                }
                $self->{over}->commit_lazy if $self->{over};