doc tweak
[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
ed70dcb7 76 perl -MDBI -le 'my $dbh = DBI->connect($dsn, $user, $pass); print $dbh->{syb_oc_version}'
8c4b6c50 77
22b3249c 78You will get a warning on startup if you're using FreeTDS in any case.
79
7e8cecc1 80You can also enable this driver explicitly using:
81
82 my $schema = SchemaClass->clone;
83 $schema->storage_type('::DBI::Sybase::NoBindVars');
84 $schema->connect($dsn, $user, $pass, \%opts);
85
86See the discussion in L<< DBD::Sybase/Using ? Placeholders & bind parameters to
87$sth->execute >> for details on the pros and cons of using placeholders.
88
89One advantage of not using placeholders is that C<select @@identity> will work
90for obtainging the last insert id of an C<IDENTITY> column, instead of having to
91do C<select max(col)> as the base Sybase driver does.
92
93When using this driver, bind variables will be interpolated (properly quoted of
94course) into the SQL query itself, without using placeholders.
95
96The caching of prepared statements is also explicitly disabled, as the
97interpolation renders it useless.
98
99=head1 AUTHORS
100
101See L<DBIx::Class/CONTRIBUTORS>.
102
103=head1 LICENSE
104
105You may distribute this code under the same terms as Perl itself.
106
107=cut
108# vim:sts=2 sw=2: