--- nfo/perl/libs/Data/README.html 2002/10/29 19:24:46 1.2 +++ nfo/perl/libs/Data/README.html 2002/12/11 06:53:19 1.5 @@ -12,30 +12,36 @@
Data::Storage - Interface for accessing various Storage implementations for Perl in an independent way
++ 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:@@ -71,46 +89,166 @@ ); $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 this code for additional information.
++ 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 + 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 -various ``data containers''. It sits on top of DBI and/or Tangram.
++
+ Data::Storage is a module for accessing various "data structures / kinds of structured data" stored inside + various "data containers". + We tried to use the AdapterPattern (http://c2.com/cgi/wiki?AdapterPattern) to implement a wrapper-layer + around core CPAN modules (Tangram, DBI).+
+
+ You will get a better code-structure (not bad for later maintenance) in growing Perl code projects, + especially when using multiple database connections at the same time. + You will be able to switch between different _kinds_ of implementations used for storing data. + Your code will use the very same API to access these storage layers. + ... implementation has to be changed for now + Maybe you will be able to switch "on-the-fly" without changing any bits in code in the future.... + ... but that's not the focus+
+
+ Having this, we were able to do implement a generic data synchronization module more easy, + please look at Data::Transfer.
The Data::Storage module is Copyright (c) 2002 Andreas Motl. -All rights reserved.
-You may distribute it under the terms of either the GNU General Public -License or the Artistic License, as specified in the Perl README file.
++ The Data::Storage module is Copyright (c) 2002 Andreas Motl. + All rights reserved. + You may distribute it under the terms of either the GNU General Public + License or the Artistic License, as specified in the Perl README file.
Larry Wall and the perl5-porters for Perl, 
-Tim Bunce for DBI, Jean-Louis Leroy for Tangram and Set::Object, 
-Sam Vilain for Class::Tangram.
+ Larry Wall for Perl, Tim Bunce for DBI, Jean-Louis Leroy for Tangram and Set::Object, + Sam Vilain for Class::Tangram, Jochen Wiedmann and Jeff Zucker for DBD::CSV & Co., + Adam Spiers for MySQL::Diff and all contributors.
Data::Storage is free software. IT COMES WITHOUT WARRANTY OF ANY KIND.
++ Data::Storage is free software. IT COMES WITHOUT WARRANTY OF ANY KIND.
-
-
``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 @@ -141,7 +279,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), 
@@ -149,13 +287,34 @@
     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
+  - some kind of security layer for methods/objects
+    - acls (stored via tangram/ldap?) for functions, methods and objects (entity- & data!?)
+    - where are the hooks needed then?
+      - is Data::Storage & Co. okay, or do we have to touch the innards of DBI and/or Tangram?
+      - an attempt to start could be: 
+         - 'sub getACLByObjectId($id, $context)'
+         - 'sub getACLByMethodname($id, $context)'
+         - 'sub getACLByName($id, $context)'
+            ( would require a kinda registry to look up these very names pointing to arbitrary locations (code, data, ...) )
 -
   Specs:
     UML 1.3 Spec: http://cgi.omg.org/cgi-bin/doc?ad/99-06-08.pdf
@@ -182,7 +341,8 @@
     PyUt (free): http://pyut.sourceforge.net/
     (Dia (free): http://www.lysator.liu.se/~alla/dia/)
     UMLet (free, university): http://www.swt.tuwien.ac.at/umlet/index.html
-    Voodoo (free): http://voodoo.sourceforge.net/
+    Voodoo (free): http://voodoo.sourceforge.net/
+    Umbrello UML Modeller: http://uml.sourceforge.net/
 
   UML Tools:
     http://www.objectsbydesign.com/tools/umltools_byPrice.html