- my $n = 0;
- my $total = 0;
- my $nr;
- my $sth = $dbh->prepare('SELECT num FROM msgmap WHERE num > ? '.
- 'ORDER BY num ASC LIMIT 1000');
- while (1) {
- $sth->execute($n);
- my $ary = $sth->fetchall_arrayref;
- @$ary = map { $_->[0] } @$ary;
- $nr = scalar @$ary;
- last if $nr == 0;
- $total += $nr;
- $n = $ary->[-1];
- $cb->($ary);
+ my $attr = { Columns => [] };
+ my $mids = $dbh->selectall_arrayref(<<'', $attr, $$beg, $end);
+SELECT num,mid FROM msgmap WHERE num >= ? AND num <= ?
+ORDER BY num ASC
+
+ $$beg = $mids->[-1]->[0] + 1 if @$mids;
+ $mids
+}
+
+# only used for mapping external serial numbers (e.g. articles from gmane)
+# see scripts/xhdr-num2mid or PublicInbox::Filter::RubyLang for usage
+sub mid_set {
+ my ($self, $num, $mid) = @_;
+ my $sth = $self->{mid_set} ||= do {
+ $self->{dbh}->prepare(
+ 'INSERT OR IGNORE INTO msgmap (num,mid) VALUES (?,?)');
+ };
+ $sth->execute($num, $mid);
+}
+
+sub DESTROY {
+ my ($self) = @_;
+ delete $self->{dbh};
+ my $f = delete $self->{tmp_name};
+ if (defined $f && $self->{pid} == $$) {
+ unlink $f or warn "failed to unlink $f: $!\n";