Skip to content

Commit 71dc73b

Browse files
committed
Merge pull request #19 from rehsack/master
Enhancements to support DBD::AnyData2
2 parents 478fc1b + 0be053d commit 71dc73b

File tree

5 files changed

+54
-12
lines changed

5 files changed

+54
-12
lines changed

DBI.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1391,7 +1391,7 @@ sub _new_sth { # called by DBD::<drivername>::db::prepare)
13911391
unless $class =~ /^DBD::(\w+)::(dr|db|st)$/;
13921392
my ($driver, $subtype) = ($1, $2);
13931393
Carp::croak("invalid method name '$method'")
1394-
unless $method =~ m/^([a-z]+_)\w+$/;
1394+
unless $method =~ m/^([a-z][a-z0-9]*_)\w+$/;
13951395
my $prefix = $1;
13961396
my $reg_info = $dbd_prefix_registry->{$prefix};
13971397
Carp::carp("method name prefix '$prefix' is not associated with a registered driver") unless $reg_info;

lib/DBD/File.pm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,8 @@ sub DESTROY
956956
$meta->{lockfh} and $meta->{lockfh}->close ();
957957
undef $meta->{fh};
958958
undef $meta->{lockfh};
959+
960+
$self->SUPER::DESTROY();
959961
} # DESTROY
960962

961963
1;

lib/DBI/DBD/SqlEngine.pm

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ DBI->setup_driver("DBI::DBD::SqlEngine"); # only needed once but harmless to
4141

4242
my %accessors = (
4343
versions => "get_driver_versions",
44+
new_meta => "new_sql_engine_meta",
4445
get_meta => "get_sql_engine_meta",
4546
set_meta => "set_sql_engine_meta",
4647
clear_meta => "clear_sql_engine_meta",
@@ -392,6 +393,7 @@ sub init_valid_attributes
392393
sql_init_phase => 1, # Only during initialization
393394
sql_meta => 1, # meta data for tables
394395
sql_meta_map => 1, # mapping table for identifier case
396+
sql_data_source => 1, # reasonable datasource class
395397
};
396398
$dbh->{sql_readonly_attrs} = {
397399
sql_engine_version => 1, # DBI::DBD::SqlEngine version
@@ -771,7 +773,7 @@ sub get_sql_engine_meta
771773
and $table = [ grep { $_ =~ $table } keys %{ $dbh->{sql_meta} } ];
772774

773775
ref $table || ref $attr
774-
or return &$gstm( $dbh, $table, $attr );
776+
or return $gstm->( $dbh, $table, $attr );
775777

776778
ref $table or $table = [$table];
777779
ref $attr or $attr = [$attr];
@@ -789,14 +791,37 @@ sub get_sql_engine_meta
789791
my %tattrs;
790792
foreach my $aname ( @{$attr} )
791793
{
792-
$tattrs{$aname} = &$gstm( $dbh, $tname, $aname );
794+
$tattrs{$aname} = $gstm->( $dbh, $tname, $aname );
793795
}
794796
$results{$tname} = \%tattrs;
795797
}
796798

797799
return \%results;
798800
} # get_sql_engine_meta
799801

802+
sub new_sql_engine_meta
803+
{
804+
my ( $dbh, $table, $values ) = @_;
805+
my $respect_case = 0;
806+
807+
"HASH" eq ref $values
808+
or croak "Invalid argument for \$values - SCALAR or HASH expected but got " . ref $values;
809+
810+
$table =~ s/^\"// and $respect_case = 1; # handle quoted identifiers
811+
$table =~ s/\"$//;
812+
813+
unless ($respect_case)
814+
{
815+
defined $dbh->{sql_meta_map}{$table} and $table = $dbh->{sql_meta_map}{$table};
816+
}
817+
818+
$dbh->{sql_meta}{$table} = { %{$values} };
819+
( my $class = $dbh->{ImplementorClass} ) =~ s/::db$/::Table/;
820+
# XXX we should never hit DBD::File::Table::get_table_meta here ...
821+
my ( undef, $meta ) = $class->get_table_meta( $dbh, $table, $respect_case );
822+
1;
823+
} # new_sql_engine_meta
824+
800825
sub set_single_table_meta
801826
{
802827
my ( $dbh, $table, $attr, $value ) = @_;
@@ -806,7 +831,7 @@ sub set_single_table_meta
806831
and return $dbh->STORE( $attr, $value );
807832

808833
( my $class = $dbh->{ImplementorClass} ) =~ s/::db$/::Table/;
809-
( undef, $meta ) = $class->get_table_meta( $dbh, $table, 1 );
834+
( undef, $meta ) = $class->get_table_meta( $dbh, $table, 1 ); # 1 means: respect case
810835
$meta or croak "No such table '$table'";
811836
$class->set_table_meta_attr( $meta, $attr, $value );
812837

@@ -827,7 +852,7 @@ sub set_sql_engine_meta
827852
and $table = [ grep { $_ =~ $table } keys %{ $dbh->{sql_meta} } ];
828853

829854
ref $table || ref $attr
830-
or return &$sstm( $dbh, $table, $attr, $value );
855+
or return $sstm->( $dbh, $table, $attr, $value );
831856

832857
ref $table or $table = [$table];
833858
ref $attr or $attr = { $attr => $value };
@@ -839,10 +864,9 @@ sub set_sql_engine_meta
839864

840865
foreach my $tname ( @{$table} )
841866
{
842-
my %tattrs;
843867
while ( my ( $aname, $aval ) = each %$attr )
844868
{
845-
&$sstm( $dbh, $tname, $aname, $aval );
869+
$sstm->( $dbh, $tname, $aname, $aval );
846870
}
847871
}
848872

@@ -1625,6 +1649,14 @@ sub new
16251649
return $className->SUPER::new($tbl);
16261650
} # new
16271651

1652+
sub DESTROY
1653+
{
1654+
my $self = shift;
1655+
my $meta = $self->{meta};
1656+
$self->{row} and undef $self->{row};
1657+
()
1658+
}
1659+
16281660
1;
16291661

16301662
=pod

lib/DBI/DBD/SqlEngine/HowTo.pod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,10 @@ DBI::DBD::SqlEngine provides only readonly access to this structure,
194194
modifications are still allowed.
195195

196196
Primarily DBI::DBD::SqlEngine provides access via the setters
197-
C<get_sql_engine_meta>, C<get_single_table_meta>, C<set_single_table_meta>,
198-
C<set_sql_engine_meta> and C<clear_sql_engine_meta>. Those methods are
199-
easily accessible by the users via the C<< $dbh->func () >> interface
200-
provided by DBI. Well, many users don't feel comfortize when calling
197+
C<new_sql_engine_meta>, C<get_sql_engine_meta>, C<get_single_table_meta>,
198+
C<set_single_table_meta>, C<set_sql_engine_meta> and C<clear_sql_engine_meta>.
199+
Those methods are easily accessible by the users via the C<< $dbh->func () >>
200+
interface provided by DBI. Well, many users don't feel comfortize when calling
201201

202202
# don't require extension for tables cars
203203
$dbh->func ("cars", "f_ext", ".csv", "set_sql_engine_meta");

t/49dbd_file.t

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,19 @@ ok ($sth = $dbh->table_info (), "table_info");
130130
is_deeply (\@tables, [ map { [ undef, undef, $_, 'TABLE', 'FILE' ] } sort "000_just_testing", $tbl ], "table_info gives test table");
131131

132132
SKIP: {
133-
$using_dbd_gofer and skip "modifying meta data doesn't work with Gofer-AutoProxy", 4;
133+
$using_dbd_gofer and skip "modifying meta data doesn't work with Gofer-AutoProxy", 6;
134134
ok ($dbh->f_set_meta ($tbl, "f_dir", $dir), "set single meta datum");
135135
is ($tbl_file, $dbh->f_get_meta ($tbl, "f_fqfn"), "verify set single meta datum");
136136
ok ($dbh->f_set_meta ($tbl, { f_dir => $dir }), "set multiple meta data");
137137
is ($tbl_file, $dbh->f_get_meta ($tbl, "f_fqfn"), "verify set multiple meta attributes");
138+
139+
ok($dbh->f_new_meta("t_bsgdf_3544G2z", {
140+
f_ext => undef,
141+
f_dir => $dir,
142+
}), "initialize new table (meta) with settings");
143+
144+
my $t_bsgdf_file = File::Spec->catfile (Cwd::abs_path ($dir), "t_bsgdf_3544G2z");
145+
is($t_bsgdf_file, $dbh->f_get_meta ("t_bsgdf_3544G2z", "f_fqfn"), "verify create meta from scratch");
138146
}
139147

140148
ok ($sth = $dbh->prepare ("select * from $tbl"), "Prepare select * from $tbl");

0 commit comments

Comments
 (0)