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...
$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);
}
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);
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;
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);
};
}
# 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;
}
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');
};
{
- 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');
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');
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');
$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';
$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');
}
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;
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");