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 )