Merge 'trunk' into 'sybase'
[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
6b1f5ef7 11sub _dbh_last_insert_id {
12 my ($self, $dbh, $source, $col) = @_;
13
14 # @@identity works only if not using placeholders
15 # Should this query be cached?
16 return ($dbh->selectrow_array('select @@identity'))[0];
17}
18
0c449973 19my $number = sub { Scalar::Util::looks_like_number($_[0]) };
20
b88bf40a 21my $decimal = sub { $_[0] =~ /^ [-+]? \d+ (?:\.\d*)? \z/x };
22
b55e97a7 23my %noquote = (
b88bf40a 24 int => sub { $_[0] =~ /^ [-+]? \d+ \z/x },
0c449973 25 bit => => sub { $_[0] =~ /^[01]\z/ },
b88bf40a 26 money => sub { $_[0] =~ /^\$ \d+ (?:\.\d*)? \z/x },
0c449973 27 float => $number,
28 real => $number,
29 double => $number,
b88bf40a 30 decimal => $decimal,
31 numeric => $decimal,
b55e97a7 32);
0c1bedfc 33
6636ad53 34sub should_quote {
0c1bedfc 35 my $self = shift;
36 my ($type, $value) = @_;
37
38 return $self->next::method(@_) if not defined $value;
39
bbdc039b 40 $type ||= '';
41
17d750d7 42 if (my $key = List::Util::first { $type =~ /$_/i } keys %noquote) {
43 return 0 if $noquote{$key}->($value);
bbdc039b 44 } elsif (not $type) {
e3c25a1d 45# try to guess based on value
46 return 0 if $number->($value) || $noquote->{money}->($value);
17d750d7 47 }
0c1bedfc 48
49 return $self->next::method(@_);
50}
51
5608593e 521;
7e8cecc1 53
54=head1 NAME
55
56DBIx::Class::Storage::DBI::Sybase::NoBindVars - Storage::DBI subclass for Sybase
57without placeholder support
58
59=head1 DESCRIPTION
60
61If you're using this driver than your version of Sybase does not support
62placeholders. You can check with:
63
64 $dbh->{syb_dynamic_supported}
65
66You can also enable this driver explicitly using:
67
68 my $schema = SchemaClass->clone;
69 $schema->storage_type('::DBI::Sybase::NoBindVars');
70 $schema->connect($dsn, $user, $pass, \%opts);
71
72See the discussion in L<< DBD::Sybase/Using ? Placeholders & bind parameters to
73$sth->execute >> for details on the pros and cons of using placeholders.
74
75One advantage of not using placeholders is that C<select @@identity> will work
76for obtainging the last insert id of an C<IDENTITY> column, instead of having to
77do C<select max(col)> as the base Sybase driver does.
78
79When using this driver, bind variables will be interpolated (properly quoted of
80course) into the SQL query itself, without using placeholders.
81
82The caching of prepared statements is also explicitly disabled, as the
83interpolation renders it useless.
84
85=head1 AUTHORS
86
87See L<DBIx::Class/CONTRIBUTORS>.
88
89=head1 LICENSE
90
91You may distribute this code under the same terms as Perl itself.
92
93=cut
94# vim:sts=2 sw=2: