Put the domain mapping into memcache, for efficiency, so we don't have 
to hit the database each time.

        Patch by exor674, based on modifications by LiveJournal. 

diffs (79 lines):

diff -r d52d1bafeb4c -r dceb5bb4ce05 cgi-bin/Apache/LiveJournal.pm
--- a/cgi-bin/Apache/LiveJournal.pm     Tue Apr 20 09:12:44 2010 +0000
+++ b/cgi-bin/Apache/LiveJournal.pm     Tue Apr 20 02:22:07 2010 -0700
@@ -874,11 +874,15 @@ sub trans
         my $checkhost = lc($host);
         $checkhost =~ s/^www\.//i;
         $checkhost = $dbr->quote($checkhost);
-        # FIXME: memcache this?
-        my $user = $dbr->selectrow_array(qq{
-            SELECT u.user FROM useridmap u, domains d WHERE
-            u.userid=d.userid AND d.domain=$checkhost
-        });
+        my $key = "domain:$host";
+        my $userid = LJ::MemCache::get($key);
+        unless (defined $userid) {
+            my $db = LJ::get_db_reader();
+            ($userid) = $db->selectrow_array(qq{SELECT userid FROM domains 
WHERE domain=?}, undef, $host);
+            $userid ||= 0; ## we do cache negative results - if no user for 
such domain, set userid=0
+            LJ::MemCache::set($key, $userid);
+        }
+        my $user = LJ::load_userid($userid)->user;
         return 404 unless $user;
 
         my $view = $determine_view->($user, "other:$host$hostport", $uri);
diff -r d52d1bafeb4c -r dceb5bb4ce05 cgi-bin/LJ/Setting/DomainMapping.pm
--- a/cgi-bin/LJ/Setting/DomainMapping.pm       Tue Apr 20 09:12:44 2010 +0000
+++ b/cgi-bin/LJ/Setting/DomainMapping.pm       Tue Apr 20 02:22:07 2010 -0700
@@ -43,12 +43,14 @@ sub save {
     $class->errors(domainname => "Can't point to a domain on this site") if 
$domainname =~ /$LJ::DOMAIN\b/;
 
     # Blank domain = delete mapping
-    if ($domainname eq "") {
-        $dbh->do("DELETE FROM domains WHERE userid=?", undef, $u->{userid});
+    if ( $domainname eq "" ) {
+        $dbh->do( "DELETE FROM domains WHERE userid=?", undef, $u->userid );
+        LJ::MemCache::delete( "domain:" . $u->prop( "journaldomain" ) );
         $u->set_prop("journaldomain", "");
     # If they're able to, change the mapping and update the userprop
-    } elsif ($has_cap) {
+    } elsif ( $has_cap ) {
         return if $domainname eq $u->prop('journaldomain');
+        LJ::MemCache::delete( "domain:" . $u->prop( "journaldomain" ) );
         $dbh->do("INSERT INTO domains VALUES (?, ?)", undef, $domainname, 
$u->{'userid'});
         if ($dbh->err) {
             my $otherid = $dbh->selectrow_array("SELECT userid FROM domains 
WHERE domain=?",
@@ -58,8 +60,9 @@ sub save {
                 return;
             }
         }
-        $u->set_prop("journaldomain", $domainname);
-        if ($u->prop('journaldomain')) {
+        $u->set_prop( "journaldomain", $domainname );
+        LJ::MemCache::set( "domain:$domainname", $u->userid );
+        if ( $u->prop( 'journaldomain' ) ) {
             $dbh->do("DELETE FROM domains WHERE userid=? AND domain <> ?",
                      undef, $u->{'userid'}, $domainname);
         }
diff -r d52d1bafeb4c -r dceb5bb4ce05 htdocs/manage/domain.bml
--- a/htdocs/manage/domain.bml  Tue Apr 20 09:12:44 2010 +0000
+++ b/htdocs/manage/domain.bml  Tue Apr 20 02:22:07 2010 -0700
@@ -76,14 +76,17 @@ body<=
             return LJ::bad_input( $ML{'.error.samedomainalias'} ) if $dom =~ 
/$LJ::DOMAIN\b/;
 
             if ( ( $dom_cap && !$dom ) || ( !$dom_cap && 
$POST{journaldomain_del} ) ) {
-                $dbh->do( "DELETE FROM domains WHERE userid=?", undef, 
$u->{userid} );
+                $dbh->do( "DELETE FROM domains WHERE userid=?", undef, 
$u->userid );
+                LJ::MemCache::delete( "domain:" . $u->prop( "journaldomain" ) 
);
             } else {
+                LJ::MemCache::delete( "domain:" . $u->prop( "journaldomain" ) 
);
                 $dbh->do("INSERT INTO domains VALUES (?, ?)", undef, $dom, 
$u->{'userid'});
                 if ($dbh->err) {
                     my $otherid = $dbh->selectrow_array("SELECT userid FROM 
domains WHERE domain=?",
                                                         undef, $dom);
                     return LJ::bad_input($ML{'.error.dupdomainalias'}) if 
$otherid != $u->{'userid'};
                 }
+                LJ::MemCache::set( "domain:" . $dom, $u->userid );
                 if ($u->{'journaldomain'}) {
                     $dbh->do("DELETE FROM domains WHERE userid=? AND domain <> 
?",
                              undef, $u->{'userid'}, $dom);
_______________________________________________
dw-changelog mailing list
[email protected]
http://lists.dwscoalition.org/mailman/listinfo/dw-changelog

Reply via email to