spelling fixes in the documaentation, sholud be gud now ;)
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Sybase / ASE / NoBindVars.pm
CommitLineData
057db5ce 1package DBIx::Class::Storage::DBI::Sybase::ASE::NoBindVars;
5608593e 2
3use base qw/
4 DBIx::Class::Storage::DBI::NoBindVars
057db5ce 5 DBIx::Class::Storage::DBI::Sybase::ASE
5608593e 6/;
322b7a6b 7use mro 'c3';
b55e97a7 8use List::Util ();
0c449973 9use Scalar::Util ();
5608593e 10
37b17a93 11sub _init {
9b3dabe0 12 my $self = shift;
13 $self->disable_sth_caching(1);
322b7a6b 14 $self->_identity_method('@@IDENTITY');
37b17a93 15 $self->next::method (@_);
9b3dabe0 16}
17
322b7a6b 18sub _fetch_identity_sql { 'SELECT ' . $_[0]->_identity_method }
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
80007f97 35sub interpolate_unquoted {
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) {
80007f97 42 return 1 if $noquote{$key}->($value);
43 }
44 elsif ($self->is_datatype_numeric($type) && $number->($value)) {
45 return 1;
17d750d7 46 }
7d17f469 47
0c1bedfc 48 return $self->next::method(@_);
49}
50
166c6561 51sub _prep_interpolated_value {
e06ad5d5 52 my ($self, $type, $value) = @_;
53
54 if ($type =~ /money/i && defined $value) {
0ac07712 55 # change a ^ not followed by \$ to a \$
56 $value =~ s/^ (?! \$) /\$/x;
e06ad5d5 57 }
58
59 return $value;
60}
61
5608593e 621;
7e8cecc1 63
64=head1 NAME
65
057db5ce 66DBIx::Class::Storage::DBI::Sybase::ASE::NoBindVars - Storage::DBI subclass for
67Sybase ASE without placeholder support
7e8cecc1 68
69=head1 DESCRIPTION
70
48580715 71If you're using this driver then your version of Sybase or the libraries you
72use to connect to it do not support placeholders.
22b3249c 73
7e8cecc1 74You can also enable this driver explicitly using:
75
76 my $schema = SchemaClass->clone;
057db5ce 77 $schema->storage_type('::DBI::Sybase::ASE::NoBindVars');
7e8cecc1 78 $schema->connect($dsn, $user, $pass, \%opts);
79
80See the discussion in L<< DBD::Sybase/Using ? Placeholders & bind parameters to
81$sth->execute >> for details on the pros and cons of using placeholders.
82
83One advantage of not using placeholders is that C<select @@identity> will work
48580715 84for obtaining the last insert id of an C<IDENTITY> column, instead of having to
e97a6ee2 85do C<select max(col)> in a transaction as the base Sybase driver does.
7e8cecc1 86
87When using this driver, bind variables will be interpolated (properly quoted of
88course) into the SQL query itself, without using placeholders.
89
90The caching of prepared statements is also explicitly disabled, as the
91interpolation renders it useless.
92
93=head1 AUTHORS
94
95See L<DBIx::Class/CONTRIBUTORS>.
96
97=head1 LICENSE
98
99You may distribute this code under the same terms as Perl itself.
100
101=cut
102# vim:sts=2 sw=2: