change the (incorrect) version check to a check for FreeTDS
[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
8c4b6c50 69placeholders, or your version of L<DBD::Sybase> was compiled with FreeTDS rather
70than the Sybase OpenClient libraries. You can check with:
7e8cecc1 71
72 $dbh->{syb_dynamic_supported}
73
8c4b6c50 74To see if you are using FreeTDS, run:
75
76 perl -MDBD::Sybase -le 'print grep /Sybase\./, @DynaLoader::dl_shared_objects' | xargs ldd
77
78If you see C<libct.so> or similar, rather than C<libsybct.so> then you are using
79FreeTDS.
80
7e8cecc1 81You can also enable this driver explicitly using:
82
83 my $schema = SchemaClass->clone;
84 $schema->storage_type('::DBI::Sybase::NoBindVars');
85 $schema->connect($dsn, $user, $pass, \%opts);
86
87See the discussion in L<< DBD::Sybase/Using ? Placeholders & bind parameters to
88$sth->execute >> for details on the pros and cons of using placeholders.
89
90One advantage of not using placeholders is that C<select @@identity> will work
91for obtainging the last insert id of an C<IDENTITY> column, instead of having to
92do C<select max(col)> as the base Sybase driver does.
93
94When using this driver, bind variables will be interpolated (properly quoted of
95course) into the SQL query itself, without using placeholders.
96
97The caching of prepared statements is also explicitly disabled, as the
98interpolation renders it useless.
99
100=head1 AUTHORS
101
102See L<DBIx::Class/CONTRIBUTORS>.
103
104=head1 LICENSE
105
106You may distribute this code under the same terms as Perl itself.
107
108=cut
109# vim:sts=2 sw=2: