Skip to content

Commit 937504f

Browse files
committed
Add customized bulk_insert to ::DBD::MariaDB
1 parent 90ef108 commit 937504f

1 file changed

Lines changed: 39 additions & 0 deletions

File tree

lib/Data/ObjectDriver/Driver/DBD/MariaDB.pm

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package Data::ObjectDriver::Driver::DBD::MariaDB;
44
use strict;
55
use warnings;
6+
use Carp;
67
use base qw( Data::ObjectDriver::Driver::DBD::mysql );
78

89
sub fetch_id { $_[3]->{mariadb_insertid} || $_[3]->{insertid} }
@@ -19,4 +20,42 @@ sub bind_param_attributes {
1920
return;
2021
}
2122

23+
sub bulk_insert {
24+
my $dbd = shift;
25+
my $dbh = shift;
26+
my $table = shift;
27+
28+
my $cols = shift;
29+
my $rows_ref = shift;
30+
my $attrs = shift || {};
31+
32+
croak "Usage bulk_insert(dbd, dbh, table, columnref, rowsref)"
33+
unless (defined $dbd && defined $dbh && defined $table && defined $cols &&
34+
defined $rows_ref);
35+
36+
return 0e0 if (scalar(@{$rows_ref}) == 0);
37+
38+
my $sql = "INSERT INTO $table (" . join(',', @{$cols}) . ") VALUES\n";
39+
40+
my $one_data_row = "(" . (join ',', (('?') x @$cols)) . ")";
41+
my $ph = join ",", (($one_data_row) x @$rows_ref);
42+
$sql .= $ph;
43+
44+
# For now just write all data, at some point we need to lookup the
45+
# maximum packet size for SQL
46+
47+
if (%$attrs) {
48+
my $sth = $dbh->prepare($sql);
49+
my $i = 1;
50+
for my $row (@$rows_ref) {
51+
for (my $j = 0; $j < @$cols; $j++) {
52+
$sth->bind_param($i++, $row->[$j], $attrs->{$cols->[$j]});
53+
}
54+
}
55+
$sth->execute;
56+
} else {
57+
return $dbh->do($sql, undef, map { @$_ } @$rows_ref);
58+
}
59+
}
60+
2261
1;

0 commit comments

Comments
 (0)