Changeset 2389

Show
Ignore:
Timestamp:
05/19/08 14:17:00 (18 months ago)
Author:
bchoate
Message:

Support for removing related meta records with static 'remove' call. BugId:79694

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/release-38/lib/MT/Object.pm

    r2369 r2389  
    697697    my(@args) = @_; 
    698698    if (!ref $obj) { 
     699        $obj->remove_meta( @args ) if $obj->has_meta; 
    699700        return $obj->driver->direct_remove($obj, @args); 
    700701    } else { 
     
    976977sub remove_meta { 
    977978    my $obj = shift; 
    978     return 1 unless ref $obj; 
    979979    my $mpkg = $obj->meta_pkg or return; 
    980     my $id_field = $obj->datasource . '_id'; 
    981     return $mpkg->remove({ $id_field => $obj->id }); 
     980    if ( ref $obj ) { 
     981        my $id_field = $obj->datasource . '_id'; 
     982        return $mpkg->remove({ $id_field => $obj->id }); 
     983    } else { 
     984        # static invocation 
     985        my ($terms, $args) = @_; 
     986        $args = { %$args } if $args; # copy so we can alter 
     987        my $meta_id = $obj->datasource . '_id'; 
     988        my $offset = 0; 
     989        $args->{fetchonly} = [ 'id' ]; 
     990        $args->{join} = [ $mpkg, $meta_id ]; 
     991        $args->{no_triggers} = 1; 
     992        $args->{limit} = 50; 
     993        while ( $offset >= 0 ) { 
     994            $args->{offset} = $offset; 
     995            if (my @list = $obj->load( $terms, $args )) { 
     996                my @ids = map { $_->id } @list; 
     997                $mpkg->driver->direct_remove( $mpkg, { $meta_id => \@ids }); 
     998                if ( scalar @list == 50 ) { 
     999                    $offset += 50; 
     1000                } else { 
     1001                    $offset = -1; # break loop 
     1002                } 
     1003            } else { 
     1004                $offset = -1; 
     1005            } 
     1006        } 
     1007    } 
    9821008} 
    9831009