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 )