-# Copyright (C) 2015-2018 all contributors <meta@public-inbox.org>
+# Copyright (C) 2015-2020 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
# bidirectional Message-ID <-> Article Number mapping for the NNTP
if ($writable) {
create_tables($dbh);
+
+ # TRUNCATE reduces I/O compared to the default (DELETE)
+ $dbh->do('PRAGMA journal_mode = TRUNCATE');
+
$dbh->begin_work;
$self->created_at(time) unless $self->created_at;
$self->{dbh}->sqlite_backup_to_file($fn);
my $tmp = ref($self)->new_file($fn, 1);
$tmp->{dbh}->do('PRAGMA synchronous = OFF');
+ $tmp->{dbh}->do('PRAGMA journal_mode = MEMORY');
$tmp->{tmp_name} = $fn; # SQLite won't work if unlinked, apparently
$tmp->{pid} = $$;
close $fh or die "failed to close $fn: $!";
my ($self, $mid) = @_;
my $dbh = $self->{dbh};
my $sth = $dbh->prepare_cached(<<'');
-INSERT OR IGNORE INTO msgmap (mid) VALUES (?)
+INSERT INTO msgmap (mid) VALUES (?)
- return if $sth->execute($mid) == 0;
+ return unless eval { $sth->execute($mid) };
my $num = $dbh->last_insert_id(undef, undef, 'msgmap', 'num');
- $self->num_highwater($num) unless !defined($num);
+ $self->num_highwater($num) if defined($num);
$num;
}
}
sub msg_range {
- my ($self, $beg, $end) = @_;
+ my ($self, $beg, $end, $cols) = @_;
+ $cols //= 'num,mid';
my $dbh = $self->{dbh};
my $attr = { Columns => [] };
- my $mids = $dbh->selectall_arrayref(<<'', $attr, $$beg, $end);
-SELECT num,mid FROM msgmap WHERE num >= ? AND num <= ?
+ my $mids = $dbh->selectall_arrayref(<<"", $attr, $$beg, $end);
+SELECT $cols FROM msgmap WHERE num >= ? AND num <= ?
ORDER BY num ASC LIMIT 1000
$$beg = $mids->[-1]->[0] + 1 if @$mids;