Showing 3 changed files with 72 additions and 3 deletions
+2
Changes
... ...
@@ -1,3 +1,5 @@
1
+0.2103
2
+    - added EXPERIMENTAL insert bulk_insert option.
1 3
 0.2102
2 4
     - fixed bug that DBIx::Custom::Model count method don't receive model's
3 5
       attribute
+48 -3
lib/DBIx/Custom.pm
... ...
@@ -1,7 +1,7 @@
1 1
 package DBIx::Custom;
2 2
 use Object::Simple -base;
3 3
 
4
-our $VERSION = '0.2102';
4
+our $VERSION = '0.2103';
5 5
 use 5.008001;
6 6
 
7 7
 use Carp 'croak';
... ...
@@ -683,8 +683,19 @@ sub insert {
683 683
     # Insert statement
684 684
     my $sql = "insert ";
685 685
     $sql .= "$opt{prefix} " if defined $opt{prefix};
686
-    $sql .= "into " . $self->q($opt{table}) . " "
687
-      . $self->values_clause($params->[0], {wrap => $opt{wrap}}) . " ";
686
+    $sql .= "into " . $self->q($opt{table}) . " ";
687
+    if ($opt{bulk_insert}) {
688
+        $sql .= $self->_multi_values_clause($params, {wrap => $opt{wrap}}) . " ";
689
+        my $new_param = {};
690
+        $new_param->{$_} = [] for keys %{$params->[0]};
691
+        for my $param (@$params) {
692
+            push @{$new_param->{$_}}, $param->{$_} for keys %$param;
693
+        }
694
+        $params = [$new_param];
695
+    }
696
+    else {
697
+        $sql .= $self->values_clause($params->[0], {wrap => $opt{wrap}}) . " ";
698
+    }
688 699
 
689 700
     # Remove id from parameter
690 701
     delete $params->[0]->{$_} for @cleanup;
... ...
@@ -1235,6 +1246,30 @@ sub values_clause {
1235 1246
     ')'
1236 1247
 }
1237 1248
 
1249
+sub _multi_values_clause {
1250
+    my ($self, $params, $opts) = @_;
1251
+    
1252
+    my $wrap = $opts->{wrap} || {};
1253
+    
1254
+    # Create insert parameter tag
1255
+    my ($q, $p) = split //, $self->q('');
1256
+    
1257
+    # Multi values clause
1258
+    my $clause = '(' . join(', ', map { "$q$_$p" } sort keys %{$params->[0]}) . ') values ';
1259
+    
1260
+    for (1 .. @$params) {
1261
+        $clause .= '(' . join(', ', 
1262
+          map {
1263
+              ref $params->[0]->{$_} eq 'SCALAR' ? ${$params->[0]->{$_}} :
1264
+              $wrap->{$_} ? $wrap->{$_}->(":$_") :
1265
+              ":$_";
1266
+          } sort keys %{$params->[0]}
1267
+        ) . '), '
1268
+    }
1269
+    $clause =~ s/, $//;
1270
+    return $clause;
1271
+}
1272
+
1238 1273
 sub where { DBIx::Custom::Where->new(dbi => shift, @_) }
1239 1274
 
1240 1275
 sub _create_query {
... ...
@@ -2795,6 +2830,16 @@ and use the following new ones.
2795 2830
 
2796 2831
 =over 4
2797 2832
 
2833
+=item C<bulk_insert> EXPERIMENTAL
2834
+
2835
+    bulk_insert => 1
2836
+
2837
+bulk insert is executed if database support bulk insert and 
2838
+multiple parameters is passed to C<insert>.
2839
+The SQL like the following one is executed.
2840
+
2841
+    insert into book (id, title) values (?, ?), (?, ?);
2842
+
2798 2843
 =item C<created_at>
2799 2844
 
2800 2845
     created_at => 'created_datetime'
+22
t/mysql.t
... ...
@@ -47,6 +47,28 @@ ok(!$@);
47 47
 eval { $dbi->do('drop table table1') };
48 48
 $dbi->do('create table table1 (key1 varchar(255), key2 varchar(255)) engine=InnoDB');
49 49
 
50
+test 'bulk_insert';
51
+$dbi->delete_all(table => 'table1');
52
+$dbi->insert(
53
+    [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}],
54
+    table => 'table1',
55
+    bulk_insert => 1
56
+);
57
+like($dbi->last_sql, qr/(\?.+){4}/);
58
+$rows = $dbi->select(table => 'table1')->all;
59
+is_deeply($rows, [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}]);
60
+
61
+$dbi->delete_all(table => 'table1');
62
+$dbi->insert(
63
+    [{key1 => 1, key2 => 2}, {key1 => 3, key2 => 4}],
64
+    table => 'table1',
65
+    bulk_insert => 1,
66
+    filter => {key1 => sub { $_[0] * 2 }}
67
+);
68
+like($dbi->last_sql, qr/(\?.+){4}/);
69
+$rows = $dbi->select(table => 'table1')->all;
70
+is_deeply($rows, [{key1 => 2, key2 => 2}, {key1 => 6, key2 => 4}]);
71
+
50 72
 test 'update_or_insert';
51 73
 $dbi->delete_all(table => 'table1');
52 74
 $dbi->update_or_insert(