Changeset 60


Ignore:
Timestamp:
05/03/09 15:01:33 (15 years ago)
Author:
nanardon
Message:
  • permform synchronisation in two step, second pass is done for fileds having foreign key constrait such user <=> group link
Location:
LATMOS-Accounts/lib/LATMOS/Accounts
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • LATMOS-Accounts/lib/LATMOS/Accounts/Bases.pm

    r57 r60  
    8080} 
    8181 
     82sub delayed_fields { 
     83    my ($self, $otype, $for) = @_; 
     84    $for ||= 'rw'; 
     85    my $pclass = $self->_load_obj_class($otype) or return; 
     86    $pclass->_delayed_fields($self, $for); 
     87} 
     88 
    8289=head2 get_field_name($otype, $c_fields, $for) 
    8390 
  • LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Objects.pm

    r57 r60  
    127127=cut 
    128128 
     129sub _delayed_fields { 
     130    my ($self)= @_; 
     131    return (); 
     132} 
     133 
    129134=head2 _get_fields_name($field, $for) 
    130135 
  • LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Group.pm

    r59 r60  
    5656    ); 
    5757    \%fields; 
     58} 
     59 
     60sub _delayed_fields { 
     61    my ($self)= @_; 
     62    return qw(memberUID); 
    5863} 
    5964 
  • LATMOS-Accounts/lib/LATMOS/Accounts/Synchro.pm

    r57 r60  
    112112} 
    113113 
    114 sub process { 
    115     my ($self, %options) = @_; 
    116  
    117     $self->from->load or return; 
    118     # if any cannot be loaded, return, 
    119     # TODO we need a way to force if some still can be sync 
    120     $self->load_dest and return; 
    121      
    122     # tracking current base revision: 
    123     my $current_rev = $self->from->current_rev; 
    124  
     114sub _traverse { 
     115    my ($self, $attr_cb, %options) = @_; 
     116     
    125117    # listing existing obj one time: 
    126118    foreach my $otype ($self->from->list_supported_objects) { 
     
    141133            ); 
    142134            warn "objects $otype => " . $destbase->type . "\n"; 
    143             my @common_fields = $self->_common_fields($self->from, $destbase, $otype); 
     135            my @common_fields = $attr_cb->($self->from, $destbase, $otype) or next; 
    144136            my %exists = map { $_ => 1 } $destbase->list_objects($otype); 
    145137            foreach my $uid (@lobjfrom) { 
     138                my $sobj = $self->from->get_object($otype, $uid); 
     139                my %fields = map { $_ => $sobj->get_c_field($_, 'r') } @common_fields; 
    146140                if (!$exists{$uid}) { 
    147                     my $sobj = $self->from->get_object($otype, $uid); 
    148                     my %fields = map { $_ => $sobj->get_c_field($_, 'r') } @common_fields; 
    149141                    $destbase->create_c_object($otype, $uid, %fields); 
    150142                    warn "  $otype $uid: created\n"; 
    151143                } else { 
    152                     my $sobj = $self->from->get_object($otype, $uid); 
    153                     my %fields = map { $_ => $sobj->get_c_field($_, 'r') } @common_fields; 
    154144                    my $dobj = $destbase->get_object($otype, $uid); 
    155145                    $dobj->set_c_fields(%fields); 
    156                         
    157146                    warn "  $otype $uid: synched\n"; 
    158147                } 
     
    160149        } 
    161150    } 
     151} 
     152 
     153sub process { 
     154    my ($self, %options) = @_; 
     155 
     156    $self->from->load or return; 
     157    # if any cannot be loaded, return, 
     158    # TODO we need a way to force if some still can be sync 
     159    $self->load_dest and return; 
     160     
     161    # tracking current base revision: 
     162    $self->{current_rev} = $self->from->current_rev; 
     163 
     164    my %delayed; 
     165    $self->_traverse( 
     166        sub { 
     167            my ($from, $to, $otype) = @_; 
     168            my %fields = (); 
     169            my %delayed = map { $_ => 1 } $to->delayed_fields($otype); 
     170            foreach my $base ($from, $to) { 
     171                foreach ($base->list_canonicals_fields($otype)) { 
     172                    $delayed{$_} and next; 
     173                    $fields{$_} ||= 0; # avoid  
     174                    $fields{$_}++; 
     175                } 
     176            } 
     177            # field having value are in both 
     178            grep { $fields{$_} == 2 } keys %fields; 
     179        }, 
     180        %options 
     181    ); 
     182    $self->_traverse( 
     183        sub { 
     184            my ($from, $to, $otype) = @_; 
     185            my %fields = (); 
     186            my %delayed = map { $_ => 1 } $to->delayed_fields($otype); 
     187            foreach my $base ($from, $to) { 
     188                foreach ($base->list_canonicals_fields($otype)) { 
     189                    $delayed{$_} or next; 
     190                    $fields{$_} ||= 0; # avoid  
     191                    $fields{$_}++; 
     192                } 
     193            } 
     194            # field having value are in both 
     195            grep { $fields{$_} == 2 } keys %fields; 
     196        }, 
     197        %options 
     198    ); 
    162199 
    163200    foreach ($self->to) { 
    164201        $_->commit or next; 
    165         $self->newval($self->from->label, $_->label, $current_rev) if($current_rev); 
     202        $self->newval($self->from->label, $_->label, $self->{current_rev}) if($self->{current_rev}); 
    166203    } 
    167204 
Note: See TracChangeset for help on using the changeset viewer.