code cleanup
[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
285baccb 16# this works when NOT using placeholders
17sub _fetch_identity_sql { 'SELECT @@IDENTITY' }
6b1f5ef7 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
7d17f469 34sub should_quote_value {
0c1bedfc 35 my $self = shift;
36 my ($type, $value) = @_;
37
7d17f469 38 return $self->next::method(@_) if not defined $value or not defined $type;
bbdc039b 39
17d750d7 40 if (my $key = List::Util::first { $type =~ /$_/i } keys %noquote) {
41 return 0 if $noquote{$key}->($value);
9b3dabe0 42 } elsif($self->is_datatype_numeric($type) && $number->($value)) {
43 return 0;
17d750d7 44 }
0c1bedfc 45
7d17f469 46## try to guess based on value
47# elsif (not $type) {
48# return 0 if $number->($value) || $noquote->{money}->($value);
49# }
50
0c1bedfc 51 return $self->next::method(@_);
52}
53
5608593e 541;
7e8cecc1 55
56=head1 NAME
57
58DBIx::Class::Storage::DBI::Sybase::NoBindVars - Storage::DBI subclass for Sybase
59without placeholder support
60
61=head1 DESCRIPTION
62
63If you're using this driver than your version of Sybase does not support
8c4b6c50 64placeholders, or your version of L<DBD::Sybase> was compiled with FreeTDS rather
65than the Sybase OpenClient libraries. You can check with:
7e8cecc1 66
67 $dbh->{syb_dynamic_supported}
68
8c4b6c50 69To see if you are using FreeTDS, run:
70
ed70dcb7 71 perl -MDBI -le 'my $dbh = DBI->connect($dsn, $user, $pass); print $dbh->{syb_oc_version}'
8c4b6c50 72
22b3249c 73You will get a warning on startup if you're using FreeTDS in any case.
74
7e8cecc1 75You can also enable this driver explicitly using:
76
77 my $schema = SchemaClass->clone;
78 $schema->storage_type('::DBI::Sybase::NoBindVars');
79 $schema->connect($dsn, $user, $pass, \%opts);
80
81See the discussion in L<< DBD::Sybase/Using ? Placeholders & bind parameters to
82$sth->execute >> for details on the pros and cons of using placeholders.
83
84One advantage of not using placeholders is that C<select @@identity> will work
85for obtainging the last insert id of an C<IDENTITY> column, instead of having to
86do C<select max(col)> as the base Sybase driver does.
87
88When using this driver, bind variables will be interpolated (properly quoted of
89course) into the SQL query itself, without using placeholders.
90
91The caching of prepared statements is also explicitly disabled, as the
92interpolation renders it useless.
93
94=head1 AUTHORS
95
96See L<DBIx::Class/CONTRIBUTORS>.
97
98=head1 LICENSE
99
100You may distribute this code under the same terms as Perl itself.
101
102=cut
103# vim:sts=2 sw=2: