$eml_cb->($uri, $uid, $kw, PublicInbox::Eml->new($raw), @args);
}
+sub run_commit_cb ($) {
+ my ($self) = @_;
+ my $cmt_cb_args = $self->{on_commit} or return;
+ my ($cb, @args) = @$cmt_cb_args;
+ $cb->(@args);
+}
+
sub _imap_fetch_all ($$$) {
my ($self, $mic, $uri) = @_;
my $sec = uri_section($uri);
# I wish "UID FETCH $START:*" could work, but:
# 1) servers do not need to return results in any order
# 2) Mail::IMAPClient doesn't offer a streaming API
- $uids = $mic->search("UID $l_uid:*") or
+ unless ($uids = $mic->search("UID $l_uid:*")) {
+ return if $!{EINTR} && $self->{quit};
return "E: $uri UID SEARCH $l_uid:* error: $!";
+ }
return if scalar(@$uids) == 0;
# RFC 3501 doesn't seem to indicate order of UID SEARCH
local $0 = "UID:$batch $mbx $sec";
my $r = $mic->fetch_hash($batch, $req, 'FLAGS');
unless ($r) { # network error?
+ last if $!{EINTR} && $self->{quit};
$err = "E: $uri UID FETCH $batch error: $!";
last;
}
}
last if $self->{quit};
}
+ run_commit_cb($self);
$itrk->update_last($r_uidval, $last_uid) if $itrk;
} until ($err || $self->{quit});
$err;
local $self->{eml_each} = [ $eml_cb, @args ];
$err = _imap_fetch_all($self, $mic, $uri);
} else {
- $err = "E: not connected: $!";
+ $err = "E: <$uri> not connected: $!";
}
warn $err if $err;
$mic;
last if $self->{quit};
$art = $_;
if (--$n < 0) {
+ run_commit_cb($self);
$itrk->update_last(0, $last_art) if $itrk;
$n = $self->{max_batch};
}
$eml_cb->($uri, $art, [], PublicInbox::Eml->new(\$raw), @args);
$last_art = $art;
}
+ run_commit_cb($self);
$itrk->update_last(0, $last_art) if $itrk;
$err;
}
my $sec = uri_section($uri);
local $0 = $uri->group ." $sec";
my $nn = nn_get($self, $uri);
+ return if $self->{quit};
my $err;
if ($nn) {
local $self->{eml_each} = [ $eml_cb, @args ];
$err = _nntp_fetch_all($self, $nn, $uri);
} else {
- $err = "E: not connected: $!";
+ $err = "E: <$uri> not connected: $!";
}
warn $err if $err;
$nn;