/[cvs]/nfo/perl/libs/Data/Transfer/Sync/Map.pm
ViewVC logotype

Annotation of /nfo/perl/libs/Data/Transfer/Sync/Map.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (hide annotations)
Tue May 11 20:04:40 2004 UTC (20 years, 2 months ago) by jonen
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +18 -5 lines
bugfix[joko] related to emty hashrefs

1 joko 1.1 ## -------------------------------------------------------------------------
2 jonen 1.2 ## $Id: Map.pm,v 1.1 2003/05/13 08:10:11 joko Exp $
3 joko 1.1 ##
4     ## Copyright (c) 2002 Andreas Motl <andreas.motl@ilo.de>
5     ##
6     ## See COPYRIGHT section in associated pod text
7     ## or below for usage and distribution rights.
8     ##
9     ## -------------------------------------------------------------------------
10 jonen 1.2 ## $Log: Map.pm,v $
11     ## Revision 1.1 2003/05/13 08:10:11 joko
12     ## initial commit, code from Metadata.pm
13     ##
14 joko 1.1 ##
15     ## -------------------------------------------------------------------------
16    
17    
18     package Data::Transfer::Sync::Map;
19    
20     use strict;
21     use warnings;
22    
23     use mixin::with qw( Data::Transfer::Sync );
24    
25    
26     use Data::Dumper;
27     use shortcuts::database qw( quotesql );
28     use Data::Mungle::Code::Ref qw( ref_slot );
29    
30     # get logger instance
31     my $logger = Log::Dispatch::Config->instance;
32    
33     # This actually - but virtually - maps data from scope to scope.!?
34     # Physical injection/modification doesn't occour here! This is the job of the core/engine.
35     sub buildAttributeMap {
36    
37     my $self = shift;
38    
39     # Field-structure for building sql mapping of sql-fieldnames to object-attributes.
40     # This is fed to "shortcuts::database::hash2sql" somewhere later... (outside this method).
41     $self->{node}->{map} = {};
42    
43     # Manually inject into target map: ...
44     # ... object-id.
45     $self->{node}->{map}->{$self->{meta}->{target}->{IdentProvider}->{arg}} = $self->{node}->{source}->{ident};
46     # ... checksum.
47     $self->{node}->{map}->{cs} = $self->{node}->{source}->{checksum};
48    
49     # debug point
50     #print "sqlmap: ", Dumper($self->{node}->{map}), "\n";
51     #print Dumper($self);
52     #exit;
53    
54     # for transferring flat structures via simple (1:1) mapping
55     # TODO: diff per property / property value
56    
57     # Apply mapping from $self->{args}->{mapping} to $self->{node}->{map}.
58     #if ($self->{args}->{mapping}) {
59     #foreach my $key (@{$self->{meta}->{source}->{childnodes}}) {
60     my @childnodes = @{$self->{meta}->{source}->{childnodes}};
61     for (my $mapidx = 0; $mapidx <= $#childnodes; $mapidx++) {
62    
63     # deprecated?
64     #my $map_right = $self->{args}->{mapping}->{$key};
65     #print "map: $map_right", "\n";
66    
67     # Clear caching containers.
68     $self->{node}->{source}->{propcache} = {};
69     $self->{node}->{target}->{propcache} = {};
70    
71    
72     # A - Transfer name/value pairs from distinct source and target objects to single local cache container "propcache".
73    
74     # get property name
75     $self->{node}->{source}->{propcache}->{property} = $self->{meta}->{source}->{childnodes}->[$mapidx];
76     $self->{node}->{target}->{propcache}->{property} = $self->{meta}->{target}->{childnodes}->[$mapidx];
77    
78     # get property value
79     my $value;
80    
81     # 1. Detect for callback - deprecated / old style - (maybe the better???)
82     if (ref($self->{node}->{target}->{map}) eq 'CODE') {
83     #$value = &$map_right($objClone);
84     } else {
85     # plain (scalar?) value
86     #$value = $objClone->{$map_right};
87     $self->{node}->{source}->{propcache}->{value} = $self->{node}->{source}->{payload}->{$self->{node}->{source}->{propcache}->{property}};
88     }
89     #$self->{node}->{map}->{$key} = $value;
90    
91    
92     # B - Inspect the property for special cases:
93     # a) expr:{expression} - encoded expression should be resolved by "ref_slot"
94     # b) code:{symbol} - encoded symbol should be resolved (used) as object method at runtime
95    
96     # B.1. Detect expression for transferring deeply nested structures described by expressions
97     # e.g.: "expr:event->startDateTime" should assume "event" being an
98     # object-reference and get its (hopefully scalar) attribute value "startDateTime".
99     #print "val: $self->{node}->{source}->{propcache}->{value}", "\n";
100     if ($self->{node}->{source}->{propcache}->{property} =~ s/^expr://) {
101    
102     # debug point
103     #print Dumper($self->{node});
104    
105     # V1 - create an anonymous sub to act as callback target dispatcher
106     my $cb_dispatcher = sub {
107     #print "=============== CALLBACK DISPATCHER", "\n";
108     #print "ident: ", $self->{node}->{source}->{ident}, "\n";
109     #return $self->{node}->{source}->{ident};
110     };
111    
112     # V2 - build callback map for helper function
113     #print Dumper($self->{node}->{source}->{payload});
114     #my $cbmap = { $self->{meta}->{source}->{IdentProvider}->{arg} => $cb_dispatcher };
115 jonen 1.2
116     # FIXED - 2004-05-11: providing an empty hashref to ref_slot seems to be a bad idea here....
117     #my $cbmap = {};
118     my $cbmap = undef;
119 joko 1.1 my $value = ref_slot($self->{node}->{source}->{payload}, $self->{node}->{source}->{propcache}->{property}, $cbmap);
120 jonen 1.2
121 joko 1.1 # new of 2003-05-12: Assertion: assume ref_slot resolves to scalar. (no ref!)
122     # Otherwise: Invalidate virtual object completely (skip sync).
123 jonen 1.2 # TODO: Warn to STDOUT or somewhere else here?
124    
125     #print "prop: ", $self->{node}->{source}->{propcache}->{property}, "\n";
126 joko 1.1 #print "val: $value", "\n";
127     #if ($value =~ m/HASH/) {
128 jonen 1.2 #print Dumper($value);
129     #print Dumper($self->{node}->{source}->{payload});
130 joko 1.1 #}
131 jonen 1.2 #return if ref $value;
132     #next if ref $value;
133    
134 joko 1.1 $self->{node}->{source}->{propcache}->{value} = $value;
135     }
136    
137     # B.2. FIXME: Get detection for coderefs / runtime-symbols from API::_prepareOptions(...) into this place!
138    
139    
140     # C - Value encoding
141    
142     # encode values dependent on type of underlying storage here - expand cases...
143     # TODO: Handle encoding from/to quote.sql, quote.meta, utf-8, latin, ascii in a more generic/abstract way here!
144     # Hint: utf-8 encoding is *essential* for XML marshalling. By now we do it manually somewhere else,
145     # but keep in mind when redesigning this interface, that encoding also might be handled by external modules as well...
146     my $storage_type = $self->{meta}->{target}->{storage}->{locator}->{type};
147     if ($storage_type eq 'DBI') {
148     # ...for sql
149     # quotemeta?
150     $self->{node}->{source}->{propcache}->{value} =
151     quotesql($self->{node}->{source}->{propcache}->{value});
152    
153     } elsif ($storage_type eq 'Tangram') {
154     # iso? utf8 already possible?
155    
156     } elsif ($storage_type eq 'LDAP') {
157     # TODO: encode utf8 here?
158    
159     }
160    
161    
162     # D - Finally transfer name/value pair to target map
163    
164     # store value to transfer map
165     $self->{node}->{map}->{$self->{node}->{target}->{propcache}->{property}} =
166     $self->{node}->{source}->{propcache}->{value};
167    
168     }
169     #}
170    
171     # debug point
172     # TODO: $logger->dump( ... );
173     #$logger->debug( "sqlmap:" . "\n" . Dumper($self->{node}->{map}) );
174     #print "sqlmap: ", Dumper($self->{node}->{map}), "\n";
175     #print "entrystatus: ", Dumper($self->{node}), "\n";
176    
177     # signal good
178     return 1;
179    
180     }
181    
182     1;
183     __END__

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed