DBIx-DBO

 view release on metacpan or  search on metacpan

lib/DBIx/DBO/Query.pm  view on Meta::CPAN

This uses the DBI C<rows> method which is unreliable in some situations (See L<DBI-E<gt>rows|DBI/"rows">).

=cut

sub rows {
    my $me = shift;
    $me->{DBO}{dbd_class}->_rows($me) unless defined $me->{Row_Count};
    $me->{Row_Count};
}

=head3 C<count_rows>

  my $row_count = $query->count_rows;

Count the number of rows that would be returned.
Returns undefined if there is an error.

=cut

sub count_rows {
    my $me = shift;
    local $me->{Config}{CalcFoundRows} = 0;
    local $me->{build_data}{select} = [[[], 1]];
    my $old_sb = delete $me->{build_data}{Show_Bind};

    my $sql = 'SELECT COUNT(*) FROM ('.$me->{DBO}{dbd_class}->_build_sql_select($me).') t';
    my($count) = $me->{DBO}{dbd_class}->_selectrow_array($me, $sql, undef,
        $me->{DBO}{dbd_class}->_bind_params_select($me));

    $me->{build_data}{Show_Bind} = $old_sb if $old_sb;
    return $count;
}

=head3 C<found_rows>

  $query->config(CalcFoundRows => 1); # Only applicable to MySQL
  my $total_rows = $query->found_rows;

Return the number of rows that would have been returned if there was no limit clause.  Before runnning the query the C<CalcFoundRows> config option can be enabled for improved performance on supported databases.

Returns undefined if there is an error or is unable to determine the number of found rows.

=cut

sub found_rows {
    my $me = shift;
    return $me->{Found_Rows} // $me->{DBO}{dbd_class}->_calc_found_rows($me);
}

=head3 C<update>

  $query->update(department => 'Tech');
  $query->update(salary => { FUNC => '? * 1.10', COL => 'salary' }); # 10% raise

Updates every row in the query with the new values specified.
Returns the number of rows updated or C<'0E0'> for no rows to ensure the value is true,
and returns false if there was an error.

=cut

sub update {
    my $me = shift;
    my @update = $me->{DBO}{dbd_class}->_parse_set($me, @_);
    my $sql = $me->{DBO}{dbd_class}->_build_sql_update($me, @update);
    $me->{DBO}{dbd_class}->_do($me, $sql, undef, $me->{DBO}{dbd_class}->_bind_params_update($me));
}

=head3 C<sql>

  my $sql = $query->sql;

Returns the SQL statement string.

=cut

sub _recursion_check {
    my($me, @upquery) = @_;

    state @_recursion_check;
    push @_recursion_check, $me;

    for my $upquery (@upquery) {
        if (grep $upquery eq $_, @_recursion_check) {
            undef @_recursion_check;
            croak 'Recursive subquery found';
        }
        exists $upquery->{up_queries}
            and $upquery->_recursion_check(grep defined($_), @{ $upquery->{up_queries} });
    }

    pop @_recursion_check;
}

sub _add_up_query {
    my($me, $upquery) = @_;

    $me->_recursion_check($upquery);

    my $uq = $me->{up_queries} //= [];
    push @$uq, $upquery;
    weaken $uq->[-1];
}

sub sql {
    my $me = shift;
    return $me->{DBO}{dbd_class}->_build_sql_select($me);
}

sub _inactivate {
    my $me = shift;
    $me->_empty_row;
    # Also inactivate super queries
    if (exists $me->{up_queries}) {
        defined $_ and $_->_inactivate for @{ $me->{up_queries} };
    }
    # Reset the query
    delete $me->{cache};
    undef $me->{sth};
    undef $me->{sql};
    undef $me->{bind};
    undef $me->{hash};



( run in 1.772 second using v1.01-cache-2.11-cpan-995e09ba956 )