--- nfo/perl/libs/Data/README.html 2002/11/09 01:05:20 1.3 +++ nfo/perl/libs/Data/README.html 2002/11/29 04:48:23 1.4 @@ -12,9 +12,13 @@
Data::Storage - Interface for accessing various Storage implementations for Perl in an independent way
- ... the basic way:+ - should encapsulate Tangram, DBI, DBD::CSV and LWP:: to access them in an unordinary (more convenient) way ;) + - introduce a generic layered structure, refactor *SUBLAYER*-stuff, make (e.g.) this possible: + Perl Data::Storage[DBD::CSV] -> Perl LWP:: -> Internet HTTP/FTP/* -> Host Daemon -> csv-file + - provide generic synchronization mechanisms across arbitrary/multiple storages based on ident/checksum + maybe it's possible to have schema-, structural- and semantical modifications synchronized??? +
+
+
+
... via inheritance:@@ -72,22 +81,111 @@ ); $self->{storage}->insert($proxyObj);
+
+ my $nodemapping = {
+ 'LangText' => 'langtexts.csv',
+ 'Currency' => 'currencies.csv',
+ 'Country' => 'countries.csv',
+ };
+
+ my $propmapping = {
+ 'LangText' => [
+ [ 'source:lcountrykey' => 'target:country' ],
+ [ 'source:lkey' => 'target:key' ],
+ [ 'source:lvalue' => 'target:text' ],
+ ],
+ 'Currency' => [
+ [ 'source:ckey' => 'target:key' ],
+ [ 'source:cname' => 'target:text' ],
+ ],
+ 'Country' => [
+ [ 'source:ckey' => 'target:key' ],
+ [ 'source:cname' => 'target:text' ],
+ ],
+ };
+
+ sub syncResource {
++ my $self = shift; + my $node_source = shift; + my $mode = shift; + my $opts = shift; ++
+
+ $mode ||= '';
+ $opts->{erase} ||= 0;
+
+
+ $logger->info( __PACKAGE__ . "->syncResource( node_source $node_source mode $mode erase $opts->{erase} )");
+
+
+ # resolve metadata for syncing requested resource
+ my $node_target = $nodemapping->{$node_source};
+ my $mapping = $propmapping->{$node_source};
+
+
+ if (!$node_target || !$mapping) {
+ # loggger.... "no target, sorry!"
+ print "error while resolving resource metadata", "\n";
+ return;
+ }
+
+
+ if ($opts->{erase}) {
+ $self->_erase_all($node_source);
+ }
+
+
+ # create new sync object
+ my $sync = Data::Transfer::Sync->new(
+ storages => {
+ L => $self->{bizWorks}->{backend},
+ R => $self->{bizWorks}->{resources},
+ },
+ id_authorities => [qw( L ) ],
+ checksum_authorities => [qw( L ) ],
+ write_protected => [qw( R ) ],
+ verbose => 1,
+ );
+
+
+ # sync
+ # todo: filter!?
+ $sync->syncNodes( {
+ direction => $mode, # | +PUSH | +PULL | -FULL | +IMPORT | -EXPORT
+ method => 'checksum', # | -timestamp | -manual
+ source => "L:$node_source",
+ source_ident => 'storage_method:id',
+ source_exclude => [qw( id cs )],
+ target => "R:$node_target",
+ target_ident => 'property:oid',
+ mapping => $mapping,
+ } );
++ }+
This module heavily relies on DBI and Tangram, but adds a lot of additional bugs and quirks. Please look at their documentation and/or this code for additional information.
For full functionality: - DBI from CPAN - Tangram from CPAN - Class::Tangram from CPAN - MySQL::Diff from http://adamspiers.org/computing/mysqldiff/ - ... and all their dependencies
++ For full functionality: + DBI from CPAN + DBD::mysql from CPAN + Tangram 2.04 from CPAN (hmmm, 2.04 won't do in some cases) + Tangram 2.05 from http://... (2.05 seems okay but there are also additional patches from our side) + Class::Tangram from CPAN + DBD::CSV from CPAN + MySQL::Diff from http://adamspiers.org/computing/mysqldiff/ + ... and all their dependencies
Data::Storage is module for a accessing various ``data structures'' stored inside +
Data::Storage is a module for accessing various ``data structures'' stored inside various ``data containers''. It sits on top of DBI and/or Tangram.
Larry Wall for Perl, Tim Bunce for DBI, Jean-Louis Leroy for Tangram and Set::Object, -Sam Vilain for Class::Tangram, Adam Spiers for MySQL::Diff and all contributors.
+Sam Vilain for Class::Tangram, Jochen Wiedmann and Jeff Zucker for DBD::CSV and related, +Adam Spiers for MySQL::Diff and all contributors.
-
-
``DBI-Error [Tangram]: DBD::mysql::st execute failed: Unknown column 't1.requestdump' in 'field list'''
- ... occours when operating on object-attributes not introduced yet: - this should be detected and appended/replaced through: - "Schema-Error detected, maybe (just) an inconsistency. - Please check if your declaration in schema-module "a" matches structure in database "b" or try to run" - db_setup.pl --dbkey=import --action=deploy-
-
Compare schema (structure diff) with database ...
... when issuing "db_setup.pl --dbkey=import --action=deploy" on a database with an already deployed schema, use an additional "--update" then @@ -150,7 +247,7 @@ As we can see, creations of Classes and new Class variables is handled automatically and this is believed to be the most common case under normal circumstances.
-
- Get this stuff together with UML (Unified Modeling Language) and/or standards from ODMG.
- Make it possible to load/save schemas in XMI (XML Metadata Interchange),
@@ -158,13 +255,25 @@
Integrate/bundle this with a web-/html-based UML modeling tool or
some other interesting stuff like the "Co-operative UML Editor" from Uni Darmstadt. (web-/java-based)
- Enable Round Trip Engineering. Keep code and diagrams in sync. Don't annoy/bother the programmers.
- - Add some more handlers:
- - look at DBD::CSV, Text::CSV, XML::CSV, XML::Excel
- - Add some more locations/locators:
- - PerlDAV: http://www.webdav.org/perldav/
- - Move to t3, use InCASE
+ - Add support for some more handlers/locators to be able to
+ access the following standards/protocols/interfaces/programs/apis transparently:
+ + DBD::CSV (via Data::Storage::Handler::DBI)
+ (-) Text::CSV, XML::CSV, XML::Excel
+ - MAPI
+ - LDAP
+ - DAV (look at PerlDAV: http://www.webdav.org/perldav/)
+ - Mbox (use formail for seperating/splitting entries/nodes)
+ - Cyrus (cyrdeliver - what about cyrretrieve (export)???)
+ - use File::DiffTree, use File::Compare
+ - Hibernate
+ - "Win32::UserAccountDb"
+ - "*nix::UserAccountDb"
+ - .wab - files (Windows Address Book)
+ - .pst - files (Outlook Post Storage?)
+ - XML (e.g. via XML::Simple?)
+ - Move to t3, look at InCASE
-
Specs:
UML 1.3 Spec: http://cgi.omg.org/cgi-bin/doc?ad/99-06-08.pdf