add money type support
[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);
28cea3aa 42 } elsif ($self->is_datatype_numeric($type) && $number->($value)) {
9b3dabe0 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
e06ad5d5 54sub transform_unbound_value {
55 my ($self, $type, $value) = @_;
56
57 if ($type =~ /money/i && defined $value) {
58 $value =~ s/^\$//;
59 $value = '$' . $value;
60 }
61
62 return $value;
63}
64
5608593e 651;
7e8cecc1 66
67=head1 NAME
68
69DBIx::Class::Storage::DBI::Sybase::NoBindVars - Storage::DBI subclass for Sybase
70without placeholder support
71
72=head1 DESCRIPTION
73
74If you're using this driver than your version of Sybase does not support
8c4b6c50 75placeholders, or your version of L<DBD::Sybase> was compiled with FreeTDS rather
76than the Sybase OpenClient libraries. You can check with:
7e8cecc1 77
78 $dbh->{syb_dynamic_supported}
79
8c4b6c50 80To see if you are using FreeTDS, run:
81
ed70dcb7 82 perl -MDBI -le 'my $dbh = DBI->connect($dsn, $user, $pass); print $dbh->{syb_oc_version}'
8c4b6c50 83
22b3249c 84You will get a warning on startup if you're using FreeTDS in any case.
85
7e8cecc1 86You can also enable this driver explicitly using:
87
88 my $schema = SchemaClass->clone;
89 $schema->storage_type('::DBI::Sybase::NoBindVars');
90 $schema->connect($dsn, $user, $pass, \%opts);
91
92See the discussion in L<< DBD::Sybase/Using ? Placeholders & bind parameters to
93$sth->execute >> for details on the pros and cons of using placeholders.
94
95One advantage of not using placeholders is that C<select @@identity> will work
96for obtainging the last insert id of an C<IDENTITY> column, instead of having to
97do C<select max(col)> as the base Sybase driver does.
98
99When using this driver, bind variables will be interpolated (properly quoted of
100course) into the SQL query itself, without using placeholders.
101
102The caching of prepared statements is also explicitly disabled, as the
103interpolation renders it useless.
104
105=head1 AUTHORS
106
107See L<DBIx::Class/CONTRIBUTORS>.
108
109=head1 LICENSE
110
111You may distribute this code under the same terms as Perl itself.
112
113=cut
114# vim:sts=2 sw=2: