-sub each_id_batch {
- my ($self, $cb) = @_;
- my $dbh = $self->{dbh};
- 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);
+# used by NNTP.pm
+sub ids_after {
+ my ($self, $num) = @_;
+ my $ids = $self->{dbh}->selectcol_arrayref(<<'', undef, $$num);
+SELECT num FROM msgmap WHERE num > ?
+ORDER BY num ASC LIMIT 1000
+
+ $$num = $ids->[-1] if @$ids;
+ $ids;
+}
+
+# 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";