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