... | ... |
@@ -1,6 +1,7 @@ |
1 | 1 |
0.1622 |
2 | 2 |
deprecated DBIx::Custom::SQLite and DBIx::Custom::MySQL |
3 |
- |
|
3 |
+ added dbi_options attribute |
|
4 |
+ checked attributes passed to connect method |
|
4 | 5 |
0.1621 |
5 | 6 |
cleanup (removed undocumented features) |
6 | 7 |
0.1620 |
... | ... |
@@ -84,19 +84,6 @@ sub helper { |
84 | 84 |
return $self; |
85 | 85 |
} |
86 | 86 |
|
87 |
-#sub new { |
|
88 |
-# my $self = shift->SUPER::new(@_); |
|
89 |
-# |
|
90 |
-# # Check attribute names |
|
91 |
-# my @attrs = keys %$self; |
|
92 |
-# foreach my $attr (@attrs) { |
|
93 |
-# croak qq{"$attr" is invalid attribute name"} |
|
94 |
-# unless $self->can($attr); |
|
95 |
-# } |
|
96 |
-# |
|
97 |
-# return $self; |
|
98 |
-#} |
|
99 |
- |
|
100 | 87 |
sub connect { |
101 | 88 |
my $proto = shift; |
102 | 89 |
|
... | ... |
@@ -111,6 +98,9 @@ sub connect { |
111 | 98 |
|
112 | 99 |
my $user = $self->user; |
113 | 100 |
my $password = $self->password; |
101 |
+ my $dbi_options = $self->dbi_options || {}; |
|
102 |
+ |
|
103 |
+ $DB::single = 1; |
|
114 | 104 |
|
115 | 105 |
# Connect |
116 | 106 |
my $dbh = eval {DBI->connect( |
... | ... |
@@ -121,6 +111,7 @@ sub connect { |
121 | 111 |
RaiseError => 1, |
122 | 112 |
PrintError => 0, |
123 | 113 |
AutoCommit => 1, |
114 |
+ %$dbi_options |
|
124 | 115 |
} |
125 | 116 |
)}; |
126 | 117 |
|
... | ... |
@@ -317,6 +308,19 @@ sub insert { |
317 | 308 |
return $ret_val; |
318 | 309 |
} |
319 | 310 |
|
311 |
+sub new { |
|
312 |
+ my $self = shift->SUPER::new(@_); |
|
313 |
+ |
|
314 |
+ # Check attribute names |
|
315 |
+ my @attrs = keys %$self; |
|
316 |
+ foreach my $attr (@attrs) { |
|
317 |
+ croak qq{"$attr" is invalid attribute name} |
|
318 |
+ unless $self->can($attr); |
|
319 |
+ } |
|
320 |
+ |
|
321 |
+ return $self; |
|
322 |
+} |
|
323 |
+ |
|
320 | 324 |
sub register_filter { |
321 | 325 |
my $invocant = shift; |
322 | 326 |
|
... | ... |
@@ -735,6 +739,14 @@ C<connect()> method use this value to connect the database. |
735 | 739 |
|
736 | 740 |
L<DBI> object. You can call all methods of L<DBI>. |
737 | 741 |
|
742 |
+=head2 C<dbi_options> |
|
743 |
+ |
|
744 |
+ my $dbi_options = $dbi->dbi_options; |
|
745 |
+ $dbi = $dbi->dbi_options($dbi_options); |
|
746 |
+ |
|
747 |
+DBI options. |
|
748 |
+C<connect()> method use this value to connect the database. |
|
749 |
+ |
|
738 | 750 |
=head2 C<default_bind_filter> |
739 | 751 |
|
740 | 752 |
my $default_bind_filter = $dbi->default_bind_filter |
... | ... |
@@ -960,6 +972,13 @@ B<Example:> |
960 | 972 |
append => "some statement", |
961 | 973 |
filter => {title => 'encode_utf8'}) |
962 | 974 |
|
975 |
+=head2 C<new> |
|
976 |
+ |
|
977 |
+ my $dbi = DBIx::Custom->connect(data_source => "dbi:mysql:database=dbname", |
|
978 |
+ user => 'ken', password => '!LFKD%$&'); |
|
979 |
+ |
|
980 |
+Create a new L<DBIx::Custom> object. |
|
981 |
+ |
|
963 | 982 |
=head2 C<register_filter> |
964 | 983 |
|
965 | 984 |
$dbi->register_filter(%filters); |
... | ... |
@@ -1,36 +1,50 @@ |
1 |
-use Test::More; |
|
2 |
-use strict; |
|
3 |
-use warnings; |
|
4 |
- |
|
5 |
-# user password database |
|
6 |
-our ($USER, $PASSWORD, $DATABASE) = connect_info(); |
|
7 |
- |
|
8 |
-plan skip_all => 'private MySQL test' unless $USER; |
|
9 |
- |
|
10 |
-plan 'no_plan'; |
|
11 |
- |
|
12 |
-use DBIx::Custom; |
|
13 |
-use Scalar::Util 'blessed'; |
|
14 |
-{ |
|
15 |
- my $dbi = DBIx::Custom->connect( |
|
16 |
- user => $USER, |
|
17 |
- password => $PASSWORD, |
|
18 |
- data_source => "dbi:mysql:dbname=$DATABASE" |
|
19 |
- ); |
|
20 |
- $dbi->connect; |
|
21 |
- |
|
22 |
- ok(blessed $dbi->dbh); |
|
23 |
- can_ok($dbi->dbh, qw/prepare/); |
|
24 |
-} |
|
25 |
- |
|
26 |
-sub connect_info { |
|
27 |
- my $file = 'password.tmp'; |
|
28 |
- open my $fh, '<', $file |
|
29 |
- or return; |
|
30 |
- |
|
31 |
- my ($user, $password, $database) = split(/\s/, (<$fh>)[0]); |
|
32 |
- |
|
33 |
- close $fh; |
|
34 |
- |
|
35 |
- return ($user, $password, $database); |
|
36 |
-} |
|
1 |
+use Test::More; |
|
2 |
+use strict; |
|
3 |
+use warnings; |
|
4 |
+ |
|
5 |
+# user password database |
|
6 |
+our ($USER, $PASSWORD, $DATABASE) = connect_info(); |
|
7 |
+ |
|
8 |
+plan skip_all => 'private MySQL test' unless $USER; |
|
9 |
+ |
|
10 |
+plan 'no_plan'; |
|
11 |
+ |
|
12 |
+use DBIx::Custom; |
|
13 |
+use Scalar::Util 'blessed'; |
|
14 |
+{ |
|
15 |
+ my $dbi = DBIx::Custom->connect( |
|
16 |
+ user => $USER, |
|
17 |
+ password => $PASSWORD, |
|
18 |
+ data_source => "dbi:mysql:dbname=$DATABASE" |
|
19 |
+ ); |
|
20 |
+ $dbi->connect; |
|
21 |
+ |
|
22 |
+ ok(blessed $dbi->dbh); |
|
23 |
+ can_ok($dbi->dbh, qw/prepare/); |
|
24 |
+ ok($dbi->dbh->{AutoCommit}); |
|
25 |
+ ok(!$dbi->dbh->{mysql_enable_utf8}); |
|
26 |
+} |
|
27 |
+ |
|
28 |
+{ |
|
29 |
+ my $dbi = DBIx::Custom->connect( |
|
30 |
+ user => $USER, |
|
31 |
+ password => $PASSWORD, |
|
32 |
+ data_source => "dbi:mysql:dbname=$DATABASE", |
|
33 |
+ dbi_options => {AutoCommit => 0, mysql_enable_utf8 => 1} |
|
34 |
+ ); |
|
35 |
+ $dbi->connect; |
|
36 |
+ ok(!$dbi->dbh->{AutoCommit}); |
|
37 |
+ ok($dbi->dbh->{mysql_enable_utf8}); |
|
38 |
+} |
|
39 |
+ |
|
40 |
+sub connect_info { |
|
41 |
+ my $file = 'password.tmp'; |
|
42 |
+ open my $fh, '<', $file |
|
43 |
+ or return; |
|
44 |
+ |
|
45 |
+ my ($user, $password, $database) = split(/\s/, (<$fh>)[0]); |
|
46 |
+ |
|
47 |
+ close $fh; |
|
48 |
+ |
|
49 |
+ return ($user, $password, $database); |
|
50 |
+} |
... | ... |
@@ -1,4 +1,4 @@ |
1 |
-use Test::More tests => 11; |
|
1 |
+use Test::More tests => 12; |
|
2 | 2 |
use strict; |
3 | 3 |
use warnings; |
4 | 4 |
|
... | ... |
@@ -19,7 +19,6 @@ test 'Constructor'; |
19 | 19 |
$query_builder = DBIx::Custom::QueryBuilder->new; |
20 | 20 |
$dbi = DBIx::Custom->new( |
21 | 21 |
user => 'a', |
22 |
- database => 'a', |
|
23 | 22 |
password => 'b', |
24 | 23 |
data_source => 'c', |
25 | 24 |
filters => { |
... | ... |
@@ -30,7 +29,7 @@ $dbi = DBIx::Custom->new( |
30 | 29 |
result_class => 'g', |
31 | 30 |
query_builder => $query_builder, |
32 | 31 |
); |
33 |
-is_deeply($dbi,{user => 'a', database => 'a', password => 'b', data_source => 'c', |
|
32 |
+is_deeply($dbi,{user => 'a', password => 'b', data_source => 'c', |
|
34 | 33 |
filters => {f => 3}, default_bind_filter => 'f', |
35 | 34 |
default_fetch_filter => 'g', result_class => 'g', |
36 | 35 |
query_builder => $query_builder}, $test); |
... | ... |
@@ -101,3 +100,6 @@ test 'expand'; |
101 | 100 |
{'books.title' => 'Perl', 'books.author' => 'Ken'}); |
102 | 101 |
} |
103 | 102 |
|
103 |
+test 'invalid attribute name'; |
|
104 |
+eval {$dbi = DBIx::Custom->new(a => 1) }; |
|
105 |
+like ($@, qr/"a" is invalid attribute name/, $test); |