Merge 'trunk' into 'sybase'
[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
6b1f5ef7 11sub _dbh_last_insert_id {
12 my ($self, $dbh, $source, $col) = @_;
13
14 # @@identity works only if not using placeholders
15 # Should this query be cached?
16 return ($dbh->selectrow_array('select @@identity'))[0];
17}
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
34sub should_quote_data_type {
35 my $self = shift;
36 my ($type, $value) = @_;
37
38 return $self->next::method(@_) if not defined $value;
39
0c449973 40 if (my $key = List::Util::first { $type =~ /$_/i } keys %noquote) {
41 return 0 if $noquote{$key}->($value);
0c1bedfc 42 }
43
44 return $self->next::method(@_);
45}
46
5608593e 471;
7e8cecc1 48
49=head1 NAME
50
51DBIx::Class::Storage::DBI::Sybase::NoBindVars - Storage::DBI subclass for Sybase
52without placeholder support
53
54=head1 DESCRIPTION
55
56If you're using this driver than your version of Sybase does not support
57placeholders. You can check with:
58
59 $dbh->{syb_dynamic_supported}
60
61You can also enable this driver explicitly using:
62
63 my $schema = SchemaClass->clone;
64 $schema->storage_type('::DBI::Sybase::NoBindVars');
65 $schema->connect($dsn, $user, $pass, \%opts);
66
67See the discussion in L<< DBD::Sybase/Using ? Placeholders & bind parameters to
68$sth->execute >> for details on the pros and cons of using placeholders.
69
70One advantage of not using placeholders is that C<select @@identity> will work
71for obtainging the last insert id of an C<IDENTITY> column, instead of having to
72do C<select max(col)> as the base Sybase driver does.
73
74When using this driver, bind variables will be interpolated (properly quoted of
75course) into the SQL query itself, without using placeholders.
76
77The caching of prepared statements is also explicitly disabled, as the
78interpolation renders it useless.
79
80=head1 AUTHORS
81
82See L<DBIx::Class/CONTRIBUTORS>.
83
84=head1 LICENSE
85
86You may distribute this code under the same terms as Perl itself.
87
88=cut
89# vim:sts=2 sw=2: