fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2010-11-15 04:59 am

[dw-free] http://bugs.dwscoalition.org/show_bug.cgi?id=1967

[commit: http://hg.dwscoalition.org/dw-free/rev/aa701ad5eac3]

http://bugs.dwscoalition.org/show_bug.cgi?id=1967

Truncate the userprops in code instead of relying on MySQL truncation.

Patch by [personal profile] fu.

Files modified:
  • cgi-bin/LJ/User.pm
--------------------------------------------------------------------------------
diff -r 46101c7610c8 -r aa701ad5eac3 cgi-bin/LJ/User.pm
--- a/cgi-bin/LJ/User.pm	Mon Nov 15 11:54:28 2010 +0800
+++ b/cgi-bin/LJ/User.pm	Mon Nov 15 12:59:06 2010 +0800
@@ -2854,6 +2854,15 @@ sub set_prop {
     my %multihomed;  # { $propid => $value }
     my %propnames;   # { $propid => $propname }
 
+    # enforce limits on data in the code
+    # to make sure that memcache and db data are consistent after a save
+    my %table_values_lengths = (
+        userprop => 60,
+        userproplite => 255,
+        userproplite2 => 255,
+        # userpropblob => ...,
+    );
+
     # Accumulate prepared actions.
     foreach my $propname ( keys %$hash ) {
         $value = $hash->{$propname};
@@ -2890,6 +2899,8 @@ sub set_prop {
 
         # determine if this is a replacement or a deletion
         if ( defined $value && $value ) {
+            $value = LJ::text_trim( $value, undef, $table_values_lengths{$table} )
+                        if defined $table_values_lengths{$table};
             push @{ $action{$table}->{replace} }, [ $p->{id}, $value ];
         } else {
             push @{ $action{$table}->{delete} }, $p->{id};
@@ -2931,9 +2942,11 @@ sub set_prop {
 
         while ( my ( $propid, $pvalue ) = each %multihomed ) {
             if ( defined $pvalue && $pvalue ) {
+                my $uprop_pvalue = LJ::text_trim( $pvalue, undef, $table_values_lengths{userprop} );
+
                 # replace data into master
                 $dbh->do( "REPLACE INTO userprop VALUES (?, ?, ?)",
-                          undef, $userid, $propid, $pvalue );
+                          undef, $userid, $propid, $uprop_pvalue );
             } else {
                 # delete data from master, but keep in cluster
                 $dbh->do( "DELETE FROM userprop WHERE userid = ? AND upropid = ?",
@@ -2944,7 +2957,7 @@ sub set_prop {
             return 0 if $dbh->err;
 
             # put data in cluster
-            $pvalue ||= '';
+            $pvalue = $pvalue ? LJ::text_trim( $pvalue, undef, $table_values_lengths{userproplite2} ) : '';
             $u->do( "REPLACE INTO userproplite2 VALUES (?, ?, ?)",
                     undef, $userid, $propid, $pvalue );
             return 0 if $u->err;
--------------------------------------------------------------------------------

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org