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?