- if (defined ${$self->{buf}}) {
- $self->{fh}->write(${$self->{buf}});
- ${$self->{buf}} = undef;
- }
-}
-
-sub write {
- $_[0]->{gz}->write($_[1]);
- _flush_buf($_[0]);
+ my $ctx = $self->{ctx} or return;
+ my $res;
+ my $ibx = $ctx->{-inbox};
+ my $gz = $self->{gz};
+ do {
+ while (defined(my $smsg = shift @{$self->{msgs}})) {
+ my $msg = eval { $ibx->msg_by_mid($smsg->mid) } or next;
+ $msg = Email::Simple->new($msg);
+ $gz->write(PublicInbox::Mbox::msg_str($ctx, $msg));
+ my $bref = $self->{buf};
+ if (length($$bref) >= 8192) {
+ my $ret = $$bref; # copy :<
+ ${$self->{buf}} = '';
+ return $ret;
+ }
+ }
+ $res = $self->{cb}->($self->{opts});
+ $self->{msgs} = $res->{msgs};
+ $res = scalar @{$self->{msgs}};
+ $self->{opts}->{offset} += $res;
+ } while ($res);
+ $gz->close;
+ delete $self->{ctx};
+ ${delete $self->{buf}};