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 )