X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FOver.pm;h=a7fd1315c3af88269b02bf2c6289be86c1541700;hb=f91753f00b760c0e06eb0384792e5b18bd99bb0f;hp=c74072a26c063ea3c8acaebf1b06f9da34ba03a8;hpb=87dca6d8d5988c5eb54019cca342450b0b7dd6b7;p=public-inbox.git diff --git a/lib/PublicInbox/Over.pm b/lib/PublicInbox/Over.pm index c74072a2..a7fd1315 100644 --- a/lib/PublicInbox/Over.pm +++ b/lib/PublicInbox/Over.pm @@ -51,42 +51,54 @@ sub do_get { my $dbh = $self->connect; my $lim = (($opts->{limit} || 0) + 0) || 1000; my $off = (($opts->{offset} || 0) + 0) || 0; - $sql .= "LIMIT $lim OFFSET $off"; + $sql .= "LIMIT $lim"; + $sql .= " OFFSET $off" if $off > 0; my $msgs = $dbh->selectall_arrayref($sql, { Slice => {} }, @args); load_from_row($_) for @$msgs; $msgs } sub query_xover { - my ($self, $beg, $end, $off) = @_; - do_get($self, <<'', { offset => $off }, $beg, $end); + my ($self, $beg, $end) = @_; + do_get($self, <<'', {}, $beg, $end); SELECT * FROM over WHERE num >= ? AND num <= ? ORDER BY num ASC } sub query_ts { - my ($self, $ts, $opts) = @_; - do_get($self, <<'', $opts, $ts); -SELECT * FROM over WHERE num > 0 AND ts >= ? -ORDER BY ts ASC + my ($self, $ts, $prev) = @_; + do_get($self, <<'', {}, $ts, $prev); +SELECT num,ddd FROM over WHERE ts >= ? AND num > ? +ORDER BY num ASC } +sub nothing () { wantarray ? (0, []) : [] }; + sub get_thread { my ($self, $mid, $opts) = @_; my $dbh = $self->connect; - my ($tid, $sid) = $dbh->selectrow_array(<<'', undef, $mid); -SELECT tid,sid FROM over -LEFT JOIN id2num ON over.num = id2num.num -LEFT JOIN msgid ON id2num.id = msgid.id -WHERE msgid.mid = ? AND over.num > 0 -LIMIT 1 + + my $id = $dbh->selectrow_array(<<'', undef, $mid); +SELECT id FROM msgid WHERE mid = ? LIMIT 1 + + defined $id or return nothing; + + my $num = $dbh->selectrow_array(<<'', undef, $id); +SELECT num FROM id2num WHERE id = ? AND num > 0 +ORDER BY num ASC LIMIT 1 + + defined $num or return nothing; + + my ($tid, $sid) = $dbh->selectrow_array(<<'', undef, $num); +SELECT tid,sid FROM over WHERE num = ? LIMIT 1 + + defined $tid or return nothing; # $sid may be undef my $cond = 'FROM over WHERE (tid = ? OR sid = ?) AND num > 0'; my $msgs = do_get($self, <<"", $opts, $tid, $sid); -SELECT * $cond -ORDER BY ts ASC +SELECT * $cond ORDER BY ts ASC return $msgs unless wantarray;