--- nfo/perl/libs/Data/Transfer/Sync.pm 2002/12/03 15:54:07 1.4 +++ nfo/perl/libs/Data/Transfer/Sync.pm 2002/12/05 08:06:05 1.5 @@ -1,4 +1,4 @@ -## $Id: Sync.pm,v 1.4 2002/12/03 15:54:07 joko Exp $ +## $Id: Sync.pm,v 1.5 2002/12/05 08:06:05 joko Exp $ ## ## Copyright (c) 2002 Andreas Motl ## @@ -6,6 +6,11 @@ ## ## ---------------------------------------------------------------------------------------- ## $Log: Sync.pm,v $ +## Revision 1.5 2002/12/05 08:06:05 joko +## + bugfix with determining empty fields (Null) with DBD::CSV +## + debugging +## + updated comments +## ## Revision 1.4 2002/12/03 15:54:07 joko ## + {import}-flag is now {prepare}-flag ## @@ -255,7 +260,7 @@ $results ||= $self->_getNodeList('source', $filter); } - # get reference to node list from convenient method provided by corehandle + # get reference to node list from convenient method provided by CORE-HANDLE #$results ||= $self->{source}->getListUnfiltered($self->{meta}->{source}->{node}); #$results ||= $self->{meta}->{source}->{storage}->getListUnfiltered($self->{meta}->{source}->{node}); $results ||= $self->_getNodeList('source'); @@ -333,14 +338,18 @@ my $identOK = $self->_resolveNodeIdent('source'); #if (!$identOK && lc $self->{args}->{direction} ne 'import') { if (!$identOK) { - $logger->critical( __PACKAGE__ . "->syncNodes: Can not synchronize: No ident found in source node, maybe try to \"import\" this node first." ); + #print Dumper($self->{meta}->{source}); + $logger->critical( __PACKAGE__ . "->syncNodes: No ident found in source node \"$self->{meta}->{source}->{node}\", try to \"prepare\" this node first?" ); return; } #print "statload", "\n"; #print "ident: ", $self->{node}->{source}->{ident}, "\n"; +#print Dumper($self->{node}); my $statOK = $self->_statloadNode('target', $self->{node}->{source}->{ident}); + +#print Dumper($self->{node}); # mark node as new either if there's no ident or if stat/load failed if (!$statOK) { @@ -427,6 +436,7 @@ $tc->{attempt_new}++; $self->_doTransferToTarget('insert'); # asymmetry: refetch node from target to re-calculate new ident and checksum (TODO: is IdentAuthority of relevance here?) + #print Dumper($self->{node}); $self->_statloadNode('target', $self->{node}->{target}->{ident}, 1); $self->_readChecksum('target'); @@ -452,11 +462,11 @@ # change ident in source (take from target), if transfer was ok and target is an IdentAuthority # this is (for now) called a "retransmit" indicated by a "r"-character when verbosing if ($self->{node}->{status}->{ok} && $self->{meta}->{target}->{storage}->{isIdentAuthority}) { + print "r" if $self->{verbose}; #print Dumper($self->{meta}); #print Dumper($self->{node}); #exit; $self->_doModifySource_IdentChecksum($self->{node}->{target}->{ident}); - print "r" if $self->{verbose}; } print ":" if $self->{verbose}; @@ -494,30 +504,35 @@ my $item = {}; foreach my $key (keys %$_) { my $val = $_->{$key}; + +#print Dumper($val); + if (ref $val eq 'Set::Object') { #print "========================= SET", "\n"; - #print Dumper($val); +#print Dumper($val); #print Dumper($val->members()); #$val = $val->members(); #$vars->[$count]->{$key} = $val->members() if $val->can("members"); #$item->{$key} = $val->members() if $val->can("members"); $item->{$key} = $val->members(); #print Dumper($vars->[$count]->{$key}); + } else { $item->{$key} = $val; } + } push @data, $item; $count++; } -#print "Dump:", "\n"; -#print Dumper(@data); +#print "Dump:", Dumper(@data), "\n"; $Data::Dumper::Indent = 0; my $result = Dumper(@data); $Data::Dumper::Indent = 2; return $result; + } @@ -747,6 +762,8 @@ } } + + #print Dumper($self->{meta}); # DBI speaks SQL if ($self->{meta}->{$descent}->{storage}->{locator}->{type} eq 'DBI') { @@ -848,13 +865,17 @@ hash2object($object, $map); # ... and re-update@orm. +#print Dumper($object); $self->{meta}->{$descent}->{storage}->update($object); # asymmetry: get ident after insert # TODO: # - just do this if it is an IdentAuthority # - use IdentProvider metadata here - $self->{node}->{$descent}->{ident} = $self->{meta}->{$descent}->{storage}->id($object); +#print Dumper($self->{meta}->{$descent}); + my $oid = $self->{meta}->{$descent}->{storage}->id($object); +#print "oid: $oid", "\n"; + $self->{node}->{$descent}->{ident} = $oid; } elsif (lc $action eq 'update') { @@ -951,6 +972,11 @@ #print "\n", "Attempt to fetch entry implicitely by ident failed: no ident given! This may result in an insert if no write-protection is in the way.", "\n"; return; } + + # patch for DBD::CSV + if ($ident && $ident eq 'Null') { + return; + } my $result = $self->{meta}->{$descent}->{storage}->sendQuery({ node => $self->{meta}->{$descent}->{node}, @@ -965,21 +991,38 @@ my $entry = $result->getNextEntry(); my $status = $result->getStatus(); +#print Dumper($status); + # TODO: enhance error handling (store inside tc) #if (!$row) { # print "\n", "row error", "\n"; # next; #} - if (($status && $status->{err}) || !$entry) { - #$logger->critical( __PACKAGE__ . "->_loadNode (ident=\"$ident\") failed" ); - return; - } + + # these checks run before actually loading payload- and meta-data to node-container + + # 1st level - hard error + if ($status && $status->{err}) { + $logger->debug( __PACKAGE__ . "->_statloadNode (ident=\"$ident\") failed - hard error (that's ok)" ); + return; + } + + # 2nd level - logical (empty/notfound) error + if (($status && $status->{empty}) || !$entry) { + $logger->debug( __PACKAGE__ . "->_statloadNode (ident=\"$ident\") failed - logical error (that's ok)" ); + #print "no entry (logical)", "\n"; + return; + } + +#print Dumper($entry); + # was: # $self->{node}->{$descent}->{ident} = $ident; # is: - # TODO: re-resolve ident from entry via metadata "IdentProvider" + # TODO: re-resolve ident from entry via metadata "IdentProvider" here - like elsewhere $self->{node}->{$descent}->{ident} = $ident; $self->{node}->{$descent}->{payload} = $entry; + } return 1; @@ -1003,9 +1046,11 @@ $self->{meta}->{source}->{IdentProvider}->{arg} => $ident_new, cs => $self->{node}->{target}->{checksum}, }; - #print Dumper($map); - #print Dumper($self->{node}); - #exit; + +#print Dumper($map); +#print Dumper($self->{node}); +#exit; + $self->_modifyNode('source', 'update', $map); } @@ -1087,6 +1132,10 @@ } my $crit = join ' AND ', @crits; print "p" if $self->{verbose}; + +#print Dumper($map); +#print Dumper($crit); + $self->_modifyNode($descent, 'update', $map, $crit); $i++; }