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