minor cleanups
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Sybase / NoBindVars.pm
CommitLineData
6b1f5ef7 1package DBIx::Class::Storage::DBI::Sybase::NoBindVars;
5608593e 2
b7505130 3use Class::C3;
5608593e 4use base qw/
5 DBIx::Class::Storage::DBI::NoBindVars
6 DBIx::Class::Storage::DBI::Sybase
7/;
b55e97a7 8use List::Util ();
0c449973 9use Scalar::Util ();
5608593e 10
9b3dabe0 11sub _rebless {
12 my $self = shift;
13 $self->disable_sth_caching(1);
14}
15
6b1f5ef7 16sub _dbh_last_insert_id {
17 my ($self, $dbh, $source, $col) = @_;
18
19 # @@identity works only if not using placeholders
20 # Should this query be cached?
21 return ($dbh->selectrow_array('select @@identity'))[0];
22}
23
0c449973 24my $number = sub { Scalar::Util::looks_like_number($_[0]) };
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
7d17f469 39sub should_quote_value {
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
17d750d7 45 if (my $key = List::Util::first { $type =~ /$_/i } keys %noquote) {
46 return 0 if $noquote{$key}->($value);
9b3dabe0 47 } elsif($self->is_datatype_numeric($type) && $number->($value)) {
48 return 0;
17d750d7 49 }
0c1bedfc 50
7d17f469 51## try to guess based on value
52# elsif (not $type) {
53# return 0 if $number->($value) || $noquote->{money}->($value);
54# }
55
0c1bedfc 56 return $self->next::method(@_);
57}
58
5608593e 591;
7e8cecc1 60
61=head1 NAME
62
63DBIx::Class::Storage::DBI::Sybase::NoBindVars - Storage::DBI subclass for Sybase
64without placeholder support
65
66=head1 DESCRIPTION
67
68If you're using this driver than your version of Sybase does not support
23419345 69placeholders, or your version of L<DBD::Sybase> is too old (you need at least
70C<1.09>. You can check with:
7e8cecc1 71
72 $dbh->{syb_dynamic_supported}
73
74You can also enable this driver explicitly using:
75
76 my $schema = SchemaClass->clone;
77 $schema->storage_type('::DBI::Sybase::NoBindVars');
78 $schema->connect($dsn, $user, $pass, \%opts);
79
80See the discussion in L<< DBD::Sybase/Using ? Placeholders & bind parameters to
81$sth->execute >> for details on the pros and cons of using placeholders.
82
83One advantage of not using placeholders is that C<select @@identity> will work
84for obtainging the last insert id of an C<IDENTITY> column, instead of having to
85do C<select max(col)> as the base Sybase driver does.
86
87When using this driver, bind variables will be interpolated (properly quoted of
88course) into the SQL query itself, without using placeholders.
89
90The caching of prepared statements is also explicitly disabled, as the
91interpolation renders it useless.
92
93=head1 AUTHORS
94
95See L<DBIx::Class/CONTRIBUTORS>.
96
97=head1 LICENSE
98
99You may distribute this code under the same terms as Perl itself.
100
101=cut
102# vim:sts=2 sw=2: