Author: REHSACK
Date: Wed Sep 15 22:48:35 2010
New Revision: 14407

Modified:
   dbi/trunk/Changes
   dbi/trunk/lib/DBD/DBM.pm
   dbi/trunk/lib/DBD/File.pm
   dbi/trunk/lib/DBD/File/Developers.pod
   dbi/trunk/lib/DBD/File/HowTo.pod

Log:
Added register_compat_map() and table_meta_attr_changed() to DBD::File::Table


Modified: dbi/trunk/Changes
==============================================================================
--- dbi/trunk/Changes   (original)
+++ dbi/trunk/Changes   Wed Sep 15 22:48:35 2010
@@ -31,6 +31,8 @@
   Added improved developers documentation for DBI::DBD::SqlEngine
   Added guides how to write DBI drivers using DBI::DBD::SqlEngine
     or DBD::File 
+  Added register_compat_map() and table_meta_attr_changed() to
+    DBD::File::Table
 
 =head2 Changes in DBI 1.613 (svn r14271) 22nd July 2010
 

Modified: dbi/trunk/lib/DBD/DBM.pm
==============================================================================
--- dbi/trunk/lib/DBD/DBM.pm    (original)
+++ dbi/trunk/lib/DBD/DBM.pm    Wed Sep 15 22:48:35 2010
@@ -271,6 +271,14 @@
                       );
 __PACKAGE__->register_reset_on_modify( \%reset_on_modify );
 
+my %compat_map = (
+    map { $_ => "dbm_$_" } qw(type mldbm store_metadata),
+    dbm_ext => 'f_ext',
+    dbm_file => 'f_file',
+    dbm_lockfile => ' f_lockfile',
+    );
+__PACKAGE__->register_compat_map (\%compat_map);
+
 sub bootstrap_table_meta
 {
     my ( $self, $dbh, $meta, $table ) = @_;

Modified: dbi/trunk/lib/DBD/File.pm
==============================================================================
--- dbi/trunk/lib/DBD/File.pm   (original)
+++ dbi/trunk/lib/DBD/File.pm   Wed Sep 15 22:48:35 2010
@@ -881,6 +881,10 @@
     f_lockfile => "f_fqfn", # forces new file2table call
     );
 
+my %compat_map = (
+    map { $_ => "f_$_" } qw( file ext lock lockfile )
+);
+
 sub register_reset_on_modify
 {
     my ($proto, $extra_resets) = @_;
@@ -888,9 +892,18 @@
     return;
     } # register_reset_on_modify
 
+sub register_compat_map
+{
+    my ($proto, $extra_compat_map) = @_;
+    %compat_map = (%compat_map, %$extra_compat_map);
+    return;
+    } # register_compat_map
+
 sub get_table_meta_attr
 {
     my ($class, $meta, $attrib) = @_;
+    exists $compat_map{$attrib} and
+       $attrib = $compat_map{$attrib};
     exists $meta->{$attrib} and
        return $meta->{$attrib};
     return;
@@ -899,11 +912,19 @@
 sub set_table_meta_attr
 {
     my ($class, $meta, $attrib, $value) = @_;
+    exists $compat_map{$attrib} and
+       $attrib = $compat_map{$attrib};
+    $class->table_meta_attr_changed ($meta, $attrib, $value);
+    $meta->{$attrib} = $value;
+    } # set_table_meta_attr
+
+sub table_meta_attr_changed
+{
+    my ($class, $meta, $attrib, $value) = @_;
     defined $reset_on_modify{$attrib} and
        delete $meta->{$reset_on_modify{$attrib}} and
        delete $meta->{initialized};
-    $meta->{$attrib} = $value;
-    } # set_table_meta_attr
+    } # table_meta_attr_changed
 
 # ====== FILE OPEN 
=============================================================
 

Modified: dbi/trunk/lib/DBD/File/Developers.pod
==============================================================================
--- dbi/trunk/lib/DBD/File/Developers.pod       (original)
+++ dbi/trunk/lib/DBD/File/Developers.pod       Wed Sep 15 22:48:35 2010
@@ -56,9 +56,15 @@
                            myd_mno => "myd_bar",
                          );
     __PACKAGE__->register_reset_on_modify( \%reset_on_modify );
+    my %compat_map = (
+                      abc => 'foo_abc',
+                      xyz => 'foo_xyz',
+                    );
+    __PACKAGE__->register_compat_map( \%compat_map );
 
     sub bootstrap_table_meta { ... }
     sub init_table_meta { ... }
+    sub table_meta_attr_changed { ... }
     sub open_file { ... }
 
     sub fetch_row { ... }
@@ -432,19 +438,24 @@
 
 =item get_table_meta_attr
 
-Returns a single attribute from the table meta data. This method should
-be overridden when mapped attribute names should be returned for
-compatibility reasons.
+Returns a single attribute from the table meta data. If the attribute
+name appears in C<%compat_map>, the attribute name is updated from
+there.
 
 =item set_table_meta_attr
 
-Sets a single attribute in the table meta data. This method should
-be overridden when mapped attribute names should be modified for
-compatibility reasons.
+Sets a single attribute in the table meta data. If the attribute
+name appears in C<%compat_map>, the attribute name is updated from
+there.
+
+=item table_meta_attr_changed
+
+Called when an attribute of the meta data is modified.
 
 If the modified attribute requires to reset a calculated attribute, the
 calculated attribute is reset (deleted from meta data structure) and
-the I<initialized> flag is removed, too.
+the I<initialized> flag is removed, too. The decision is made based on
+C<%register_reset_on_modify>.
 
 =item register_reset_on_modify
 
@@ -459,6 +470,15 @@
     my %reset_on_modify = ( "xxx_foo" => "xxx_bar" );
     __PACKAGE__->register_reset_on_modify( \%reset_on_modify );
 
+=item register_compat_map
+
+Allows C<get_table_meta_attr> and C<set_table_meta_attr> to update the
+attribute name to the current favored one:
+
+    # from DBD::DBM
+    my %compat_map = ( "dbm_ext" => "f_ext" );
+    __PACKAGE__->register_compat_map( \%compat_map );
+
 =item open_file
 
 Called to open the table's data file.

Modified: dbi/trunk/lib/DBD/File/HowTo.pod
==============================================================================
--- dbi/trunk/lib/DBD/File/HowTo.pod    (original)
+++ dbi/trunk/lib/DBD/File/HowTo.pod    Wed Sep 15 22:48:35 2010
@@ -204,6 +204,16 @@
     sub get_table_meta_attr { ... }
     sub set_table_meta_attr { ... }
 
+Both methods can adjust the attribute name for compatibility reasons, e.g.
+when former versions of the DBD allowed different names to be used for the
+same flag:
+
+    my %compat_map = (
+                      abc => 'foo_abc',
+                      xyz => 'foo_xyz',
+                    );
+    __PACKAGE__->register_compat_map( \%compat_map );
+
 If any user modification on a meta attribute needs reinitialization of
 the meta structure (in case of C<DBD::File> these are the attributes
 C<f_file>, C<f_dir>, C<f_ext> and C<f_lockfile>), inform DBD::File by
@@ -218,6 +228,19 @@
 The next access to the table meta data will force DBD::File to re-do the
 entire meta initialization process.
 
+Any further action which needs to be taken can handled in
+C<table_meta_attr_changed>:
+
+    sub table_meta_attr_changed
+    {
+       my ($class, $meta, $attrib, $value) = @_;
+       ...
+       $class->SUPER::table_meta_attr_changed ($meta, $attrib, $value);
+    }
+
+This is done before the new value is set in C<$meta>, so the attribute
+changed handler can act depending on the old value.
+
 =head2 Testing
 
 Now you should have your own DBD::File based driver. Was easy, wasn't it?

Reply via email to