Committer: nnikulochkina
LJSUP-14463: XML-RPC: To extend getevents functionU trunk/cgi-bin/ljprotocol.pl
Modified: trunk/cgi-bin/ljprotocol.pl =================================================================== --- trunk/cgi-bin/ljprotocol.pl 2012-12-03 14:18:18 UTC (rev 23409) +++ trunk/cgi-bin/ljprotocol.pl 2012-12-04 07:49:52 UTC (rev 23410) @@ -104,6 +104,7 @@ "222" => E_PERM, "223" => E_TEMP, "224" => E_TEMP, + "225" => E_TEMP, # Access Errors "300" => E_TEMP, @@ -4181,6 +4182,81 @@ my $in = join(',', @ids) || "0"; $where = "AND jitemid IN ($in)"; } + elsif ($req->{'selecttype'} eq 'tag') { + + my $empty_res = { + skip => $skip, + xc3 => { u => $u }, + events => [], + }; + + my $howmany = $req->{'howmany'} || 20; + if ($howmany > 50) { $howmany = 50; } + $howmany = $howmany + 0; + + $limit = "LIMIT $howmany"; + $offset = "OFFSET $skip"; + + my $jitemids; + + my ($tagids, $tagnames, $tags, $known_tags) = ([], [], {}, {}); + + return fail($err,225) + unless LJ::Tags::is_valid_tagstring($req->{'tags'}, $tagnames, { omit_underscore_check => 1 }); + + $tags = LJ::Tags::get_usertags($uowner, { remote => $u }); + + return $empty_res unless $tags && %$tags; + + while ( my ($tid, $tag) = each %$tags ) { + $known_tags->{LJ::Text->normalize_tag_name($tag->{name})} = $tid; + } + + my $tagmode = lc $req->{'tagmode'}; + + $tagids = [ map { + my $tid = $known_tags->{LJ::Text->normalize_tag_name($_)}; + $tid ? + $tid : + ( $tagmode eq 'and' ? return $empty_res : () ); + } @$tagnames ]; + + return $empty_res unless $tagids && @$tagids; + + if ($tagmode eq 'and') { + + my $limit = $LJ::TAG_INTERSECTION; + $#{$tagids} = $limit - 1 if @{$tagids} > $limit; + my $in = join(',', map { $_+0 } @{$tagids}); + my $sth = $dbcr->prepare("SELECT jitemid, kwid FROM logtagsrecent WHERE journalid = ? AND kwid IN ($in)"); + $sth->execute($ownerid); + + my %mix; + while (my $row = $sth->fetchrow_arrayref) { + my ($jitemid, $kwid) = @$row; + $mix{$jitemid}++; + } + + my $need = @{$tagids}; + foreach my $jitemid (keys %mix) { + delete $mix{$jitemid} if $mix{$jitemid} < $need; + } + + $jitemids = [keys %mix]; + } else { # mode: 'or' + # select jitemids uniquely + my $in = join(',', map { $_+0 } @{$tagids}); + $jitemids = $dbcr->selectcol_arrayref(qq{ + SELECT DISTINCT jitemid FROM logtagsrecent WHERE journalid = ? AND kwid IN ($in) + }, undef, $ownerid); + } + + return $empty_res unless @$jitemids; + + $where = " AND jitemid IN (" . + join(',', map { $_ + 0 } @$jitemids) . + ")"; + } else { return fail($err,200,'xmlrpc.des.bad_value',{'param'=>'selecttype'}); }