Showing 13 changed files with 138 additions and 125 deletions
+1
.gitignore
... ...
@@ -9,3 +9,4 @@ blib/*
9 9
 *.tar.gz
10 10
 cover_db/*
11 11
 *.tmp
12
+t/*.db
+5
Changes
... ...
@@ -1,3 +1,8 @@
1
+0.1612
2
+  add tests
3
+  updated document
4
+  removed DBIx::Custom::SQLite last_insert_rawid() mehtod(not backword compatible)
5
+  removed DBIx::Custom::MySQL last_insert_id() method(not backword compatible)
1 6
 0.1611
2 7
   renamed update tag to update_param
3 8
   renamed insert tag to insert_param
+1
MANIFEST.SKIP
... ...
@@ -13,3 +13,4 @@
13 13
 \.gz$
14 14
 ^\.git
15 15
 ^cover_db/
16
+\.db$
+42 -51
lib/DBIx/Custom.pm
... ...
@@ -93,7 +93,7 @@ sub insert {
93 93
 
94 94
     # Check arguments
95 95
     foreach my $name (keys %args) {
96
-        croak qq{"$name" is invalid name}
96
+        croak qq{"$name" is invalid argument}
97 97
           unless $VALID_INSERT_ARGS{$name};
98 98
     }
99 99
     
... ...
@@ -126,7 +126,7 @@ sub update {
126 126
     
127 127
     # Check arguments
128 128
     foreach my $name (keys %args) {
129
-        croak qq{"$name" is invalid name}
129
+        croak qq{"$name" is invalid argument}
130 130
           unless $VALID_UPDATE_ARGS{$name};
131 131
     }
132 132
     
... ...
@@ -134,7 +134,7 @@ sub update {
134 134
     my $table            = $args{table} || '';
135 135
     my $param            = $args{param} || {};
136 136
     my $where            = $args{where} || {};
137
-    my $append_statement = $args{append} || '';
137
+    my $append = $args{append} || '';
138 138
     my $filter           = $args{filter};
139 139
     my $allow_update_all = $args{allow_update_all};
140 140
     
... ...
@@ -145,7 +145,8 @@ sub update {
145 145
     my @where_keys = keys %$where;
146 146
     
147 147
     # Not exists where keys
148
-    croak qq{"where" must contain the pairs of column name and value}
148
+    croak qq{"where" argument must be specified and } .
149
+          qq{contains the pairs of column name and value}
149 150
       if !@where_keys && !$allow_update_all;
150 151
     
151 152
     # Update clause
... ...
@@ -157,16 +158,13 @@ sub update {
157 158
     
158 159
     if (@where_keys) {
159 160
         $where_clause = 'where ';
160
-        foreach my $where_key (@where_keys) {
161
-            
162
-            $where_clause .= "{= $where_key} and ";
163
-        }
161
+        $where_clause .= "{= $_} and " for @where_keys;
164 162
         $where_clause =~ s/ and $//;
165 163
     }
166 164
     
167
-    # Template for update
165
+    # Source of SQL
168 166
     my $source = "update $table $update_clause $where_clause";
169
-    $source .= " $append_statement" if $append_statement;
167
+    $source .= " $append" if $append;
170 168
     
171 169
     # Rearrange parameters
172 170
     foreach my $wkey (@where_keys) {
... ...
@@ -184,7 +182,7 @@ sub update {
184 182
     
185 183
     # Execute query
186 184
     my $ret_val = $self->execute($source, param  => $param, 
187
-                                            filter => $filter);
185
+                                 filter => $filter);
188 186
     
189 187
     return $ret_val;
190 188
 }
... ...
@@ -199,14 +197,14 @@ sub delete {
199 197
     
200 198
     # Check arguments
201 199
     foreach my $name (keys %args) {
202
-        croak qq{"$name" is invalid name}
200
+        croak qq{"$name" is invalid argument}
203 201
           unless $VALID_DELETE_ARGS{$name};
204 202
     }
205 203
     
206 204
     # Arguments
207 205
     my $table            = $args{table} || '';
208 206
     my $where            = $args{where} || {};
209
-    my $append_statement = $args{append};
207
+    my $append = $args{append};
210 208
     my $filter           = $args{filter};
211 209
     my $allow_delete_all = $args{allow_delete_all};
212 210
     
... ...
@@ -214,26 +212,25 @@ sub delete {
214 212
     my @where_keys = keys %$where;
215 213
     
216 214
     # Not exists where keys
217
-    croak qq{Key-value pairs for where clause must be specified to "delete" second argument}
215
+    croak qq{"where" argument must be specified and } .
216
+          qq{contains the pairs of column name and value}
218 217
       if !@where_keys && !$allow_delete_all;
219 218
     
220 219
     # Where clause
221 220
     my $where_clause = '';
222 221
     if (@where_keys) {
223 222
         $where_clause = 'where ';
224
-        foreach my $wkey (@where_keys) {
225
-            $where_clause .= "{= $wkey} and ";
226
-        }
223
+        $where_clause .= "{= $_} and " for @where_keys;
227 224
         $where_clause =~ s/ and $//;
228 225
     }
229 226
     
230
-    # Template for delete
227
+    # Source of SQL
231 228
     my $source = "delete from $table $where_clause";
232
-    $source .= " $append_statement" if $append_statement;
229
+    $source .= " $append" if $append;
233 230
     
234 231
     # Execute query
235 232
     my $ret_val = $self->execute($source, param  => $where, 
236
-                                            filter => $filter);
233
+                                 filter => $filter);
237 234
     
238 235
     return $ret_val;
239 236
 }
... ...
@@ -248,7 +245,7 @@ sub select {
248 245
     
249 246
     # Check arguments
250 247
     foreach my $name (keys %args) {
251
-        croak qq{"$name" is invalid name}
248
+        croak qq{"$name" is invalid argument}
252 249
           unless $VALID_SELECT_ARGS{$name};
253 250
     }
254 251
     
... ...
@@ -261,7 +258,7 @@ sub select {
261 258
     my $append   = $args{append};
262 259
     my $filter   = $args{filter};
263 260
     
264
-    # SQL template for select statement
261
+    # Source of SQL
265 262
     my $source = 'select ';
266 263
     
267 264
     # Column clause
... ...
@@ -342,9 +339,10 @@ sub create_query {
342 339
         my $builder = $self->query_builder;
343 340
         
344 341
         # Create query
345
-        $query = eval{$builder->build_query($source)};
346
-        croak $@ if $@;
347
-        
342
+        {
343
+            local $Carp::CarpLevel += 1;
344
+            $query = $builder->build_query($source);
345
+        }
348 346
         # Cache query
349 347
         $self->cache_method->($self, $source,
350 348
                              {sql     => $query->sql, 
... ...
@@ -353,8 +351,13 @@ sub create_query {
353 351
     }
354 352
     
355 353
     # Prepare statement handle
356
-    my $sth = eval {$self->dbh->prepare($query->{sql})};
357
-    croak qq{$@ SQL: "$query->{sql}"} if $@;
354
+    my $sth;
355
+    eval { $sth = $self->dbh->prepare($query->{sql})};
356
+    if ($@) {
357
+        my $error = $@;
358
+        $error =~ s/\s+at\s+.*?\s+line\s+\d+.*$//s;
359
+        croak qq{$error. SQL: "$query->{sql}"};
360
+    }
358 361
     
359 362
     # Set statement handle
360 363
     $query->sth($sth);
... ...
@@ -369,13 +372,13 @@ sub execute{
369 372
     
370 373
     # Check arguments
371 374
     foreach my $name (keys %args) {
372
-        croak qq{"$name" is invalid name}
375
+        croak qq{"$name" is invalid argument}
373 376
           unless $VALID_EXECUTE_ARGS{$name};
374 377
     }
375 378
     
376 379
     my $params = $args{param} || {};
377 380
     
378
-    # First argument is SQL template
381
+    # First argument is the soruce of SQL
379 382
     $query = $self->create_query($query)
380 383
       unless ref $query;
381 384
     
... ...
@@ -386,8 +389,13 @@ sub execute{
386 389
     
387 390
     # Execute
388 391
     my $sth      = $query->sth;
389
-    my $affected = eval {$sth->execute(@$bind_values)};
390
-    croak $@ if $@;
392
+    my $affected;
393
+    eval {$affected = $sth->execute(@$bind_values)};
394
+    if ($@) {
395
+        my $error = $@;
396
+        $error =~ s/\s+at\s+.*?\s+line\s+\d+.*$//s;
397
+        croak $error;
398
+    }
391 399
     
392 400
     # Return resultset if select statement is executed
393 401
     if ($sth->{NUM_OF_FIELDS}) {
... ...
@@ -426,31 +434,14 @@ sub _build_bind_values {
426 434
     my $count = {};
427 435
     foreach my $column (@{$query->columns}) {
428 436
         
429
-        croak qq{"$column" is not exists in params}
430
-          unless exists $params->{$column};
431
-        
432 437
         # Value
433 438
         my $value = ref $params->{$column} eq 'ARRAY'
434 439
                   ? $params->{$column}->[$count->{$column} || 0]
435 440
                   : $params->{$column};
436 441
         
437
-        # Filter name
442
+        # Filtering
438 443
         my $fname = $filter->{$column} || $self->default_bind_filter || '';
439
-        
440
-        my $filter_func;
441
-        if ($fname) {
442
-            
443
-            if (ref $fname eq 'CODE') {
444
-                $filter_func = $fname;
445
-            }
446
-            else {
447
-                my $filters = $self->filters;
448
-                croak qq{Not exists filter "$fname"}
449
-                  unless exists $filters->{$fname};
450
-                $filter_func = $filters->{$fname};
451
-            }            
452
-        }
453
-        
444
+        my $filter_func = $fname ? $self->filters->{$fname} : undef;
454 445
         push @bind_values, $filter_func
455 446
                          ? $filter_func->($value)
456 447
                          : $value;
... ...
@@ -489,7 +480,7 @@ DBIx::Custom - DBI interface, having hash parameter binding and filtering system
489 480
 
490 481
 =cut
491 482
 
492
-our $VERSION = '0.1611';
483
+our $VERSION = '0.1612';
493 484
 
494 485
 =head1 STABILITY
495 486
 
-9
lib/DBIx/Custom/MySQL.pm
... ...
@@ -28,8 +28,6 @@ sub connect {
28 28
     return $self->SUPER::connect;
29 29
 }
30 30
 
31
-sub last_insert_id { shift->dbh->{mysql_insertid} }
32
-
33 31
 1;
34 32
 
35 33
 =head1 NAME
... ...
@@ -100,11 +98,4 @@ This method overrides C<DBIx::Custom::connect()> method.
100 98
 You can specify all attributes of L<DBIx::Custom>
101 99
 and L<DBIx::Custom::MySQL>, such as C<database>, C<host>, C<port>.
102 100
 
103
-=head2 C<last_insert_id>
104
-
105
-    my $last_insert_id = $dbi->last_insert_id;
106
-
107
-Get last insert id.
108
-This is same as C<last_insert_id()> function in MySQL.
109
-
110 101
 =cut
+5 -1
lib/DBIx/Custom/QueryBuilder.pm
... ...
@@ -137,7 +137,11 @@ sub _build_query {
137 137
               unless ref $tag_processor eq 'CODE';
138 138
             
139 139
             # Execute tag processor
140
-            my $r = $tag_processor->(@$tag_args);
140
+            my $r;
141
+            {
142
+                local $Carp::CarpLevel += 1;
143
+                $r = $tag_processor->(@$tag_args);
144
+            }
141 145
             
142 146
             # Check tag processor return value
143 147
             croak qq{Tag processor "$tag_name" must return [STRING, ARRAY_REFERENCE]}
+1 -1
lib/DBIx/Custom/QueryBuilder/TagProcessors.pm
... ...
@@ -27,7 +27,7 @@ sub expand_placeholder_tag {
27 27
     my $column = shift;
28 28
     
29 29
     # Check arguments
30
-    croak qq{Column must be specified in tag "{? }"}
30
+    croak qq{Column name must be specified in tag "{? }"}
31 31
       unless $column;
32 32
     
33 33
     return ['?', [$column]];
+3 -11
lib/DBIx/Custom/SQLite.pm
... ...
@@ -14,8 +14,9 @@ sub connect {
14 14
     my $self = ref $proto ? $proto : $proto->new(@_);
15 15
     
16 16
     # Data source
17
-    if (!$self->data_source && (my $database = $self->database)) {
18
-        $self->data_source("dbi:SQLite:dbname=$database");
17
+    my $database = $self->database;
18
+    if (!$self->data_source && $database) {
19
+        $self->data_source("dbi:SQLite:dbname=$database")
19 20
     }
20 21
     
21 22
     return $self->SUPER::connect;
... ...
@@ -33,8 +34,6 @@ sub connect_memory {
33 34
     return $self;
34 35
 }
35 36
 
36
-sub last_insert_rowid { shift->dbh->func('last_insert_rowid') }
37
-
38 37
 1;
39 38
 
40 39
 =head1 NAME
... ...
@@ -88,11 +87,4 @@ and L<DBIx::Custom::SQLite>, such as C<database>.
88 87
 
89 88
 Create a new L<DBIx::Custom::SQLite> object and connect to the memory database.
90 89
 
91
-=head2 C<last_insert_rowid>
92
-
93
-    my $last_insert_rowid = $dbi->last_insert_rowid;
94
-
95
-Get last insert row id.
96
-This is same as C<last_insert_rowid()> function in SQLite.
97
-
98 90
 =cut
+61 -37
t/dbix-custom-core-sqlite.t
... ...
@@ -28,7 +28,7 @@ my $CREATE_TABLE = {
28 28
     2 => 'create table table2 (key1 char(255), key3 char(255));'
29 29
 };
30 30
 
31
-my $SELECT_TMPLS = {
31
+my $SELECT_SOURCES = {
32 32
     0 => 'select * from table1;'
33 33
 };
34 34
 
... ...
@@ -45,9 +45,9 @@ my $dbi;
45 45
 my $sth;
46 46
 my $source;
47 47
 my @sources;
48
-my $select_tmpl;
49
-my $insert_tmpl;
50
-my $update_tmpl;
48
+my $select_SOURCE;
49
+my $insert_SOURCE;
50
+my $update_SOURCE;
51 51
 my $params;
52 52
 my $sql;
53 53
 my $result;
... ...
@@ -106,9 +106,9 @@ ok($ret_val, $test);
106 106
 test 'Direct query';
107 107
 $dbi->execute($DROP_TABLE->{0});
108 108
 $dbi->execute($CREATE_TABLE->{0});
109
-$insert_tmpl = "insert into table1 {insert_param key1 key2}";
110
-$dbi->execute($insert_tmpl, param => {key1 => 1, key2 => 2});
111
-$result = $dbi->execute($SELECT_TMPLS->{0});
109
+$insert_SOURCE = "insert into table1 {insert_param key1 key2}";
110
+$dbi->execute($insert_SOURCE, param => {key1 => 1, key2 => 2});
111
+$result = $dbi->execute($SELECT_SOURCES->{0});
112 112
 $rows = $result->fetch_hash_all;
113 113
 is_deeply($rows, [{key1 => 1, key2 => 2}], $test);
114 114
 
... ...
@@ -118,22 +118,22 @@ $dbi->execute($CREATE_TABLE->{0});
118 118
 $dbi->register_filter(twice       => sub { $_[0] * 2}, 
119 119
                     three_times => sub { $_[0] * 3});
120 120
 
121
-$insert_tmpl  = "insert into table1 {insert_param key1 key2};";
122
-$insert_query = $dbi->create_query($insert_tmpl);
121
+$insert_SOURCE  = "insert into table1 {insert_param key1 key2};";
122
+$insert_query = $dbi->create_query($insert_SOURCE);
123 123
 $insert_query->filter({key1 => 'twice'});
124 124
 $dbi->execute($insert_query, param => {key1 => 1, key2 => 2});
125
-$result = $dbi->execute($SELECT_TMPLS->{0});
125
+$result = $dbi->execute($SELECT_SOURCES->{0});
126 126
 $rows = $result->filter({key2 => 'three_times'})->fetch_hash_all;
127 127
 is_deeply($rows, [{key1 => 2, key2 => 6}], "$test : filter fetch_filter");
128 128
 $dbi->execute($DROP_TABLE->{0});
129 129
 
130 130
 test 'Filter in';
131 131
 $dbi->execute($CREATE_TABLE->{0});
132
-$insert_tmpl  = "insert into table1 {insert_param key1 key2};";
133
-$insert_query = $dbi->create_query($insert_tmpl);
132
+$insert_SOURCE  = "insert into table1 {insert_param key1 key2};";
133
+$insert_query = $dbi->create_query($insert_SOURCE);
134 134
 $dbi->execute($insert_query, param => {key1 => 2, key2 => 4});
135
-$select_tmpl = "select * from table1 where {in table1.key1 2} and {in table1.key2 2}";
136
-$select_query = $dbi->create_query($select_tmpl);
135
+$select_SOURCE = "select * from table1 where {in table1.key1 2} and {in table1.key2 2}";
136
+$select_query = $dbi->create_query($select_SOURCE);
137 137
 $select_query->filter({'table1.key1' => 'twice'});
138 138
 $result = $dbi->execute($select_query, param => {'table1.key1' => [1,5], 'table1.key2' => [2,4]});
139 139
 $rows = $result->fetch_hash_all;
... ...
@@ -171,23 +171,23 @@ is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$te
171 171
 
172 172
 test 'DBIx::Custom::SQLTemplate insert tag';
173 173
 $dbi->execute("delete from table1");
174
-$insert_tmpl = 'insert into table1 {insert_param key1 key2 key3 key4 key5}';
175
-$dbi->execute($insert_tmpl, param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
174
+$insert_SOURCE = 'insert into table1 {insert_param key1 key2 key3 key4 key5}';
175
+$dbi->execute($insert_SOURCE, param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
176 176
 
177
-$result = $dbi->execute($SELECT_TMPLS->{0});
177
+$result = $dbi->execute($SELECT_SOURCES->{0});
178 178
 $rows = $result->fetch_hash_all;
179 179
 is_deeply($rows, [{key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5}], "$test : basic");
180 180
 
181 181
 test 'DBIx::Custom::SQLTemplate update tag';
182 182
 $dbi->execute("delete from table1");
183
-$insert_tmpl = "insert into table1 {insert_param key1 key2 key3 key4 key5}";
184
-$dbi->execute($insert_tmpl, param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
185
-$dbi->execute($insert_tmpl, param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
183
+$insert_SOURCE = "insert into table1 {insert_param key1 key2 key3 key4 key5}";
184
+$dbi->execute($insert_SOURCE, param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
185
+$dbi->execute($insert_SOURCE, param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
186 186
 
187
-$update_tmpl = 'update table1 {update_param key1 key2 key3 key4} where {= key5}';
188
-$dbi->execute($update_tmpl, param => {key1 => 1, key2 => 1, key3 => 1, key4 => 1, key5 => 5});
187
+$update_SOURCE = 'update table1 {update_param key1 key2 key3 key4} where {= key5}';
188
+$dbi->execute($update_SOURCE, param => {key1 => 1, key2 => 1, key3 => 1, key4 => 1, key5 => 5});
189 189
 
190
-$result = $dbi->execute($SELECT_TMPLS->{0});
190
+$result = $dbi->execute($SELECT_SOURCES->{0});
191 191
 $rows = $result->fetch_hash_all;
192 192
 is_deeply($rows, [{key1 => 1, key2 => 1, key3 => 1, key4 => 1, key5 => 5},
193 193
                   {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10}], "$test : basic");
... ...
@@ -205,7 +205,7 @@ $dbi = DBIx::Custom->connect($NEW_ARGS->{0});
205 205
 $dbi->execute($CREATE_TABLE->{0});
206 206
 $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
207 207
 $dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4});
208
-$result = $dbi->execute($SELECT_TMPLS->{0});
208
+$result = $dbi->execute($SELECT_SOURCES->{0});
209 209
 $rows   = $result->fetch_hash_all;
210 210
 is_deeply($rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}], "$test : basic");
211 211
 
... ...
@@ -216,7 +216,7 @@ $dbi->register_filter(
216 216
 );
217 217
 $dbi->default_bind_filter('twice');
218 218
 $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2}, filter => {key1 => 'three_times'});
219
-$result = $dbi->execute($SELECT_TMPLS->{0});
219
+$result = $dbi->execute($SELECT_SOURCES->{0});
220 220
 $rows   = $result->fetch_hash_all;
221 221
 is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : filter");
222 222
 $dbi->default_bind_filter(undef);
... ...
@@ -228,7 +228,7 @@ $rows = $dbi->select(table => 'table1')->fetch_hash_all;
228 228
 is_deeply($rows, [{key1 => 1, key2 => 2}], 'insert append');
229 229
 
230 230
 eval{$dbi->insert(table => 'table1', noexist => 1)};
231
-like($@, qr/noexist/, "$test: invalid name");
231
+like($@, qr/noexist/, "$test: invalid argument");
232 232
 
233 233
 
234 234
 test 'update';
... ...
@@ -237,7 +237,7 @@ $dbi->execute($CREATE_TABLE->{1});
237 237
 $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
238 238
 $dbi->insert(table => 'table1', param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
239 239
 $dbi->update(table => 'table1', param => {key2 => 11}, where => {key1 => 1});
240
-$result = $dbi->execute($SELECT_TMPLS->{0});
240
+$result = $dbi->execute($SELECT_SOURCES->{0});
241 241
 $rows   = $result->fetch_hash_all;
242 242
 is_deeply($rows, [{key1 => 1, key2 => 11, key3 => 3, key4 => 4, key5 => 5},
243 243
                   {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
... ...
@@ -247,19 +247,26 @@ $dbi->execute("delete from table1");
247 247
 $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
248 248
 $dbi->insert(table => 'table1', param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
249 249
 $dbi->update(table => 'table1', param => {key2 => 12}, where => {key2 => 2, key3 => 3});
250
-$result = $dbi->execute($SELECT_TMPLS->{0});
250
+$result = $dbi->execute($SELECT_SOURCES->{0});
251 251
 $rows   = $result->fetch_hash_all;
252 252
 is_deeply($rows, [{key1 => 1, key2 => 12, key3 => 3, key4 => 4, key5 => 5},
253 253
                   {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
254 254
                   "$test : update key same as search key");
255 255
 
256
+$dbi->update(table => 'table1', param => {key2 => [12]}, where => {key2 => 2, key3 => 3});
257
+$result = $dbi->execute($SELECT_SOURCES->{0});
258
+$rows   = $result->fetch_hash_all;
259
+is_deeply($rows, [{key1 => 1, key2 => 12, key3 => 3, key4 => 4, key5 => 5},
260
+                  {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
261
+                  "$test : update key same as search key : param is array ref");
262
+
256 263
 $dbi->execute("delete from table1");
257 264
 $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3, key4 => 4, key5 => 5});
258 265
 $dbi->insert(table => 'table1', param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
259 266
 $dbi->register_filter(twice => sub { $_[0] * 2 });
260 267
 $dbi->update(table => 'table1', param => {key2 => 11}, where => {key1 => 1},
261 268
               filter => {key2 => 'twice'});
262
-$result = $dbi->execute($SELECT_TMPLS->{0});
269
+$result = $dbi->execute($SELECT_SOURCES->{0});
263 270
 $rows   = $result->fetch_hash_all;
264 271
 is_deeply($rows, [{key1 => 1, key2 => 22, key3 => 3, key4 => 4, key5 => 5},
265 272
                   {key1 => 6, key2 => 7,  key3 => 8, key4 => 9, key5 => 10}],
... ...
@@ -268,7 +275,7 @@ is_deeply($rows, [{key1 => 1, key2 => 22, key3 => 3, key4 => 4, key5 => 5},
268 275
 $result = $dbi->update(table => 'table1', param => {key2 => 11}, where => {key1 => 1}, append => '   ');
269 276
 
270 277
 eval{$dbi->update(table => 'table1', noexist => 1)};
271
-like($@, qr/noexist/, "$test: invalid name");
278
+like($@, qr/noexist/, "$test: invalid argument");
272 279
 
273 280
 eval{$dbi->update(table => 'table1')};
274 281
 like($@, qr/where/, "$test: not contain where");
... ...
@@ -281,7 +288,7 @@ $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2, key3 => 3, key4
281 288
 $dbi->insert(table => 'table1', param => {key1 => 6, key2 => 7, key3 => 8, key4 => 9, key5 => 10});
282 289
 $dbi->register_filter(twice => sub { $_[0] * 2 });
283 290
 $dbi->update_all(table => 'table1', param => {key2 => 10}, filter => {key2 => 'twice'});
284
-$result = $dbi->execute($SELECT_TMPLS->{0});
291
+$result = $dbi->execute($SELECT_SOURCES->{0});
285 292
 $rows   = $result->fetch_hash_all;
286 293
 is_deeply($rows, [{key1 => 1, key2 => 20, key3 => 3, key4 => 4, key5 => 5},
287 294
                   {key1 => 6, key2 => 20, key3 => 8, key4 => 9, key5 => 10}],
... ...
@@ -294,7 +301,7 @@ $dbi->execute($CREATE_TABLE->{0});
294 301
 $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
295 302
 $dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4});
296 303
 $dbi->delete(table => 'table1', where => {key1 => 1});
297
-$result = $dbi->execute($SELECT_TMPLS->{0});
304
+$result = $dbi->execute($SELECT_SOURCES->{0});
298 305
 $rows   = $result->fetch_hash_all;
299 306
 is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : basic");
300 307
 
... ...
@@ -303,7 +310,7 @@ $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
303 310
 $dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4});
304 311
 $dbi->register_filter(twice => sub { $_[0] * 2 });
305 312
 $dbi->delete(table => 'table1', where => {key2 => 1}, filter => {key2 => 'twice'});
306
-$result = $dbi->execute($SELECT_TMPLS->{0});
313
+$result = $dbi->execute($SELECT_SOURCES->{0});
307 314
 $rows   = $result->fetch_hash_all;
308 315
 is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : filter");
309 316
 
... ...
@@ -317,14 +324,14 @@ $rows = $dbi->select(table => 'table1')->fetch_hash_all;
317 324
 is_deeply($rows, [{key1 => 3, key2 => 4}], "$test : delete multi key");
318 325
 
319 326
 eval{$dbi->delete(table => 'table1', noexist => 1)};
320
-like($@, qr/noexist/, "$test: invalid name");
327
+like($@, qr/noexist/, "$test: invalid argument");
321 328
 
322 329
 
323 330
 test 'delete error';
324 331
 $dbi = DBIx::Custom->connect($NEW_ARGS->{0});
325 332
 $dbi->execute($CREATE_TABLE->{0});
326 333
 eval{$dbi->delete(table => 'table1')};
327
-like($@, qr/Key-value pairs for where clause must be specified to "delete" second argument/,
334
+like($@, qr/"where" argument must be specified and contains the pairs of column name and value/,
328 335
          "$test : where key-value pairs not specified");
329 336
 
330 337
 test 'delete_all';
... ...
@@ -333,7 +340,7 @@ $dbi->execute($CREATE_TABLE->{0});
333 340
 $dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
334 341
 $dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4});
335 342
 $dbi->delete_all(table => 'table1');
336
-$result = $dbi->execute($SELECT_TMPLS->{0});
343
+$result = $dbi->execute($SELECT_SOURCES->{0});
337 344
 $rows   = $result->fetch_hash_all;
338 345
 is_deeply($rows, [], "$test : basic");
339 346
 
... ...
@@ -385,7 +392,7 @@ $rows = $dbi->select(
385 392
 is_deeply($rows, [{table1_key1 => 1, table2_key1 => 1, key2 => 2, key3 => 5}], "$test : relation : no exists where");
386 393
 
387 394
 eval{$dbi->select(table => 'table1', noexist => 1)};
388
-like($@, qr/noexist/, "$test: invalid name");
395
+like($@, qr/noexist/, "$test: invalid argument");
389 396
 
390 397
 
391 398
 test 'fetch filter';
... ...
@@ -530,3 +537,20 @@ eval{$dbi->select(table => 'table1', filter => {not_exists => 'encode_utf8'})};
530 537
 like($@, qr/\QColumn name "not_exists" in bind filter is not found in paramters/,
531 538
      "$test : fetch_filter");
532 539
 
540
+test 'execute';
541
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
542
+$dbi->execute($CREATE_TABLE->{0});
543
+eval{$dbi->execute('select * frm table1')};
544
+like($@, qr/\Qselect * frm table1;/, "$test : fail prepare");
545
+
546
+eval{$dbi->execute('select * from table1', no_exists => 1)};
547
+like($@, qr/\Q"no_exists" is invalid argument/, "$test : invald SQL");
548
+
549
+$query = $dbi->create_query('select * from table1 where {= key1}');
550
+$dbi->dbh->disconnect;
551
+eval{$dbi->execute($query, param => {key1 => {a => 1}})};
552
+ok($@, "$test: execute fail");
553
+
554
+eval{$dbi->create_query('select * from table1 where {0 key1}')};
555
+like($@, qr/\Q.t /, "$test : caller spec");
556
+
+4 -5
t/dbix-custom-mysql-private.t
... ...
@@ -30,18 +30,17 @@ sub connect_info {
30 30
 }
31 31
 
32 32
 
33
-# Constat variables for tests
34
-my $CLASS = 'DBIx::Custom::MySQL';
35
-
36 33
 # Varialbes for tests
37 34
 my $dbi;
35
+my $dbname;
38 36
 
39 37
 use DBIx::Custom::MySQL;
40 38
 
41 39
 test 'connect';
42
-$dbi = $CLASS->new(user => $USER, password => $PASSWORD,
43
-                    database => $DATABASE);
40
+$dbi = DBIx::Custom::MySQL->new(user => $USER, password => $PASSWORD,
41
+                    database => $DATABASE, host => 'localhost', port => '10000');
44 42
 $dbi->connect;
43
+like($dbi->data_source, qr/dbi:mysql:database=.*;host=localhost;port=10000;/, "$test : created data source");
45 44
 is(ref $dbi->dbh, 'DBI::db', $test);
46 45
 
47 46
 test 'attributes';
+2
t/dbix-custom-querybuilder.t
... ...
@@ -84,6 +84,8 @@ isa_ok($ret_val, 'DBIx::Custom::QueryBuilder');
84 84
 test "Tag processor error case";
85 85
 $builder = DBIx::Custom::QueryBuilder->new;
86 86
 
87
+eval{$builder->build_query('{? }')};
88
+like($@, qr/\QColumn name must be specified in tag "{? }"/, "$test : ? not arguments");
87 89
 
88 90
 eval{$builder->build_query("{a }")};
89 91
 like($@, qr/\QTag "a" in "{a }" is not registered/, "$test : tag_processor not exist");
+7 -2
t/dbix-custom-result-sqlite.t
... ...
@@ -44,7 +44,7 @@ $dbh->do("insert into table1 (key1, key2) values ('3', '4');");
44 44
 
45 45
 $sql = "select key1, key2 from table1";
46 46
 
47
-test 'fetch scalar context';
47
+test 'fetch';
48 48
 $result = query($dbh, $sql);
49 49
 @rows = ();
50 50
 while (my $row = $result->fetch) {
... ...
@@ -53,7 +53,7 @@ while (my $row = $result->fetch) {
53 53
 is_deeply(\@rows, [[1, 2], [3, 4]], $test);
54 54
 
55 55
 
56
-test 'fetch_hash scalar context';
56
+test 'fetch_hash';
57 57
 $result = query($dbh, $sql);
58 58
 @rows = ();
59 59
 while (my $row = $result->fetch_hash) {
... ...
@@ -77,6 +77,11 @@ is_deeply($row, {key1 => 1, key2 => 2}, "$test : row");
77 77
 $row = $result->fetch_hash;
78 78
 ok(!$row, "$test : finished");
79 79
 
80
+$result = query($dbh, 'create table table2 (key1, key2);');
81
+$result = query($dbh, 'select * from table2');
82
+$row = $result->fetch_hash_first;
83
+ok(!$row, "$test : no row fetch");
84
+
80 85
 
81 86
 test 'fetch_multi';
82 87
 $dbh->do("insert into table1 (key1, key2) values ('5', '6');");
+6 -8
t/dbix-custom-sqlite.t
... ...
@@ -51,13 +51,11 @@ ok(-f $db_file, "$test : database file");
51 51
 $ret_val = $dbi->execute($CREATE_TABLE->{0});
52 52
 ok(defined $ret_val, "$test : database");
53 53
 $dbi->dbh->disconnect;
54
+
54 55
 unlink $db_file if -f $db_file;
56
+$dbi = DBIx::Custom::SQLite->connect(database => $db_file);
57
+ok($dbi, "$test : called from class name");
55 58
 
56
-test 'last_insert_rowid';
57
-$dbi = DBIx::Custom::SQLite->connect_memory;
58
-$ret_val = $dbi->execute($CREATE_TABLE->{0});
59
-$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
60
-is($dbi->last_insert_rowid, 1, "$test: first");
61
-$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
62
-is($dbi->last_insert_rowid, 2, "$test: second");
63
-$dbi->dbh->disconnect;
59
+unlink $db_file if -f $db_file;
60
+$dbi = DBIx::Custom::SQLite->connect(data_source => "dbi:SQLite:dbname=$db_file");
61
+ok($dbi, "$test : specified data source");