Showing 4 changed files with 106 additions and 49 deletions
+2
Changes
... ...
@@ -1,3 +1,5 @@
1
+0.1664
2
+    - where can recieve array refrence, which contains where cluase and paramter.
1 3
 0.1663
2 4
     - added EXPERIMENTAL type() attribute to DBIx::Custom::Model
3 5
     - added EXPERIMENTAL bind_param_option can set bind_param option
+63 -46
lib/DBIx/Custom.pm
... ...
@@ -1,6 +1,6 @@
1 1
 package DBIx::Custom;
2 2
 
3
-our $VERSION = '0.1663';
3
+our $VERSION = '0.1664';
4 4
 
5 5
 use 5.008001;
6 6
 use strict;
... ...
@@ -260,20 +260,8 @@ sub delete {
260 260
     my $allow_delete_all = delete $args{allow_delete_all};
261 261
 
262 262
     # Where
263
-    my $w;
264
-    if (ref $where eq 'HASH') {
265
-        my $clause = ['and'];
266
-        push @$clause, "{= $_}" for keys %$where;
267
-        $w = $self->where;
268
-        $w->clause($clause);
269
-        $w->param($where);
270
-    }
271
-    elsif (ref $where eq 'DBIx::Custom::Where') {
272
-        $w = $where;
273
-        $where = $w->param;
274
-    }    
275
-    croak qq{"where" must be hash refernce or DBIx::Custom::Where object}
276
-      unless ref $w eq 'DBIx::Custom::Where';
263
+    my $w = $self->_where($where);
264
+    $where = $w->param;
277 265
     
278 266
     # String where
279 267
     my $swhere = "$w";
... ...
@@ -896,19 +884,8 @@ sub select {
896 884
     croak "Not found table name" unless $tables->[-1];
897 885
     
898 886
     # Where
899
-    my $w;
900
-    if (ref $where eq 'HASH') {
901
-        my $clause = ['and'];
902
-        push @$clause, "{= $_}" for keys %$where;
903
-        $w = $self->where(clause => $clause, param => $where);
904
-    }
905
-    elsif (ref $where eq 'DBIx::Custom::Where') {
906
-        $w = $where;
907
-        $where = $w->param;
908
-    }
909
-    
910
-    croak qq{"where" must be hash reference or DBIx::Custom::Where object}
911
-      unless ref $w eq 'DBIx::Custom::Where';
887
+    my $w = $self->_where($where);
888
+    $where = $w->param;
912 889
     
913 890
     # String where
914 891
     my $swhere = "$w";
... ...
@@ -1041,21 +1018,8 @@ sub update {
1041 1018
     my $update_clause = '{update_param ' . join(' ', @clumns) . '}';
1042 1019
 
1043 1020
     # Where
1044
-    my $w;
1045
-    if (ref $where eq 'HASH') {
1046
-        my $clause = ['and'];
1047
-        push @$clause, "{= $_}" for keys %$where;
1048
-        $w = $self->where;
1049
-        $w->clause($clause);
1050
-        $w->param($where);
1051
-    }
1052
-    elsif (ref $where eq 'DBIx::Custom::Where') {
1053
-        $w = $where;
1054
-        $where = $w->param;
1055
-    }  
1056
-    
1057
-    croak qq{"where" must be hash refernce or DBIx::Custom::Where object}
1058
-      unless ref $w eq 'DBIx::Custom::Where';
1021
+    my $w = $self->_where($where);
1022
+    $where = $w->param;
1059 1023
     
1060 1024
     # String where
1061 1025
     my $swhere = "$w";
... ...
@@ -1329,6 +1293,32 @@ sub _push_join {
1329 1293
     }
1330 1294
 }
1331 1295
 
1296
+sub _where {
1297
+    my ($self, $where) = @_;
1298
+    
1299
+    my $w;
1300
+    if (ref $where eq 'HASH') {
1301
+        my $clause = ['and'];
1302
+        push @$clause, "{= $_}" for keys %$where;
1303
+        $w = $self->where(clause => $clause, param => $where);
1304
+    }
1305
+    elsif (ref $where eq 'DBIx::Custom::Where') {
1306
+        $w = $where;
1307
+    }
1308
+    elsif (ref $where eq 'ARRAY') {
1309
+        $w = $self->where(
1310
+            clause => $where->[0],
1311
+            param  => $where->[1]
1312
+        );
1313
+    }
1314
+    
1315
+    croak qq{"where" must be hash reference or DBIx::Custom::Where object} .
1316
+          qq{or array reference, which contains where clause and paramter}
1317
+      unless ref $w eq 'DBIx::Custom::Where';
1318
+    
1319
+    return $w;
1320
+}
1321
+
1332 1322
 # DEPRECATED!
1333 1323
 __PACKAGE__->attr(
1334 1324
     dbi_options => sub { {} },
... ...
@@ -1814,7 +1804,8 @@ Table name.
1814 1804
 
1815 1805
 =item C<where>
1816 1806
 
1817
-Where clause. This is hash reference or L<DBIx::Custom::Where> object.
1807
+Where clause. This is hash reference or L<DBIx::Custom::Where> object
1808
+or array refrence, which contains where clause and paramter.
1818 1809
     
1819 1810
     # Hash reference
1820 1811
     $dbi->delete(where => {title => 'Perl'});
... ...
@@ -1826,6 +1817,14 @@ Where clause. This is hash reference or L<DBIx::Custom::Where> object.
1826 1817
     );
1827 1818
     $dbi->delete(where => $where);
1828 1819
 
1820
+    # Array refrendce (where clause and parameter)
1821
+    $dbi->delete(where =>
1822
+        [
1823
+            ['and', '{= author}', '{like title}'],
1824
+            {author => 'Ken', title => '%Perl%'}
1825
+        ]
1826
+    );
1827
+    
1829 1828
 =item C<append>
1830 1829
 
1831 1830
 Append statement to last of SQL. This is string.
... ...
@@ -2326,7 +2325,8 @@ You can add before created statement
2326 2325
 
2327 2326
 =item C<where>
2328 2327
 
2329
-Where clause. This is hash reference or L<DBIx::Custom::Where> object.
2328
+Where clause. This is hash reference or L<DBIx::Custom::Where> object,
2329
+or array refrence, which contains where clause and paramter.
2330 2330
     
2331 2331
     # Hash reference
2332 2332
     $dbi->select(where => {author => 'Ken', 'title' => 'Perl'});
... ...
@@ -2338,6 +2338,14 @@ Where clause. This is hash reference or L<DBIx::Custom::Where> object.
2338 2338
     );
2339 2339
     $dbi->select(where => $where);
2340 2340
 
2341
+    # Array refrendce (where clause and parameter)
2342
+    $dbi->select(where =>
2343
+        [
2344
+            ['and', '{= author}', '{like title}'],
2345
+            {author => 'Ken', title => '%Perl%'}
2346
+        ]
2347
+    );
2348
+    
2341 2349
 =item C<join> EXPERIMENTAL
2342 2350
 
2343 2351
 Join clause used in need. This is array reference.
... ...
@@ -2505,7 +2513,8 @@ Update data. This is hash reference.
2505 2513
 
2506 2514
 =item C<where>
2507 2515
 
2508
-Where clause. This is hash reference or L<DBIx::Custom::Where> object.
2516
+Where clause. This is hash reference or L<DBIx::Custom::Where> object
2517
+or array refrence.
2509 2518
     
2510 2519
     # Hash reference
2511 2520
     $dbi->update(where => {author => 'Ken', 'title' => 'Perl'});
... ...
@@ -2516,6 +2525,14 @@ Where clause. This is hash reference or L<DBIx::Custom::Where> object.
2516 2525
         param  => {author => 'Ken', title => '%Perl%'}
2517 2526
     );
2518 2527
     $dbi->update(where => $where);
2528
+    
2529
+    # Array refrendce (where clause and parameter)
2530
+    $dbi->update(where =>
2531
+        [
2532
+            ['and', '{= author}', '{like title}'],
2533
+            {author => 'Ken', title => '%Perl%'}
2534
+        ]
2535
+    );
2519 2536
 
2520 2537
 =item C<append>
2521 2538
 
+1 -1
lib/DBIx/Custom/Model.pm
... ...
@@ -156,7 +156,7 @@ C<delete_at()>,C<select_at()>.
156 156
     
157 157
 Database data type, this is used as type optioon of C<insert()>, C<insert_at()>,
158 158
 C<update()>, C<update_at()>, C<update_all>, C<delete()>, C<delete_all()>,
159
-C<select(), C<select_at()>
159
+C<select()>, C<select_at()>
160 160
 
161 161
 =head2 C<view>
162 162
 
+40 -2
t/dbix-custom-core-sqlite.t
... ...
@@ -298,7 +298,21 @@ $where->clause(['and', '{= key1}', '{= key2}']);
298 298
 $where->param({key1 => 1, key2 => 2});
299 299
 $dbi->update(table => 'table1', param => {key1 => 3}, where => $where);
300 300
 $result = $dbi->select(table => 'table1');
301
-is_deeply($result->fetch_hash_all, [{key1 => 3, key2 => 2}], 'delete() where');
301
+is_deeply($result->fetch_hash_all, [{key1 => 3, key2 => 2}], 'update() where');
302
+
303
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
304
+$dbi->execute($CREATE_TABLE->{0});
305
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
306
+$dbi->update(
307
+    table => 'table1',
308
+    param => {key1 => 3},
309
+    where => [
310
+        ['and', '{= key1}', '{= key2}'],
311
+        {key1 => 1, key2 => 2}
312
+    ]
313
+);
314
+$result = $dbi->select(table => 'table1');
315
+is_deeply($result->fetch_hash_all, [{key1 => 3, key2 => 2}], 'update() where');
302 316
 
303 317
 $dbi = DBIx::Custom->connect($NEW_ARGS->{0});
304 318
 $dbi->execute($CREATE_TABLE->{0});
... ...
@@ -308,7 +322,7 @@ $where->clause(['and', '{= key2}']);
308 322
 $where->param({key2 => 2});
309 323
 $dbi->update(table => 'table1', param => {key1 => 3}, where => $where);
310 324
 $result = $dbi->select(table => 'table1');
311
-is_deeply($result->fetch_hash_all, [{key1 => 3, key2 => 2}], 'delete() where');
325
+is_deeply($result->fetch_hash_all, [{key1 => 3, key2 => 2}], 'update() where');
312 326
 
313 327
 eval{$dbi->update(table => 'table1', param => {';' => 1})};
314 328
 like($@, qr/safety/);
... ...
@@ -372,6 +386,20 @@ $dbi->delete(table => 'table1', where => $where);
372 386
 $result = $dbi->select(table => 'table1');
373 387
 is_deeply($result->fetch_hash_all, [{key1 => 3, key2 => 4}], 'delete() where');
374 388
 
389
+$dbi = DBIx::Custom->connect($NEW_ARGS->{0});
390
+$dbi->execute($CREATE_TABLE->{0});
391
+$dbi->insert(table => 'table1', param => {key1 => 1, key2 => 2});
392
+$dbi->insert(table => 'table1', param => {key1 => 3, key2 => 4});
393
+$dbi->delete(
394
+    table => 'table1',
395
+    where => [
396
+        ['and', '{= key1}', '{= key2}'],
397
+        {ke1 => 1, key2 => 2}
398
+    ]
399
+);
400
+$result = $dbi->select(table => 'table1');
401
+is_deeply($result->fetch_hash_all, [{key1 => 3, key2 => 4}], 'delete() where');
402
+
375 403
 test 'delete error';
376 404
 $dbi = DBIx::Custom->connect($NEW_ARGS->{0});
377 405
 $dbi->execute($CREATE_TABLE->{0});
... ...
@@ -931,6 +959,16 @@ $result = $dbi->select(
931 959
 $row = $result->fetch_hash_all;
932 960
 is_deeply($row, [{key1 => 1, key2 => 2}]);
933 961
 
962
+$result = $dbi->select(
963
+    table => 'table1',
964
+    where => [
965
+        ['and', '{= key1}', '{= key2}'],
966
+        {key1 => 1}
967
+    ]
968
+);
969
+$row = $result->fetch_hash_all;
970
+is_deeply($row, [{key1 => 1, key2 => 2}]);
971
+
934 972
 $where = $dbi->where
935 973
              ->clause(['and', '{= key1}', '{= key2}'])
936 974
              ->param({key1 => 1, key2 => 2});