[Rt-commit] rt branch 5.0/validator-skip-deleted-with-contenthistory created. rt-5.0.2-61-g231b5a6422

BPS Git Server git at git.bestpractical.com
Fri Feb 4 23:18:04 UTC 2022


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "rt".

The branch, 5.0/validator-skip-deleted-with-contenthistory has been created
        at  231b5a642236ee303c285c9bbb7ff2df3c3686b8 (commit)

- Log -----------------------------------------------------------------
commit 231b5a642236ee303c285c9bbb7ff2df3c3686b8
Author: Brian Conry <bconry at bestpractical.com>
Date:   Fri Feb 4 15:57:54 2022 -0600

    No validator flagging of properly deleted attributes
    
    Saved searches and dashboards are implemented as attributes, and
    attributes are deleted from the database rather than being disabled.
    This leaves some "dangling" references to them in the Transactions and
    Attributes tables ('ContentHistory' records in Attributes).
    
    These references are not issues and should not be flagged as such.

diff --git a/sbin/rt-validator.in b/sbin/rt-validator.in
index ac686af5d3..22c6555b8c 100644
--- a/sbin/rt-validator.in
+++ b/sbin/rt-validator.in
@@ -761,10 +761,44 @@ END
     return $res;
 };
 
+# Attributes are currently deleted rather than disabled, this leaves
+# dangling references, both in Transactions and in Attributes.
+# These are expected and should not be flagged.
+# So rather than try to create complicated joins to filter them out
+# in both places, we're going to create a list of the deleted
+# Attribute ids up front and create a NOT IN clause that can
+# be included where it is needed.
+my @deleted_attributes_binds;
+my $deleted_attributes_not_in = '';
+
+{
+    my $query = "SELECT DISTINCT s.objectid"
+        ." FROM ".m2t("Transaction")." s JOIN ".m2t("Attribute")." t"
+        ." ON ( s.objecttype = ? AND s.objectid = t.objectid AND t.name = ? )"
+        ." WHERE s.type = ?";
+
+    my $sth = execute_query( $query, 'RT::Attribute', 'ContentHistory', 'Delete' );
+
+    my @deleted_attributes;
+
+    while ( my ($deleted_attribute) = $sth->fetchrow_array ) {
+        push @deleted_attributes, $deleted_attribute;
+    }
+
+    while (@deleted_attributes) {
+        my @batch = splice( @deleted_attributes, 0, 1000 );
+        push @deleted_attributes_binds, @batch;
+
+        $deleted_attributes_not_in .= ' AND s.objectid NOT IN (' . join( ',', ('?') x @batch ) . ')';
+    }
+}
 
 push @CHECKS, 'Transactions -> other' => sub {
     my $res = 1;
     foreach my $model ( @models ) {
+        # Attribute needs special handling because we actually
+        # delete rows out of it rather than just disabling them
+        next if $model eq 'Attribute';
         $res *= check_integrity(
             'Transactions', 'ObjectId' => m2t($model), 'id',
             condition   => 's.ObjectType = ?',
@@ -779,6 +813,20 @@ push @CHECKS, 'Transactions -> other' => sub {
             },
         );
     }
+    # objecttype = Attribute
+    $res *= check_integrity(
+        'Transactions', 'ObjectId' => m2t('Attribute'), 'id',
+        condition   => 's.ObjectType = ?' . $deleted_attributes_not_in,
+        bind_values => [ 'RT::Attribute', @deleted_attributes_binds ],
+        action => sub {
+            my $id = shift;
+            return unless prompt(
+                'Delete', "Found a transaction without object."
+            );
+
+            delete_record( 'Transactions', $id );
+        },
+    );
     # type = CustomField
     $res *= check_integrity(
         'Transactions', 'Field' => 'CustomFields', 'id',
@@ -985,12 +1033,21 @@ push @CHECKS, Scrips => sub {
 push @CHECKS, Attributes => sub {
     my $res = 1;
     foreach my $model ( @models ) {
+        # Attribute needs special handling because we actually
+        # delete rows out of it rather than just disabling them
+        next if $model eq 'Attribute';
         $res *= check_integrity(
             'Attributes', 'ObjectId' => m2t($model), 'id',
             condition   => 's.ObjectType = ?',
             bind_values => [ "RT::$model" ],
         );
     }
+    # objecttype = Attribute
+    $res *= check_integrity(
+        'Attributes', 'ObjectId' => m2t('Attribute'), 'id',
+        condition   => 's.ObjectType = ?' . $deleted_attributes_not_in,
+        bind_values => [ 'RT::Attribute', @deleted_attributes_binds ],
+    );
     return $res;
 };
 

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


hooks/post-receive
-- 
rt


More information about the rt-commit mailing list