X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FOver.pm;h=309e044af91a1b35907b057750afe930d6a9b081;hb=fad9acd35e56a289ade90a62d056b2a6663d448c;hp=b230d44a105791442f7262d7cb6b6be6686c45a0;hpb=b9534449ecce2c59bb4aebad6051f91c3116b187;p=public-inbox.git diff --git a/lib/PublicInbox/Over.pm b/lib/PublicInbox/Over.pm index b230d44a..309e044a 100644 --- a/lib/PublicInbox/Over.pm +++ b/lib/PublicInbox/Over.pm @@ -50,9 +50,7 @@ sub do_get { my ($self, $sql, $opts, @args) = @_; my $dbh = $self->connect; my $lim = (($opts->{limit} || 0) + 0) || 1000; - my $off = (($opts->{offset} || 0) + 0) || 0; $sql .= "LIMIT $lim"; - $sql .= " OFFSET $off" if $off > 0; my $msgs = $dbh->selectall_arrayref($sql, { Slice => {} }, @args); load_from_row($_) for @$msgs; $msgs @@ -77,7 +75,7 @@ ORDER BY num ASC sub nothing () { wantarray ? (0, []) : [] }; sub get_thread { - my ($self, $mid, $opts) = @_; + my ($self, $mid, $prev) = @_; my $dbh = $self->connect; my $id = $dbh->selectrow_array(<<'', undef, $mid); @@ -96,13 +94,14 @@ 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 + $prev ||= 0; + my $cond = 'FROM over WHERE (tid = ? OR sid = ?) AND num > ?'; + my $msgs = do_get($self, <<"", {}, $tid, $sid, $prev); +SELECT * $cond ORDER BY num ASC return $msgs unless wantarray; - my $nr = $dbh->selectrow_array(<<"", undef, $tid, $sid); + my $nr = $dbh->selectrow_array(<<"", undef, $tid, $sid, $prev); SELECT COUNT(num) $cond ($nr, $msgs); @@ -148,4 +147,33 @@ SELECT * from OVER where num = ? LIMIT 1 undef; } +sub next_by_mid { + my ($self, $mid, $id, $prev) = @_; + my $dbh = $self->connect; + + unless (defined $$id) { + my $sth = $dbh->prepare_cached(<<'', undef, 1); + SELECT id FROM msgid WHERE mid = ? LIMIT 1 + + $sth->execute($mid); + $$id = $sth->fetchrow_array; + defined $$id or return; + } + my $sth = $dbh->prepare_cached(<<"", undef, 1); +SELECT num FROM id2num WHERE id = ? AND num > ? +ORDER BY num ASC LIMIT 1 + + $$prev ||= 0; + $sth->execute($$id, $$prev); + my $num = $sth->fetchrow_array or return; + $$prev = $num; + + $sth = $dbh->prepare_cached(<<"", undef, 1); +SELECT num,ts,ds,ddd FROM over WHERE num = ? LIMIT 1 + + $sth->execute($num); + my $smsg = $sth->fetchrow_hashref or return; + load_from_row($smsg); +} + 1;