From: Andy Grundman Date: Fri, 12 Aug 2005 21:05:02 +0000 (+0000) Subject: Re-added software-based LIMIT support for non-LIMIT-supporting databases X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=5c91499f8d1122eaad9bb4f36ae50380feadd4eb;p=dbsrgits%2FDBIx-Class-Historic.git Re-added software-based LIMIT support for non-LIMIT-supporting databases --- diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index 50561d1..ad901c0 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -126,7 +126,13 @@ sub select { 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, $attrs->{rows}, $attrs->{offset}); + 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}; + } + my ($rv, $sth, @bind) = $self->_execute(@args); return $self->cursor->new($sth, \@bind, $attrs); } @@ -136,7 +142,13 @@ sub select_single { 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, 1, $attrs->{offset}); + 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, 1, $attrs->{offset}; + } + my ($rv, $sth, @bind) = $self->_execute(@args); return $sth->fetchrow_array; } diff --git a/lib/DBIx/Class/Storage/DBI/Cursor.pm b/lib/DBIx/Class/Storage/DBI/Cursor.pm index 143425b..67476c7 100644 --- a/lib/DBIx/Class/Storage/DBI/Cursor.pm +++ b/lib/DBIx/Class/Storage/DBI/Cursor.pm @@ -24,6 +24,11 @@ sub next { my $sth = $self->{sth}; unless ($self->{live_sth}) { $sth->execute(@{$self->{args} || []}); + if ($self->{attrs}{software_limit}) { + if (my $offset = $self->{attrs}{offset}) { + $sth->fetch for 1 .. $offset; + } + } $self->{live_sth} = 1; } my @row = $sth->fetchrow_array;