All of caelum's work so far (not reviewed)
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Sybase / NoBindVars.pm
CommitLineData
6b1f5ef7 1package DBIx::Class::Storage::DBI::Sybase::NoBindVars;
5608593e 2
3use base qw/
4 DBIx::Class::Storage::DBI::NoBindVars
5 DBIx::Class::Storage::DBI::Sybase
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
2baff5da 62# for tests
63sub _can_insert_bulk { 0 }
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
e97a6ee2 74If you're using this driver than your version of Sybase, or the libraries you
75use to connect to it, do not support placeholders.
22b3249c 76
7e8cecc1 77You can also enable this driver explicitly using:
78
79 my $schema = SchemaClass->clone;
80 $schema->storage_type('::DBI::Sybase::NoBindVars');
81 $schema->connect($dsn, $user, $pass, \%opts);
82
83See the discussion in L<< DBD::Sybase/Using ? Placeholders & bind parameters to
84$sth->execute >> for details on the pros and cons of using placeholders.
85
86One advantage of not using placeholders is that C<select @@identity> will work
87for obtainging the last insert id of an C<IDENTITY> column, instead of having to
e97a6ee2 88do C<select max(col)> in a transaction as the base Sybase driver does.
7e8cecc1 89
90When using this driver, bind variables will be interpolated (properly quoted of
91course) into the SQL query itself, without using placeholders.
92
93The caching of prepared statements is also explicitly disabled, as the
94interpolation renders it useless.
95
96=head1 AUTHORS
97
98See L<DBIx::Class/CONTRIBUTORS>.
99
100=head1 LICENSE
101
102You may distribute this code under the same terms as Perl itself.
103
104=cut
105# vim:sts=2 sw=2: