Committer: ailyin
LJSUP-13609 (FriendsPage redesign)U trunk/cgi-bin/LJ/Entry.pm
Modified: trunk/cgi-bin/LJ/Entry.pm =================================================================== --- trunk/cgi-bin/LJ/Entry.pm 2012-09-18 11:50:59 UTC (rev 22917) +++ trunk/cgi-bin/LJ/Entry.pm 2012-09-18 12:19:31 UTC (rev 22918) @@ -2424,6 +2424,9 @@ $kill_mem = 1 unless $prop eq "commentalter"; + my $memkey_ind = [ $uid, "log2indprop:$uid:$jitemid:$prop->{'id'}" ]; + LJ::MemCache::delete($memkey_ind); + if ($v) { $ins_values .= "," if $ins_values; $ins_values .= "($uid, $jitemid, $prop->{'id'}, " . $u->quote($v) . ")"; @@ -2594,6 +2597,85 @@ _get_posts_raw_wrapper($ids, "prop", $props); } +sub load_individual_props_multi { + my ( $u, $jitemids, $propnames ) = @_; + + my $userid = $u->userid; + + my ( @propids, %propname_map ); + foreach my $propname (@$propnames) { + my $prop = LJ::get_prop( 'log', $propname ); + die "Unknown prop $propname" unless $prop; + + my $propid = $prop->{'propid'}; + + push @propids, $propid; + $propname_map{$propid} = $propname; + } + + my @memkeys; + foreach my $jitemid (@$jitemids) { + foreach my $propid (@propids) { + push @memkeys, [ $userid, "log2indprop:$userid:$jitemid:$propid" ]; + } + } + + my $memcache_result = LJ::MemCache::get_multi(@memkeys); + + my ( %remaining_jitemids, %ret ); + foreach my $key_and_hash (@memkeys) { + my $key = $key_and_hash->[1]; + my ( undef, undef, $jitemid, $propid ) = split /:/, $key; + my $propname = $propname_map{$propid}; + + if ( defined $memcache_result->{$key} ) { + $ret{$jitemid} ||= {}; + $ret{$jitemid}->{$propname} = $memcache_result->{$key}; + } else { + $remaining_jitemids{$jitemid} = 1; + } + } + + return \%ret unless %remaining_jitemids; + + my $jitemids_in = join( ',', keys %remaining_jitemids ); + my $propids_in = join( ',', @propids ); + + my $udbh = LJ::get_cluster_master($u); + my $rows = $udbh->selectall_arrayref( + "SELECT jitemid, propid, value FROM logprop2 " . + "WHERE journalid=? AND " . + "jitemid IN ($jitemids_in) AND propid IN ($propids_in)", + { 'Slice' => {} }, $userid, + ); + + my %props_from_db; + foreach my $row (@$rows) { + my $jitemid = $row->{'jitemid'}; + my $propid = $row->{'propid'}; + + $props_from_db{$jitemid} ||= {}; + $props_from_db{$jitemid}->{$propid} = $row->{'value'}; + } + + foreach my $propid (@propids) { + my $propname = $propname_map{$propid}; + + foreach my $jitemid ( keys %remaining_jitemids ) { + $props_from_db{$jitemid} ||= {}; + $props_from_db{$jitemid}->{$propid} ||= ''; + + my $propval = $props_from_db{$jitemid}->{$propid}; + my $memkey = [ $userid, "log2indprop:$userid:$jitemid:$propid" ]; + + LJ::MemCache::set( $memkey, $propval ); + $ret{$jitemid}->{$propname} = $propval; + } + } + + return \%ret; +} + # <LJFUNC> # name: LJ::delete_entry # des: Deletes a user's journal entry