Pcore-PgSQL
view release on metacpan or search on metacpan
lib/Pcore/PgSQL/DBH.pm view on Meta::CPAN
tag => $val[0],
oid => $val[1],
rows => $val[2],
};
}
elsif ( $val[0] eq 'CREATE' ) {
$tag = {
tag => $val[0],
rows => 0,
};
}
elsif ( $val[0] eq 'ALTER' ) {
$tag = {
tag => $val[0],
rows => 0,
};
}
else {
$tag = {
tag => $val[0],
rows => $val[1],
};
}
if ( exists $self->{sth}->{tag} ) {
$self->{sth}->{tag}->{rows} += $tag->{rows};
}
else {
$self->{sth}->{tag} = $tag;
}
return;
}
sub _ON_CLOSE_COMPLETE ( $self ) {
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";
}
}
$self->{h}->push_write($buf) if defined $buf;
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->{handle}->prepare_query($query);
$use_extended_query = defined $bind;
}
# query is plain text
else {
# convert "?" placeholders to postgres "$1" style
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} // q[];
my $portal_id = q[]; # uuid_v1mc_str;
( run in 1.555 second using v1.01-cache-2.11-cpan-39bf76dae61 )