X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI.pm;h=f5794479d727e08e6d43c5f01806493547ec9fd3;hb=de705b510619176ba54e8addd4ff4f0d6c97ce61;hp=453d51c8b42c3bc9f93bcec9707f75011d4020f2;hpb=1a14aa3f5016c456db28c148abab256ea72776df;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index 453d51c..f579447 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -3,7 +3,7 @@ package DBIx::Class::Storage::DBI; use strict; use warnings; use DBI; -use SQL::Abstract; +use SQL::Abstract::Limit; use DBIx::Class::Storage::DBI::Cursor; use base qw/DBIx::Class/; @@ -11,11 +11,10 @@ use base qw/DBIx::Class/; __PACKAGE__->load_components(qw/Exception AccessorGroup/); __PACKAGE__->mk_group_accessors('simple' => - qw/connect_info _dbh sql_maker debug cursor/); + qw/connect_info _dbh _sql_maker debug cursor/); sub new { my $new = bless({}, ref $_[0] || $_[0]); - $new->sql_maker(new SQL::Abstract); $new->cursor("DBIx::Class::Storage::DBI::Cursor"); $new->debug(1) if $ENV{DBIX_CLASS_STORAGE_DBI_DEBUG}; return $new; @@ -56,6 +55,14 @@ sub dbh { return $self->_dbh; } +sub sql_maker { + my ($self) = @_; + unless ($self->_sql_maker) { + $self->_sql_maker(new SQL::Abstract::Limit( limit_dialect => $self->dbh )); + } + return $self->_sql_maker; +} + sub _populate_dbh { my ($self) = @_; my @info = @{$self->connect_info || []}; @@ -113,23 +120,32 @@ sub delete { return shift->_execute('delete' => [], @_); } -sub select { +sub _select { my ($self, $ident, $select, $condition, $attrs) = @_; my $order = $attrs->{order_by}; if (ref $condition eq 'SCALAR') { $order = $1 if $$condition =~ s/ORDER BY (.*)$//i; } - my ($rv, $sth, @bind) = $self->_execute('select', $attrs->{bind}, $ident, $select, $condition, $order); + $ident = $self->_build_from($ident) if ref $ident; + my @args = ('select', $attrs->{bind}, $ident, $select, $condition, $order); + if ($self->sql_maker->_default_limit_syntax eq "GenericSubQ") { + $attrs->{software_limit} = 1; + } else { + push @args, $attrs->{rows}, $attrs->{offset}; + } + return $self->_execute(@args); +} + +sub select { + my $self = shift; + my ($ident, $select, $condition, $attrs) = @_; + my ($rv, $sth, @bind) = $self->_select(@_); return $self->cursor->new($sth, \@bind, $attrs); } sub select_single { - my ($self, $ident, $select, $condition, $attrs) = @_; - my $order = $attrs->{order_by}; - if (ref $condition eq 'SCALAR') { - $order = $1 if $$condition =~ s/ORDER BY (.*)$//i; - } - my ($rv, $sth, @bind) = $self->_execute('select', $attrs->{bind}, $ident, $select, $condition, $order); + my $self = shift; + my ($rv, $sth, @bind) = $self->_select(@_); return $sth->fetchrow_array; } @@ -145,6 +161,8 @@ sub sth { Matt S. Trout +Andy Grundman + =head1 LICENSE You may distribute this code under the same terms as Perl itself.