Amp-Client
view release on metacpan or search on metacpan
lib/Amp/DbPoolClient.pm view on Meta::CPAN
my ($sql, $options, @params) = @_;
$self->payload->{sql} = $sql;
if (scalar(@params)) {
$self->__prepateStatement($sql, @params);
}
return $self->__exec() if !$options->{execute};
}
sub prepare {
my $self = shift;
my $sql = shift;
# Return a new instance to handle this transaction
my $sth = getDashDbPoolHandle();
$sth->payload->{sql} = $sql;
return $sth;
}
sub execute {
my $self = shift;
$self->do($self->payload->{sql}, { execute => 1 }, @_);
}
sub fetchrow_array {
my $self = shift;
if (!$self->resultSet && $self->payload->{sql}) {
$self->resultSet($self->getSqlValues($self->payload->{sql}));
}
my $val = shift @{$self->resultSet};
return $val;
}
sub fetchrow_hashref {
my $self = shift;
if (!$self->resultSet && $self->payload->{sql}) {
$self->resultSet($self->getSqlRows($self->payload->{sql}));
}
my $val = shift @{$self->resultSet};
return $val;
}
sub statement {
my $self = shift;
return $self->payload->{sql};
}
sub finish {
return 0;
}
sub __prepateStatement {
my $self = shift;
my $sql = shift;
my (@params) = @_;
my @replacements;
# find all the ? positions to replace
while ($sql =~ m/\?/g) {
push @replacements, pos($sql);
}
# validate the params given match the number of ? to replace
if (scalar(@replacements) != scalar(@params)) {
die "SQL has " . scalar(@replacements) . " parameters but " . scalar(@params) . " were given\n";
}
# Set the index mark to match the size of the @params for iterating through the replacements
my $i = (scalar(@params) - 1);
for my $pos (reverse @replacements) {
my $val = $self->quote($params[$i]);
substr($sql, $pos - 1, 1, $val);
$i--;
}
$self->payload->{sql} = $sql;
$self->{Statement} = $sql;
return $sql;
}
sub __exec {
my $self = shift;
if ($self->type && $self->type =~ m/^(readonly|any|master)$/) {
$self->payload->{handleType} = $self->type;
}
delete $self->{mysql_insertid} if $self->{mysql_insertid};
# Trim all the values to remove whitespace at beginning and end
for (keys %{$self->payload}) {$self->payload->{$_} = Amp::Util::Strings->clean($self->payload->{$_});}
my $data = $self->__sendRequest();
# Reset the payload hash
$self->payload({});
if (ref($data) eq 'HASH' && $data->{error}) {
print STDERR $data->{error};
return;
}
if (ref($data) eq 'HASH' && $data->{mysql_insertid}) {
$self->{mysql_insertid} = $data->{mysql_insertid};
}
return $data;
}
sub __sendRequest {
my $self = shift;
my $client = $self->client;
my $attempts = $self->retriesAttempted();
my $retryIfNeeded = $attempts < $self->retries;
$client->POST($self->url, Amp::Util::Strings->json_encode($self->payload));
my $data;
my $warning = sub {
warn("[" . $self->host . "] " . $client->responseCode() . " " . $client->responseContent());
return [];
};
if ($client->responseCode() == 200) {
$data = Amp::Util::Strings->json_decode($client->responseContent());
}
elsif ($client->responseCode() == 500 && $retryIfNeeded) {
( run in 0.675 second using v1.01-cache-2.11-cpan-140bd7fdf52 )