X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSQLMaker.pm;h=67f0a0a66898e432c6aabefe37282c6d0719ae52;hb=bf51641f97a504ae9796fcc45da4e409c6466ca4;hp=f43aa0b0abb19719d595b8ffcd6c0560ecbbacc3;hpb=3f5b99fea8b445c7a61057f4210a715ffb8e677e;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/SQLMaker.pm b/lib/DBIx/Class/SQLMaker.pm index f43aa0b..67f0a0a 100644 --- a/lib/DBIx/Class/SQLMaker.pm +++ b/lib/DBIx/Class/SQLMaker.pm @@ -24,6 +24,10 @@ Currently the enhancements to L are: =item * Support of C<...FOR UPDATE> type of select statement modifiers +=item * The -ident operator + +=item * The -value operator + =back =cut @@ -79,6 +83,63 @@ BEGIN { # as the value to abuse with MSSQL ordered subqueries) sub __max_int { 0xFFFFFFFF }; +sub new { + my $self = shift->next::method(@_); + + # use the same coderefs, they are prepared to handle both cases + my @extra_dbic_syntax = ( + { regex => qr/^ ident $/xi, handler => '_where_op_IDENT' }, + { regex => qr/^ value $/xi, handler => '_where_op_VALUE' }, + ); + + push @{$self->{special_ops}}, @extra_dbic_syntax; + push @{$self->{unary_ops}}, @extra_dbic_syntax; + + $self; +} + +sub _where_op_IDENT { + my $self = shift; + my ($op, $rhs) = splice @_, -2; + if (ref $rhs) { + croak "-$op takes a single scalar argument (a quotable identifier)"; + } + + # in case we are called as a top level special op (no '=') + my $lhs = shift; + + $_ = $self->_convert($self->_quote($_)) for ($lhs, $rhs); + + return $lhs + ? "$lhs = $rhs" + : $rhs + ; +} + +sub _where_op_VALUE { + my $self = shift; + my ($op, $rhs) = splice @_, -2; + + # in case we are called as a top level special op (no '=') + my $lhs = shift; + + my @bind = [ + ($lhs || $self->{_nested_func_lhs} || croak "Unable to find bindtype for -value $rhs"), + $rhs + ]; + + return $lhs + ? ( + $self->_convert($self->_quote($lhs)) . ' = ' . $self->_convert('?'), + @bind + ) + : ( + $self->_convert('?'), + @bind, + ) + ; +} + # Handle limit-dialect selection sub select { my ($self, $table, $fields, $where, $rs_attrs, $limit, $offset) = @_; @@ -159,13 +220,18 @@ sub insert { # which is sadly understood only by MySQL. Change default behavior here, # until SQLA2 comes with proper dialect support if (! $_[2] or (ref $_[2] eq 'HASH' and !keys %{$_[2]} ) ) { - my $sql = "INSERT INTO $_[1] DEFAULT VALUES"; + my @bind; + my $sql = sprintf( + 'INSERT INTO %s DEFAULT VALUES', $_[0]->_quote($_[1]) + ); - if (my $ret = ($_[3]||{})->{returning} ) { - $sql .= $_[0]->_insert_returning ($ret); + if ( ($_[3]||{})->{returning} ) { + my $s; + ($s, @bind) = $_[0]->_insert_returning ($_[3]); + $sql .= $s; } - return $sql; + return ($sql, @bind); } next::method(@_);