Add strict/warnings test, adjust all offenders (wow, that was a lot)
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Sybase / ASE / NoBindVars.pm
CommitLineData
057db5ce 1package DBIx::Class::Storage::DBI::Sybase::ASE::NoBindVars;
5608593e 2
4a233f30 3use warnings;
4use strict;
5
5608593e 6use base qw/
7 DBIx::Class::Storage::DBI::NoBindVars
057db5ce 8 DBIx::Class::Storage::DBI::Sybase::ASE
5608593e 9/;
322b7a6b 10use mro 'c3';
6298a324 11use List::Util 'first';
12use Scalar::Util 'looks_like_number';
13use namespace::clean;
5608593e 14
37b17a93 15sub _init {
9b3dabe0 16 my $self = shift;
17 $self->disable_sth_caching(1);
322b7a6b 18 $self->_identity_method('@@IDENTITY');
37b17a93 19 $self->next::method (@_);
9b3dabe0 20}
21
322b7a6b 22sub _fetch_identity_sql { 'SELECT ' . $_[0]->_identity_method }
6b1f5ef7 23
6298a324 24my $number = sub { looks_like_number $_[0] };
0c449973 25
b88bf40a 26my $decimal = sub { $_[0] =~ /^ [-+]? \d+ (?:\.\d*)? \z/x };
27
b55e97a7 28my %noquote = (
b88bf40a 29 int => sub { $_[0] =~ /^ [-+]? \d+ \z/x },
0c449973 30 bit => => sub { $_[0] =~ /^[01]\z/ },
b88bf40a 31 money => sub { $_[0] =~ /^\$ \d+ (?:\.\d*)? \z/x },
0c449973 32 float => $number,
33 real => $number,
34 double => $number,
b88bf40a 35 decimal => $decimal,
36 numeric => $decimal,
b55e97a7 37);
0c1bedfc 38
80007f97 39sub interpolate_unquoted {
0c1bedfc 40 my $self = shift;
41 my ($type, $value) = @_;
42
7d17f469 43 return $self->next::method(@_) if not defined $value or not defined $type;
bbdc039b 44
6298a324 45 if (my $key = first { $type =~ /$_/i } keys %noquote) {
80007f97 46 return 1 if $noquote{$key}->($value);
47 }
48 elsif ($self->is_datatype_numeric($type) && $number->($value)) {
49 return 1;
17d750d7 50 }
7d17f469 51
0c1bedfc 52 return $self->next::method(@_);
53}
54
166c6561 55sub _prep_interpolated_value {
e06ad5d5 56 my ($self, $type, $value) = @_;
57
58 if ($type =~ /money/i && defined $value) {
0ac07712 59 # change a ^ not followed by \$ to a \$
60 $value =~ s/^ (?! \$) /\$/x;
e06ad5d5 61 }
62
63 return $value;
64}
65
5608593e 661;
7e8cecc1 67
68=head1 NAME
69
057db5ce 70DBIx::Class::Storage::DBI::Sybase::ASE::NoBindVars - Storage::DBI subclass for
71Sybase ASE without placeholder support
7e8cecc1 72
73=head1 DESCRIPTION
74
48580715 75If you're using this driver then your version of Sybase or the libraries you
76use to connect to it do not support placeholders.
22b3249c 77
7e8cecc1 78You can also enable this driver explicitly using:
79
80 my $schema = SchemaClass->clone;
057db5ce 81 $schema->storage_type('::DBI::Sybase::ASE::NoBindVars');
7e8cecc1 82 $schema->connect($dsn, $user, $pass, \%opts);
83
84See the discussion in L<< DBD::Sybase/Using ? Placeholders & bind parameters to
85$sth->execute >> for details on the pros and cons of using placeholders.
86
87One advantage of not using placeholders is that C<select @@identity> will work
48580715 88for obtaining the last insert id of an C<IDENTITY> column, instead of having to
e97a6ee2 89do C<select max(col)> in a transaction as the base Sybase driver does.
7e8cecc1 90
91When using this driver, bind variables will be interpolated (properly quoted of
92course) into the SQL query itself, without using placeholders.
93
94The caching of prepared statements is also explicitly disabled, as the
95interpolation renders it useless.
96
97=head1 AUTHORS
98
99See L<DBIx::Class/CONTRIBUTORS>.
100
101=head1 LICENSE
102
103You may distribute this code under the same terms as Perl itself.
104
105=cut
106# vim:sts=2 sw=2: