[Rt-commit] rt branch, 4.2/lower-level-ocfv-cache-update-code, created. rt-4.2.14-34-gfc650ef3b

? sunnavy sunnavy at bestpractical.com
Thu Mar 15 17:03:04 EDT 2018


The branch, 4.2/lower-level-ocfv-cache-update-code has been created
        at  fc650ef3b90c48882d79e69c6f2a069ce68dd6dc (commit)

- Log -----------------------------------------------------------------
commit fc650ef3b90c48882d79e69c6f2a069ce68dd6dc
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Mar 16 04:37:48 2018 +0800

    Move OCFV cache update code to OCFV's Create/Delete methods
    
    Thus, OCFV cache is totally implemented in ObjectCustomFieldValue(s),
    other code don't need to know anything about the implementation.

diff --git a/lib/RT/CustomField.pm b/lib/RT/CustomField.pm
index ecf5907bb..62afb67cf 100644
--- a/lib/RT/CustomField.pm
+++ b/lib/RT/CustomField.pm
@@ -1843,10 +1843,6 @@ sub DeleteValueForObject {
         return ( 0, $self->loc('Input must match [_1]', $self->FriendlyPattern) );
     }
 
-    # Clear any cached values
-    my $ocfv_key = $oldval->GetOCFVCacheKey;
-    delete $RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key};
-
     # delete it
 
     my $ret = $oldval->Delete();
diff --git a/lib/RT/ObjectCustomFieldValue.pm b/lib/RT/ObjectCustomFieldValue.pm
index f5f66c12f..22eee1351 100644
--- a/lib/RT/ObjectCustomFieldValue.pm
+++ b/lib/RT/ObjectCustomFieldValue.pm
@@ -107,7 +107,7 @@ sub Create {
         $self->_EncodeLOB( $args{'LargeContent'}, $args{'ContentType'} )
             if defined $args{'LargeContent'};
 
-    return $self->SUPER::Create(
+    ( my $id, $msg ) = $self->SUPER::Create(
         CustomField     => $args{'CustomField'},
         ObjectType      => $args{'ObjectType'},
         ObjectId        => $args{'ObjectId'},
@@ -117,6 +117,23 @@ sub Create {
         ContentType     => $args{'ContentType'},
         ContentEncoding => $args{'ContentEncoding'},
     );
+
+    if ( $id ) {
+        my $new_value = RT::ObjectCustomFieldValue->new( $self->CurrentUser );
+        $new_value->Load( $id );
+        my $ocfv_key = $new_value->GetOCFVCacheKey();
+        if ( $RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key} ) {
+            push @{ $RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key} },
+              {
+                'ObjectId'       => $new_value->Id,
+                'CustomFieldObj' => $new_value->CustomFieldObj,
+                'Content'        => $new_value->_Value('Content'),
+                'LargeContent'   => $new_value->LargeContent,
+              };
+        }
+    }
+
+    return wantarray ? ( $id, $msg ) : $id;
 }
 
 
@@ -288,7 +305,15 @@ Disable this value. Used to remove "current" values from records while leaving t
 
 sub Delete {
     my $self = shift;
-    return $self->SetDisabled(1);
+    my ( $ret, $msg ) = $self->SetDisabled( 1 );
+    if ( $ret ) {
+        my $ocfv_key = $self->GetOCFVCacheKey();
+        if ( $RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key} ) {
+            @{ $RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key} } =
+              grep { $_->{'ObjectId'} == $self->Id } @{ $RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key} };
+        }
+    }
+    return wantarray ? ( $ret, $msg ) : $ret;
 }
 
 =head2 _FillInTemplateURL URL
diff --git a/lib/RT/Record.pm b/lib/RT/Record.pm
index 9c1ab8d75..ee460af11 100644
--- a/lib/RT/Record.pm
+++ b/lib/RT/Record.pm
@@ -2050,26 +2050,12 @@ sub _AddCustomFieldValue {
         my $new_value = RT::ObjectCustomFieldValue->new( $self->CurrentUser );
         $new_value->Load( $new_value_id );
 
-        # Prepare to update the OCFV cache
-        my $ocfv_key = $new_value->GetOCFVCacheKey;
-
         # now that adding the new value was successful, delete the old one
         if ( $old_value ) {
-            # Remove old cached value
-            @{$RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key}} =
-                grep { $_->{'ObjectId'} == $old_value->Id } @{$RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key}};
-
             my ( $val, $msg ) = $old_value->Delete();
             return ( 0, $msg ) unless $val;
         }
 
-        # Add the new one
-        push @{$RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key}}, {
-            'ObjectId'       => $new_value->Id,
-            'CustomFieldObj' => $new_value->CustomFieldObj,
-            'Content'        => $args{'Value'},
-            'LargeContent'   => $args{'LargeContent'} };
-
         if ( $args{'RecordTransaction'} ) {
             my ( $TransactionId, $Msg, $TransactionObj ) =
               $self->_NewTransaction(
@@ -2132,17 +2118,6 @@ sub _AddCustomFieldValue {
             return ( 0, $self->loc( "Could not add new custom field value: [_1]", $msg ) );
         }
 
-        my $new_value = RT::ObjectCustomFieldValue->new( $self->CurrentUser );
-        $new_value->Load( $new_value_id );
-
-        # Update the OCFV cache
-        my $ocfv_key = $new_value->GetOCFVCacheKey;
-        push @{$RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key}}, {
-            'ObjectId'       => $new_value->Id,
-            'CustomFieldObj' => $new_value->CustomFieldObj,
-            'Content'        => $args{'Value'},
-            'LargeContent'   => $args{'LargeContent'} };
-
         if ( $args{'RecordTransaction'} ) {
             my ( $tid, $msg ) = $self->_NewTransaction(
                 Type          => 'CustomField',

-----------------------------------------------------------------------


More information about the rt-commit mailing list