Re: [svn:dbi] r14407 - in dbi/trunk: . lib/DBD lib/DBD/File

Jens Rehsack <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Message-ID <[email protected]>
2010/9/16 Tim Bunce <[email protected]>:
> No tests?

The tests are already in there - t/5?dbm* test for these features, especially
t/52dbm_complex.t. This is more a refactoring to allow better implementation
in DBD::CSV - which has a separate test for it's special case.

> Tim.

/Jens

> On Wed, Sep 15, 2010 at 10:48:36PM -0700, [email protected] 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?
>>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.