<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div>Hi,</div>
<div><br>
</div>
<div>Does these commits make sense to you ? It seems to work well.</div>
<div><br>
</div>
<div><a href="https://github.com/bestpractical/rt/pull/64">https://github.com/bestpractical/rt/pull/64</a></div>
<br>
<div apple-content-edited="true">
<div>David Moreau Simard</div>
</div>
<br>
<div>
<div>On 2013-08-30, at 9:37 AM, Ruslan Zakirov <<a href="mailto:ruz@bestpractical.com">ruz@bestpractical.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<blockquote type="cite">
<div dir="ltr">Hi,
<div><br>
</div>
<div>Do you care enough to send patch or git pull request? If not then file a feature request on
<a href="http://issues.bestpractical.com/">http://issues.bestpractical.com</a> .</div>
</div>
<div class="gmail_extra"><br>
<br>
<div class="gmail_quote">On Thu, Aug 29, 2013 at 5:18 PM, David Moreau Simard <span dir="ltr">
<<a href="mailto:dmsimard@iweb.com" target="_blank">dmsimard@iweb.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<br>
We're trying to do a large cleanup of our database. There are a lot of obsolete ObjectCustomFieldValue records that are related to deleted tickets.<br>
I would expect rt-validator to both delete related Transactions AND The ObjectCustomFieldValue records themselves.<br>
<br>
This is not happening, although it does detect issues - for example:<br>
===<br>
Record #33716942 in ObjectCustomFieldValues references a nonexistent record in Tickets<br>
        ObjectId => '6417200' => id<br>
===<br>
Record #1 in ObjectCustomFieldValues references a nonexistent record in Transactions<br>
        ObjectId => '8651463' => id<br>
===<br>
<br>
After spending a lot on time on this, I came to realize that the sub in rt-validator for custom fields integrity does not use delete_record at all.<br>
<br>
Example that uses delete_record:<br>
===<br>
push @CHECKS, 'Tickets <-> Role Groups' => sub {<br>
    # XXX: we check only that there is at least one group for a queue<br>
    # from queue to group<br>
    check_integrity(<br>
        'Tickets', 'id' => 'Groups', 'Instance',<br>
        join_condition   => 't.Domain = ?',<br>
        bind_values => [ 'RT::Ticket-Role' ],<br>
    );<br>
    # from group to ticket<br>
    check_integrity(<br>
        'Groups', 'Instance' => 'Tickets', 'id',<br>
        condition   => 's.Domain = ?',<br>
        bind_values => [ 'RT::Ticket-Role' ],<br>
        action => sub {<br>
            my $id = shift;<br>
            return unless prompt(<br>
                'Delete', "Found a role group of a nonexistent ticket."<br>
            );<br>
<br>
            delete_record( 'Groups', $id );<br>
        },<br>
    );<br>
};<br>
===<br>
<br>
Now, custom field checks are done this way, without delete_record:<br>
===<br>
push @CHECKS, 'CustomFields and friends' => sub {<br>
    #XXX: ObjectCustomFields needs more love<br>
    check_integrity(<br>
        'CustomFieldValues', 'CustomField' => 'CustomFields', 'id',<br>
    );<br>
    check_integrity(<br>
        'ObjectCustomFieldValues', 'CustomField' => 'CustomFields', 'id',<br>
    );<br>
    foreach my $model ( @models ) {<br>
        check_integrity(<br>
            'ObjectCustomFieldValues', 'ObjectId' => m2t($model), 'id',<br>
            condition   => 's.ObjectType = ?',<br>
            bind_values => [ "RT::$model" ],<br>
        );<br>
    }<br>
};<br>
===<br>
<br>
I'm not entirely safe with putting a delete_record somewhere in there.<br>
<br>
Can someone chime in about what would be my best course of action ?<br>
<br>
Thanks,<br>
<br>
David Moreau Simard</blockquote>
</div>
<br>
<br clear="all">
<div><br>
</div>
-- <br>
Best regards, Ruslan. </div>
</blockquote>
</div>
<br>
</body>
</html>