DBD-PgPP
view release on metacpan or search on metacpan
lib/DBD/PgPP.pm view on Meta::CPAN
map { sprintf '%s', (/[[:graph:] ]/) ? $_ : '.' } split //, $chunk;
print "\n";
}
}
sub get_stream {
my ($self) = @_;
$self->{stream} = DBD::PgPP::PacketStream->new($self->{'socket'})
if !defined $self->{stream};
return $self->{stream};
}
sub _do_authentication {
my ($self) = @_;
my $stream = $self->get_stream;
while (1) {
my $packet = $stream->each;
last if $packet->is_end_of_response;
Carp::croak($packet->get_message) if $packet->is_error;
$packet->compute($self);
}
}
sub prepare {
my ($self, $sql) = @_;
$self->{error_message} = '';
return DBD::PgPP::ProtocolStatement->new($self, $sql);
}
sub has_error {
my ($self) = @_;
return 1 if $self->{error_message};
}
sub get_error_message {
my ($self) = @_;
return $self->{error_message};
}
sub parse_statement {
my ($invocant, $statement) = @_;
my $param_num = 0;
my $comment_depth = 0;
my @tokens = ('');
Parse: for ($statement) {
# Observe the default action at the end
if (m{\G \z}xmsgc) { last Parse }
elsif (m{\G( /\* .*? ) (?= /\* | \*/) }xmsgc) { $comment_depth++ }
elsif ($comment_depth && m{\G( .*? ) (?= /\* | \*/)}xmsgc) { }
elsif ($comment_depth && m{\G( \*/ )}xmsgc) { $comment_depth-- }
elsif (m{\G \?}xmsgc) {
pop @tokens if $tokens[-1] eq '';
push @tokens, \(my $tmp = $param_num++), '';
redo Parse;
}
elsif (m{\G( -- [^\n]* )}xmsgc) { }
elsif (m{\G( \' (?> [^\\\']* (?> \\. [^\\\']*)* ) \' )}xmsgc) { }
elsif (m{\G( \" [^\"]* \" )}xmsgc) { }
elsif (m{\G( \s+ | \w+ | ::? | \$[0-9]+ | [-/*\$]
| [^[:ascii:]]+ | [\0-\037\177]+)}xmsgc) { }
elsif (m{\G( [+<>=~!\@\#%^&|`,;.()\[\]{}]+ )}xmsgc) { }
elsif (m{\G( [\'\"\\] )}xmsgc) { } # unmatched: a bug in your query
else {
my $pos = pos;
die "BUG: can't parse statement at $pos\n$statement\n";
}
$tokens[-1] .= $1;
redo Parse;
}
pop @tokens if @tokens > 1 && $tokens[-1] eq '';
return \@tokens;
}
package DBD::PgPP::ProtocolStatement;
sub new {
my ($class, $pgsql, $statement) = @_;
bless {
postgres => $pgsql,
statement => $statement,
rows => [],
}, $class;
}
sub execute {
my ($self) = @_;
my $pgsql = $self->{postgres};
my $handle = $pgsql->get_handle;
my $query_packet = "Q$self->{statement}\0";
print " ==> Query\n" if $DEBUG;
DBD::PgPP::Protocol::_dump_packet($query_packet);
$handle->send($query_packet, 0);
$self->{affected_rows} = 0;
$self->{last_oid} = undef;
$self->{rows} = [];
my $stream = $pgsql->get_stream;
my $packet = $stream->each;
if ($packet->is_error) {
$self->_to_end_of_response($stream);
die $packet->get_message;
}
elsif ($packet->is_end_of_response) {
return;
}
elsif ($packet->is_empty) {
$self->_to_end_of_response($stream);
return;
}
while ($packet->is_notice_response) {
# XXX: discard it for now
$packet = $stream->each;
}
( run in 1.243 second using v1.01-cache-2.11-cpan-97f6503c9c8 )