package SQL::Abstract; # see doc at end of file
+use SQL::Abstract::_TempExtlib;
+
use Carp ();
use List::Util ();
use Scalar::Util ();
use Module::Runtime qw(use_module);
+use Sub::Quote 'quote_sub';
use Moo;
use namespace::clean;
-our $VERSION = '1.74';
+# DO NOT INCREMENT TO 2.0 WITHOUT COORDINATING WITH mst OR ribasushi
+ our $VERSION = '1.99_01';
+# DO NOT INCREMENT TO 2.0 WITHOUT COORDINATING WITH mst OR ribasushi
+
# This would confuse some packagers
$VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
Carp::croak "[$func] Fatal: ", @_;
}
-has converter => (is => 'lazy', clearer => 'clear_converter');
+has converter => (is => 'lazy', clearer => 1);
has case => (
- is => 'ro', coerce => sub { $_[0] eq 'lower' ? 'lower' : undef }
+ is => 'ro', coerce => quote_sub( q{ $_[0] eq 'lower' ? 'lower' : undef } ),
);
has logic => (
- is => 'ro', coerce => sub { uc($_[0]) }, default => sub { 'OR' }
+ is => 'ro', coerce => quote_sub( q{ uc($_[0]) } ), default => 'OR',
);
has bindtype => (
- is => 'ro', default => sub { 'normal' }
+ is => 'ro', default => 'normal'
);
-has cmp => (is => 'ro', default => sub { '=' });
+has cmp => (is => 'ro', default => '=');
-has sqltrue => (is => 'ro', default => sub { '1=1' });
-has sqlfalse => (is => 'ro', default => sub { '0=1' });
+has sqltrue => (is => 'ro', default => '1=1' );
+has sqlfalse => (is => 'ro', default => '0=1' );
-has special_ops => (is => 'ro', default => sub { [] });
-has unary_ops => (is => 'ro', default => sub { [] });
+has special_ops => (is => 'ro', default => quote_sub( q{ [] } ));
+has unary_ops => (is => 'ro', default => quote_sub( q{ [] } ));
# FIXME
# need to guard against ()'s in column names too, but this will break tons of
has injection_guard => (
is => 'ro',
- default => sub {
+ default => quote_sub( q{
qr/
\;
|
^ \s* go \s
/xmi;
- }
+ })
);
-has renderer => (is => 'lazy', clearer => 'clear_renderer');
+has renderer => (is => 'lazy', clearer => 1);
has name_sep => (
- is => 'rw', default => sub { '.' },
- trigger => sub {
+ is => 'rw', default => '.',
+ trigger => quote_sub( q{
$_[0]->clear_renderer;
$_[0]->clear_converter;
- },
+ }),
);
has quote_char => (
is => 'rw',
- trigger => sub {
+ trigger => quote_sub( q{
$_[0]->clear_renderer;
$_[0]->clear_converter;
- },
+ }),
);
has collapse_aliases => (
is => 'ro',
- default => sub { 0 }
+ default => 0,
);
has always_quote => (
- is => 'rw', default => sub { 1 },
- trigger => sub {
+ is => 'rw', default => 1,
+ trigger => quote_sub( q{
$_[0]->clear_renderer;
$_[0]->clear_converter;
- },
+ }),
);
has convert => (is => 'ro');
has array_datatypes => (is => 'ro');
has converter_class => (
- is => 'rw', lazy => 1, builder => '_build_converter_class',
- trigger => sub { shift->clear_converter },
+ is => 'rw', lazy => 1, builder => 1,
+ trigger => quote_sub( q{ $_[0]->clear_converter } ),
);
sub _build_converter_class {
has renderer_class => (
is => 'rw', lazy => 1, clearer => 1, builder => 1,
- trigger => sub { shift->clear_renderer },
+ trigger => quote_sub( q{ $_[0]->clear_renderer } ),
);
-after clear_renderer_class => sub { shift->clear_renderer };
+after clear_renderer_class => sub { $_[0]->clear_renderer };
sub _build_renderer_class {
my ($self) = @_;
# Conversion, if applicable
sub _convert ($) {
#my ($self, $arg) = @_;
-
-# LDNOTE : modified the previous implementation below because
-# it was not consistent : the first "return" is always an array,
-# the second "return" is context-dependent. Anyway, _convert
-# seems always used with just a single argument, so make it a
-# scalar function.
-# return @_ unless $self->{convert};
-# my $conv = $self->_sqlcase($self->{convert});
-# my @ret = map { $conv.'('.$_.')' } @_;
-# return wantarray ? @ret : $ret[0];
if ($_[0]->{convert}) {
return $_[0]->_sqlcase($_[0]->{convert}) .'(' . $_[1] . ')';
}
# And bindtype
sub _bindtype (@) {
#my ($self, $col, @vals) = @_;
-
- #LDNOTE : changed original implementation below because it did not make
- # sense when bindtype eq 'columns' and @vals > 1.
-# return $self->{bindtype} eq 'columns' ? [ $col, @vals ] : @vals;
-
# called often - tighten code
return $_[0]->{bindtype} eq 'columns'
? map {[$_[1], $_]} @_[2 .. $#_]
my %where = (
-and => [
-bool => 'one',
- -bool => 'two',
- -bool => 'three',
- -not_bool => 'four',
+ -not_bool => { two=> { -rlike => 'bar' } },
+ -not_bool => { three => [ { '=', 2 }, { '>', 5 } ] },
],
);
Would give you:
- WHERE one AND two AND three AND NOT four
+ WHERE
+ one
+ AND
+ (NOT two RLIKE ?)
+ AND
+ (NOT ( three = ? OR three > ? ))
=head2 Nested conditions, -and/-or prefixes
#!/usr/bin/perl
+ use warnings;
+ use strict;
+
use CGI::FormBuilder;
use SQL::Abstract;