No tests? Tim.
On Wed, Sep 15, 2010 at 10:48:36PM -0700, rehs...@cvs.perl.org wrote: > 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? >