}
sub uid_search_uid_range { # long_response
- my ($self, $tag, $beg, $end) = @_;
- my $uids = $self->{ibx}->mm->msg_range($beg, $end, 'num');
+ my ($self, $tag, $beg, $end, $sql) = @_;
+ my $uids = $self->{ibx}->over->uid_range($$beg, $end, $sql);
if (@$uids) {
- $self->msg_more(join('', map { " $_->[0]" } @$uids));
+ $$beg = $uids->[-1] + 1;
+ $self->msg_more(join(' ', '', @$uids));
} else {
$self->write(\"\r\n$tag OK Search done\r\n");
undef;
my $ibx = $self->{ibx} or return "$tag BAD No mailbox selected\r\n";
my $q = parse_query($self, \@_);
return "$tag $q\r\n" if !ref($q);
+ my $sql = delete $q->{sql};
if (!scalar(keys %$q)) {
$self->msg_more('* SEARCH');
my $beg = $self->{uid_min} // 1;
my $end = $ibx->mm->max;
uid_clamp($self, \$beg, \$end);
- long_response($self, \&uid_search_uid_range, $tag, \$beg, $end);
+ long_response($self, \&uid_search_uid_range,
+ $tag, \$beg, $end, $sql);
} elsif (my $uid = $q->{uid}) {
if ($uid =~ /\A([0-9]+):([0-9]+|\*)\z/s) {
my ($beg, $end) = ($1, $2);
uid_clamp($self, \$beg, \$end);
$self->msg_more('* SEARCH');
long_response($self, \&uid_search_uid_range,
- $tag, \$beg, $end);
+ $tag, \$beg, $end, $sql);
} elsif ($uid =~ /\A[0-9]+\z/s) {
$uid = $ibx->over->get_art($uid) ? " $uid" : '';
"* SEARCH$uid\r\n$tag OK Search done\r\n";
load_from_row($smsg);
}
+# IMAP search
+sub uid_range {
+ my ($self, $beg, $end, $sql) = @_;
+ my $dbh = $self->connect;
+ my $q = 'SELECT num FROM over WHERE num >= ? AND num <= ?';
+
+ # This is read-only, anyways; but caller should verify it's
+ # only sending \A[0-9]+\z for ds and ts column ranges
+ $q .= $$sql if $sql;
+ $q .= ' ORDER BY num ASC LIMIT ' . DEFAULT_LIMIT;
+ $dbh->selectcol_arrayref($q, undef, $beg, $end);
+}
+
1;
Content-Disposition: attachment; filename="embed2x\.eml"\r
\r
EOF
+
+ my @hits = $mic->search('SENTON' => '18-Apr-2020');
+ is_deeply(\@hits, [ $uidnext ], 'search with date condition works');
+ ok($mic->examine($ng), 'EXAMINE on dummy');
+ @hits = $mic->search('SENTSINCE' => '18-Apr-2020');
+ is_deeply(\@hits, [], 'search on dummy with condition works');
}); # each_inbox
# message sequence numbers :<