| 18 |  |  | 
| 19 | <UL> | <UL> | 
| 20 |  |  | 
| 21 | <LI><A HREF="#20030118  integration with torus">2003-01-18  -  integration with Torus</A></LI> | <LI><A HREF="#20030209  backward compatibility with custom application">2003-02-09  -  backward compatibility with custom application</A></LI> | 
| 22 | <LI><A HREF="#20021010  initial checkin">2002-10-10  -  initial check-in</A></LI> | <LI><A HREF="#20030118  start integration with torus">2003-01-18  -  start integration with Torus</A></LI> | 
| 23 |  | <LI><A HREF="#20021010  initial commit">2002-10-10  -  initial commit</A></LI> | 
| 24 | </UL> | </UL> | 
| 25 |  |  | 
| 26 | </UL> | </UL> | 
| 29 |  |  | 
| 30 | <LI><A HREF="#description">DESCRIPTION</A></LI> | <LI><A HREF="#description">DESCRIPTION</A></LI> | 
| 31 | <LI><A HREF="#requirements">REQUIREMENTS</A></LI> | <LI><A HREF="#requirements">REQUIREMENTS</A></LI> | 
| 32 | <LI><A HREF="#authors / copyright">AUTHORS / COPYRIGHT</A></LI> | <UL> | 
| 33 |  |  | 
| 34 |  | <UL> | 
| 35 |  |  | 
| 36 |  | <LI><A HREF="#dependencies">dependencies</A></LI> | 
| 37 |  | <LI><A HREF="#additional modules required for 'outlook2ldap'">additional modules required for 'outlook2ldap'</A></LI> | 
| 38 |  | <LI><A HREF="#additional modules required for 'db2db'">additional modules required for 'db2db'</A></LI> | 
| 39 |  | </UL> | 
| 40 |  |  | 
| 41 |  | </UL> | 
| 42 |  |  | 
| 43 |  | <LI><A HREF="#authors / copyright / license">AUTHORS / COPYRIGHT / LICENSE</A></LI> | 
| 44 | <LI><A HREF="#support / warranty">SUPPORT / WARRANTY</A></LI> | <LI><A HREF="#support / warranty">SUPPORT / WARRANTY</A></LI> | 
| 45 |  | <LI><A HREF="#example output chunks">EXAMPLE OUTPUT CHUNKS</A></LI> | 
| 46 |  | <UL> | 
| 47 |  |  | 
| 48 |  | <LI><A HREF="#synchronizing orm objects against entries in a .csv file  17 items modified">Synchronizing orm objects against entries in a .csv file - 17 items modified</A></LI> | 
| 49 |  | <LI><A HREF="#synchronizing orm objects against entries in a .csv file  insync">Synchronizing orm objects against entries in a .csv file - in-sync</A></LI> | 
| 50 |  | </UL> | 
| 51 |  |  | 
| 52 | <LI><A HREF="#bugs">BUGS</A></LI> | <LI><A HREF="#bugs">BUGS</A></LI> | 
| 53 | <LI><A HREF="#user level errors">USER LEVEL ERRORS</A></LI> | <LI><A HREF="#user level errors">USER LEVEL ERRORS</A></LI> | 
| 54 | <UL> | <UL> | 
| 77 | <HR> | <HR> | 
| 78 | <H1><A NAME="news">NEWS</A></H1> | <H1><A NAME="news">NEWS</A></H1> | 
| 79 | <P> | <P> | 
| 80 | <H4><A NAME="20030118  integration with torus">2003-01-18  -  integration with Torus</A></H4> | <H4><A NAME="20030209  backward compatibility with custom application">2003-02-09  -  backward compatibility with custom application</A></H4> | 
| 81 |  | <PRE> | 
| 82 |  | - Tangram <-> .csv | 
| 83 |  | - Tangram <-> mysql | 
| 84 |  | - Tangram <-> perl-code</PRE> | 
| 85 |  | <P> | 
| 86 |  | <H4><A NAME="20030118  start integration with torus">2003-01-18  -  start integration with Torus</A></H4> | 
| 87 | <PRE> | <PRE> | 
| 88 | please look at <A HREF="http://www.netfrag.org/horde/chora/cvs.php/perl/scripts/outlook2ldap/">http://www.netfrag.org/horde/chora/cvs.php/perl/scripts/outlook2ldap/</A></PRE> | - MAPI <-> LDAP | 
| 89 |  | - please visit <A HREF="http://www.netfrag.org/horde/chora/cvs.php/perl/scripts/outlook2ldap/">http://www.netfrag.org/horde/chora/cvs.php/perl/scripts/outlook2ldap/</A></PRE> | 
| 90 | <P> | <P> | 
| 91 | <H4><A NAME="20021010  initial checkin">2002-10-10  -  initial check-in</A></H4> | <H4><A NAME="20021010  initial commit">2002-10-10  -  initial commit</A></H4> | 
| 92 |  | <PRE> | 
| 93 |  | - Tangram <-> mysql</PRE> | 
| 94 | <P> | <P> | 
| 95 | <HR> | <HR> | 
| 96 | <H1><A NAME="description">DESCRIPTION</A></H1> | <H1><A NAME="description">DESCRIPTION</A></H1> | 
| 97 | <P>Data::Transfer::Sync is a module providing a generic synchronization process | <PRE> | 
| 98 | across arbitrary/multiple storages based on a ident/checksum mechanism. | Data::Transfer::Sync is a module providing a generic synchronization process | 
| 99 | It sits on top of Data::Storage.</P> | across arbitrary/multiple storages based on a ident/checksum mechanism. | 
| 100 |  | It sits on top of Data::Storage.</PRE> | 
| 101 | <P> | <P> | 
| 102 | <HR> | <HR> | 
| 103 | <H1><A NAME="requirements">REQUIREMENTS</A></H1> | <H1><A NAME="requirements">REQUIREMENTS</A></H1> | 
| 104 |  | <P> | 
| 105 |  | <H3><A NAME="dependencies">dependencies</A></H3> | 
| 106 | <PRE> | <PRE> | 
| 107 | For full functionality: | from CPAN or (for win32) a ppm-repository: | 
| 108 |  | App::Config (CPAN only) | 
| 109 |  | Tie::IxHash | 
| 110 |  | Log::Dispatch | 
| 111 |  | Log::Dispatch::Config | 
| 112 |  | mixin | 
| 113 |  | Hash::Merge | 
| 114 |  | Tie::SecureHash | 
| 115 |  | Date::Manip</PRE> | 
| 116 |  | <PRE> | 
| 117 |  | from nfo/perl/libs: | 
| 118 |  | Data::Compare | 
| 119 | Data::Storage | Data::Storage | 
| 120 | Data::Transform | Data::Transform | 
| 121 | Data::Compare | DesignPattern:: (to be renamed into Class::) | 
| 122 | ... and all their dependencies</PRE> | ... and all their dependencies.</PRE> | 
| 123 |  | <P> | 
| 124 |  | <H3><A NAME="additional modules required for 'outlook2ldap'">additional modules required for 'outlook2ldap'</A></H3> | 
| 125 |  | <PRE> | 
| 126 |  | Win32::OLE | 
| 127 |  | Net::LDAP</PRE> | 
| 128 |  | <P> | 
| 129 |  | <H3><A NAME="additional modules required for 'db2db'">additional modules required for 'db2db'</A></H3> | 
| 130 |  | <PRE> | 
| 131 |  | DBI | 
| 132 |  | DBD::mysql | 
| 133 |  | DBD::CSV | 
| 134 |  | Tangram</PRE> | 
| 135 | <P> | <P> | 
| 136 | <HR> | <HR> | 
| 137 | <H1><A NAME="authors / copyright">AUTHORS / COPYRIGHT</A></H1> | <H1><A NAME="authors / copyright / license">AUTHORS / COPYRIGHT / LICENSE</A></H1> | 
| 138 | <P>The Data::Storage module is Copyright (c) 2002 Andreas Motl. | <PRE> | 
| 139 | All rights reserved.</P> | The Data::Transfer::Sync module is Copyright (c) 2002 Andreas Motl. | 
| 140 | <P>You may distribute it under the terms of either the GNU General Public | All rights reserved.</PRE> | 
| 141 | License or the Artistic License, as specified in the Perl README file.</P> | <PRE> | 
| 142 |  | Code contributions, suggestions, support and ideas by | 
| 143 |  | Sebastian Utz <su@tunemedia.de> and Jan Hoffmann <jan@romain-volk.com>. | 
| 144 |  | </PRE> | 
| 145 |  | <PRE> | 
| 146 |  |  | 
| 147 |  | You may distribute it under the terms of either the GNU General Public | 
| 148 |  | License or the Artistic License, as specified in the Perl README file.</PRE> | 
| 149 | <P> | <P> | 
| 150 | <HR> | <HR> | 
| 151 | <H1><A NAME="support / warranty">SUPPORT / WARRANTY</A></H1> | <H1><A NAME="support / warranty">SUPPORT / WARRANTY</A></H1> | 
| 152 | <P>Data::Storage is free software. IT COMES WITHOUT WARRANTY OF ANY KIND.</P> | <PRE> | 
| 153 |  | Data::Transfer::Sync is free software. IT COMES WITHOUT WARRANTY OF ANY KIND.</PRE> | 
| 154 |  | <PRE> | 
| 155 |  | Please feel free to contact me at <andreas.motl@ilo.de>.</PRE> | 
| 156 |  | <P> | 
| 157 |  | <HR> | 
| 158 |  | <H1><A NAME="example output chunks">EXAMPLE OUTPUT CHUNKS</A></H1> | 
| 159 |  | <P> | 
| 160 |  | <H2><A NAME="synchronizing orm objects against entries in a .csv file  17 items modified">Synchronizing orm objects against entries in a .csv file - 17 items modified</A></H2> | 
| 161 |  | <PRE> | 
| 162 |  | notice: PULL INTO backend NODE * TYPE Country SELECT NODE * TYPE [n/a] FROM base USING MODULE BizWorks::ResourceMapping; | 
| 163 |  | notice: OEF::Script::AbstractFeeder: | 
| 164 |  | - Loading data of type [n/a] and | 
| 165 |  | filtered by * from the storage named base | 
| 166 |  | to the storage named backend - filtered by *. | 
| 167 |  | - Will attempt to convert the data to Country. | 
| 168 |  | info: Data::Transfer::Sync::API->syncNodes: source=backend/* [Country] <- target=base/* [] | 
| 169 |  | :c:c:c:c:c:c:c:ctr:c:c:c:c:c:c:c:ctr:c:c:c:c:c:c:ctr:c:ctr:c:c:c:c:c:c:c:c:c:c:c:ctr:c:c:c:ctr:c:c:c:c:c:c:c:ctr:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c | 
| 170 |  | :c:c:c:c:c:c:c:c:ctr:c:c:c:c:c:c:c:c:c:c:c:ctr:c:c:c:c:ctr:c:c:c:ctr:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:ctr:ctr:c:c:c:c:ctr:c:c:c:c:c:c:c | 
| 171 |  | :c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:ctr:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:ctr:c:c:ctr:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c | 
| 172 |  | info: Data::Transfer::Sync::Core->_startsync: statistics: in_sync: 180  /  total: 197  /  attempt_modify: 17  /  ok: 17</PRE> | 
| 173 |  | <P> | 
| 174 |  | <H2><A NAME="synchronizing orm objects against entries in a .csv file  insync">Synchronizing orm objects against entries in a .csv file - in-sync</A></H2> | 
| 175 |  | <PRE> | 
| 176 |  |  | 
| 177 |  | notice: PULL INTO backend NODE * TYPE Country SELECT NODE * TYPE [n/a] FROM base USING MODULE BizWorks::ResourceMapping; | 
| 178 |  | notice: OEF::Script::AbstractFeeder: | 
| 179 |  | - Loading data of type [n/a] and | 
| 180 |  | filtered by * from the storage named base | 
| 181 |  | to the storage named backend - filtered by *. | 
| 182 |  | - Will attempt to convert the data to Country. | 
| 183 |  | info: Data::Transfer::Sync::API->syncNodes: source=backend/* [Country] <- target=base/* [] | 
| 184 |  | :c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c | 
| 185 |  | :c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c | 
| 186 |  | :c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c:c | 
| 187 |  | info: Data::Transfer::Sync::Core->_startsync: statistics: in_sync: 197  /  total: 197</PRE> | 
| 188 | <P> | <P> | 
| 189 | <HR> | <HR> | 
| 190 | <H1><A NAME="bugs">BUGS</A></H1> | <H1><A NAME="bugs">BUGS</A></H1> | 
| 272 | <HR> | <HR> | 
| 273 | <H1><A NAME="todo">TODO</A></H1> | <H1><A NAME="todo">TODO</A></H1> | 
| 274 | <PRE> | <PRE> | 
| 275 | - sub _resolveIdentProvider | o sub _resolveIdentProvider | 
| 276 | - wrap _doModifySource and _doTransferTarget around a core function which can change virtually any type of node | x wrap _doModifySource and _doTransferTarget around a core function which can change virtually any type of node | 
| 277 | - split this module up into Sync.pm, Sync/Core.pm, Sync/Compare.pm and Sync/Compare/Checksum.pm | x split this module up into Sync.pm, Sync/Core.pm, Sync/Compare.pm and Sync/Compare/Checksum.pm | 
| 278 | - introduce _compareNodes as a core method and wrap it around methods in Sync/Compare/Checksum.pm | o introduce _compareNodes as a core method and wrap it around methods in Sync/Compare/Checksum.pm | 
| 279 | - introduce Sync/Compare/MyComparisonImplementation.pm | x introduce Sync/Compare/MyComparisonImplementation.pm | 
| 280 | - some generic deferring method - e.g. "$self->defer(action)" - to be able to accumulate a bunch of actions for later processing | o some generic deferring method - e.g. "$self->defer(action)" - to be able to accumulate a bunch of actions for later processing | 
| 281 | - this implies everything done is _really_ split up into generic actions - how else would we defer them??? | - this implies everything done is _really_ split up into generic actions - how else would we defer them??? | 
| 282 | - example uses: | - example uses: | 
| 283 | - fetch whole checksum list from node | - fetch whole checksum list from node | 
| 284 | - remember source ident retransmits | - remember source ident retransmits | 
| 285 | - remember: this is convenient - and maybe / of course faster - but we'll loose "per-node-atomic" operations | - remember: this is convenient - and maybe / of course faster - but we'll loose "per-node-atomic" operations | 
| 286 | - feature: mechanism to implicit inject checksum property to nodes (alter table / modify schema) | o feature: mechanism to implicit inject checksum property to nodes (alter table / modify schema) | 
| 287 | - expand statistics / keep track of: | o expand statistics / keep track of: | 
| 288 | - touched/untouched nodes | - touched/untouched nodes | 
| 289 | - full sync | o full sync | 
| 290 | - just do a push and a pull for now but use stats for touched nodes in between to speed up things | - just do a push and a pull for now but use stats for touched nodes in between to speed up things | 
| 291 | - introduce some new metadata flags for a synchronization partner which is (e.g.) of "source" or "target": | o introduce some new metadata flags for a descent | 
| 292 | - isNewNodePropagator | - isNewNodePropagator | 
| 293 | - isWriteProtected</PRE> | x isWriteProtected</PRE> | 
| 294 |  |  | 
| 295 | </BODY> | </BODY> | 
| 296 |  |  |