about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-10-12 11:47:04 +0000
committerEric Wong <e@80x24.org>2021-10-12 21:46:36 +0000
commit9f02576da775abf208f5a03c03b6f7abd72596d0 (patch)
tree49d24d01fca0987281d087862e5149c60928b68a
parent2a3c8d7a2c40ad9424db10d68470d8bb120bddf9 (diff)
downloadpublic-inbox-9f02576da775abf208f5a03c03b6f7abd72596d0.tar.gz
msgmap: ->new_file to supports $ibx arg, drop ->new
The original Msgmap->new API was v1-specific and not necessary.
The ->new_file API now supports an $ibx object being passed to
it, simplify -no_fsync use.  It will also make an upcoming
change easier...
-rw-r--r--lib/PublicInbox/Inbox.pm2
-rw-r--r--lib/PublicInbox/InboxWritable.pm2
-rw-r--r--lib/PublicInbox/Msgmap.pm20
-rw-r--r--lib/PublicInbox/SearchIdx.pm3
-rw-r--r--lib/PublicInbox/V2Writable.pm4
-rw-r--r--t/altid.t4
-rw-r--r--t/altid_v2.t4
-rw-r--r--t/filter_rubylang.t2
-rw-r--r--t/init.t3
-rw-r--r--t/msgmap.t5
10 files changed, 23 insertions, 26 deletions
diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm
index 61d153bf..74b8a74f 100644
--- a/lib/PublicInbox/Inbox.pm
+++ b/lib/PublicInbox/Inbox.pm
@@ -148,7 +148,7 @@ sub mm {
         $self->{mm} //= eval {
                 require PublicInbox::Msgmap;
                 _cleanup_later($self);
-                PublicInbox::Msgmap->new_file(mm_file($self));
+                PublicInbox::Msgmap->new_file($self);
         } // ($req ? croak("E: $@") : undef);
 }
 
diff --git a/lib/PublicInbox/InboxWritable.pm b/lib/PublicInbox/InboxWritable.pm
index 65539781..17dfbe18 100644
--- a/lib/PublicInbox/InboxWritable.pm
+++ b/lib/PublicInbox/InboxWritable.pm
@@ -47,7 +47,7 @@ sub _init_v1 {
                 require PublicInbox::Msgmap;
                 my $sidx = PublicInbox::SearchIdx->new($self, 1); # just create
                 $sidx->begin_txn_lazy;
-                my $mm = PublicInbox::Msgmap->new($self->{inboxdir}, 1);
+                my $mm = PublicInbox::Msgmap->new_file($self, 1);
                 if (defined $skip_artnum) {
                         $mm->{dbh}->begin_work;
                         $mm->skip_artnum($skip_artnum);
diff --git a/lib/PublicInbox/Msgmap.pm b/lib/PublicInbox/Msgmap.pm
index 978730e2..94a0cbeb 100644
--- a/lib/PublicInbox/Msgmap.pm
+++ b/lib/PublicInbox/Msgmap.pm
@@ -14,19 +14,17 @@ use DBI;
 use DBD::SQLite;
 use PublicInbox::Over;
 use PublicInbox::Spawn;
-
-sub new {
-        my ($class, $git_dir, $writable) = @_;
-        my $d = "$git_dir/public-inbox";
-        if ($writable && !-d $d && !mkdir $d) {
-                my $err = $!;
-                -d $d or die "$d not created: $err";
-        }
-        new_file($class, "$d/msgmap.sqlite3", $writable);
-}
+use Scalar::Util qw(blessed);
 
 sub new_file {
-        my ($class, $f, $rw) = @_;
+        my ($class, $ibx, $rw) = @_;
+        my $f;
+        if (blessed($ibx)) {
+                $f = $ibx->mm_file;
+                $rw = 2 if $rw && $ibx->{-no_fsync};
+        } else {
+                $f = $ibx;
+        }
         return if !$rw && !-r $f;
 
         my $self = bless { filename => $f }, $class;
diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm
index bebe904b..a2ed9499 100644
--- a/lib/PublicInbox/SearchIdx.pm
+++ b/lib/PublicInbox/SearchIdx.pm
@@ -453,8 +453,7 @@ sub _msgmap_init ($) {
         die "BUG: _msgmap_init is only for v1\n" if $self->{ibx}->version != 1;
         $self->{mm} //= eval {
                 require PublicInbox::Msgmap;
-                my $rw = $self->{ibx}->{-no_fsync} ? 2 : 1;
-                PublicInbox::Msgmap->new($self->{ibx}->{inboxdir}, $rw);
+                PublicInbox::Msgmap->new_file($self->{ibx}, 1);
         };
 }
 
diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm
index d04cdda6..efcc1fc2 100644
--- a/lib/PublicInbox/V2Writable.pm
+++ b/lib/PublicInbox/V2Writable.pm
@@ -267,9 +267,7 @@ sub _idx_init { # with_umask callback
 
         # Now that all subprocesses are up, we can open the FDs
         # for SQLite:
-        my $mm = $self->{mm} = PublicInbox::Msgmap->new_file(
-                                "$ibx->{inboxdir}/msgmap.sqlite3",
-                                $ibx->{-no_fsync} ? 2 : 1);
+        my $mm = $self->{mm} = PublicInbox::Msgmap->new_file($ibx, 1);
         $mm->{dbh}->begin_work;
 }
 
diff --git a/t/altid.t b/t/altid.t
index 87635b19..3ce08a6a 100644
--- a/t/altid.t
+++ b/t/altid.t
@@ -15,7 +15,7 @@ my $altid = [ "serial:gmane:file=$alt_file" ];
 my $ibx;
 
 {
-        my $mm = PublicInbox::Msgmap->new_file($alt_file, 1);
+        my $mm = PublicInbox::Msgmap->new_file($alt_file, 2);
         is($mm->mid_set(1234, 'a@example.com'), 1, 'mid_set once OK');
         ok(0 == $mm->mid_set(1234, 'a@example.com'), 'mid_set not idempotent');
         ok(0 == $mm->mid_set(1, 'a@example.com'), 'mid_set fails with dup MID');
@@ -48,7 +48,7 @@ EOF
 };
 
 {
-        my $mm = PublicInbox::Msgmap->new_file($alt_file, 1);
+        my $mm = PublicInbox::Msgmap->new_file($alt_file, 2);
         my ($min, $max) = $mm->minmax;
         my $num = $mm->mid_insert('b@example.com');
         ok($num > $max, 'auto-increment goes beyond mid_set');
diff --git a/t/altid_v2.t b/t/altid_v2.t
index 47ebec85..281a09d5 100644
--- a/t/altid_v2.t
+++ b/t/altid_v2.t
@@ -13,7 +13,7 @@ my $altid = [ "serial:gmane:file=$another" ];
 my $ibx = create_inbox 'v2', version => 2, indexlevel => 'medium',
                         altid => $altid, sub {
         my ($im, $ibx) = @_;
-        my $mm = PublicInbox::Msgmap->new_file("$ibx->{inboxdir}/$another", 1);
+        my $mm = PublicInbox::Msgmap->new_file("$ibx->{inboxdir}/$another", 2);
         $mm->mid_set(1234, 'a@example.com') == 1 or BAIL_OUT 'mid_set once';
         ok(0 == $mm->mid_set(1234, 'a@example.com'), 'mid_set not idempotent');
         ok(0 == $mm->mid_set(1, 'a@example.com'), 'mid_set fails with dup MID');
@@ -26,7 +26,7 @@ Message-ID: <a@example.com>
 hello world gmane:666
 EOF
 };
-my $mm = PublicInbox::Msgmap->new_file("$ibx->{inboxdir}/$another", 1);
+my $mm = PublicInbox::Msgmap->new_file("$ibx->{inboxdir}/$another", 2);
 ok(0 == $mm->mid_set(1234, 'a@example.com'), 'mid_set not idempotent');
 ok(0 ==  $mm->mid_set(1, 'a@example.com'), 'mid_set fails with dup MID');
 my $mset = $ibx->search->mset('gmane:1234');
diff --git a/t/filter_rubylang.t b/t/filter_rubylang.t
index 81799451..4e9695e1 100644
--- a/t/filter_rubylang.t
+++ b/t/filter_rubylang.t
@@ -44,7 +44,7 @@ EOF
         $mime = PublicInbox::Eml->new($msg);
         $ret = $f->delivery($mime);
         is($ret, $mime, "delivery successful");
-        my $mm = PublicInbox::Msgmap->new($git_dir);
+        my $mm = $ibx->mm;
         is($mm->num_for('a@b'), 12, 'MM entry created based on X-ML-Count');
 
         $msg = <<'EOF';
diff --git a/t/init.t b/t/init.t
index 752e5af9..4bec6a2f 100644
--- a/t/init.t
+++ b/t/init.t
@@ -199,7 +199,8 @@ SKIP: {
         $err = '';
         ok(run_script([qw(-mda --no-precheck)], $env, $rdr), 'deliver V1');
         diag "err=$err" if $err;
-        $mm = PublicInbox::Msgmap->new("$tmpdir/skip4");
+        $mm = PublicInbox::Msgmap->new_file(
+                        "$tmpdir/skip4/public-inbox/msgmap.sqlite3");
         $n = $mm->num_for($mid);
         is($n, 13, 'V1 NNTP article numbers skipped via --skip-artnum');
 }
diff --git a/t/msgmap.t b/t/msgmap.t
index 2d462dfb..a3b7200f 100644
--- a/t/msgmap.t
+++ b/t/msgmap.t
@@ -7,7 +7,8 @@ use PublicInbox::TestCommon;
 require_mods('DBD::SQLite');
 use_ok 'PublicInbox::Msgmap';
 my ($tmpdir, $for_destroy) = tmpdir();
-my $d = PublicInbox::Msgmap->new($tmpdir, 1);
+my $f = "$tmpdir/msgmap.sqlite3";
+my $d = PublicInbox::Msgmap->new_file($f, 1);
 
 my %mid2num;
 my %num2mid;
@@ -50,7 +51,7 @@ is($d->mid_delete('a@b') + 0, 0, 'delete again returns zero');
 is(undef, $d->num_for('a@b'), 'num_for fails on deleted msg');
 $d = undef;
 
-ok($d = PublicInbox::Msgmap->new($tmpdir, 1), 'idempotent DB creation');
+ok($d = PublicInbox::Msgmap->new_file($f, 1), 'idempotent DB creation');
 my ($min, $max) = $d->minmax;
 ok($min > 0, "article min OK");
 ok($max > 0 && $max < 10, "article max OK");