Pcore
view release on metacpan or search on metacpan
lib/Pcore/Handle/pgsql/DBH.pm view on Meta::CPAN
$col = $EMPTY;
}
push $row->@*, $col;
}
push $sth->{rows}->@*, $row;
return;
}
sub _ON_PORTAL_SUSPENDED ( $self, $dataref ) {
$self->{sth}->{portal_suspended} = 1;
return;
}
sub _ON_COMMAND_COMPLETE ( $self, $dataref ) {
# remove trailing "\x00"
chop $dataref->$*;
if ( $dataref->$* =~ /\s(\d+)\z/sm ) {
$self->{sth}->{rows_tag} = $1;
}
return;
}
sub _ON_CLOSE_COMPLETE ( $self, $dataref ) {
return;
}
# flush outgoing messages buffer
sub _flush ( $self ) {
my $buf;
while ( my $msg = shift $self->{wbuf}->@* ) {
$buf .= $msg->[0];
if ( defined $msg->[1] ) {
$buf .= pack 'NA*', 4 + length $msg->[1], $msg->[1];
}
else {
$buf .= "\x00\x00\x00\x04";
}
}
if ( defined $buf ) {
$self->{h}->write($buf);
# write error
return $self->_on_fatal_error if !$self->{h};
}
return;
}
sub _execute ( $self, $query, $bind, $cb, %args ) {
if ( $self->{state} != $STATE_READY ) {
warn 'DBI: DBH is busy';
$cb->( undef, res [ 500, 'DBH is busy' ] );
return;
}
$self->{state} = $STATE_BUSY;
$self->{sth}->{cb} = $cb;
my $use_extended_query = defined $bind || defined $args{max_rows};
# query is prepared sth
if ( ref $query eq 'Pcore::Handle::DBI::STH' ) {
$use_extended_query = 1;
$self->{sth}->{id} = $query->{id};
# query is already prepared
if ( exists $self->{prepared_sth}->{ $query->{id} } ) {
$self->{sth}->{is_parse_complete} = 1;
# query is already described
if ( defined $self->{prepared_sth}->{ $query->{id} } ) {
$self->{sth}->{cols} = $self->{prepared_sth}->{ $query->{id} };
}
}
$query = $query->{query};
}
# query is ArrayRef
elsif ( is_plain_arrayref $query) {
( $query, $bind ) = $self->{pool}->prepare_query($query);
$use_extended_query = defined $bind;
}
# query is plain text
else {
# convert "?" placeholders to the "$1" style
if ( defined $bind ) {
my $i;
$query =~ s/[?]/'$' . ++$i/smge;
}
utf8::encode $query if utf8::is_utf8 $query;
}
$self->{query} = \$query;
# simple query mode
# multiple queries in single statement are allowed
if ( !$use_extended_query ) {
push $self->{wbuf}->@*, [ $PG_MSG_QUERY, "$query\x00" ];
}
# extended query mode
else {
my $query_id = $self->{sth}->{id} // $EMPTY;
( run in 0.536 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )