<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>