Commit | Line | Data |
6b1f5ef7 |
1 | package DBIx::Class::Storage::DBI::Sybase::NoBindVars; |
5608593e |
2 | |
b7505130 |
3 | use Class::C3; |
5608593e |
4 | use base qw/ |
5 | DBIx::Class::Storage::DBI::NoBindVars |
6 | DBIx::Class::Storage::DBI::Sybase |
7 | /; |
b55e97a7 |
8 | use List::Util (); |
0c449973 |
9 | use Scalar::Util (); |
5608593e |
10 | |
6b1f5ef7 |
11 | sub _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 |
19 | my $number = sub { Scalar::Util::looks_like_number($_[0]) }; |
20 | |
b55e97a7 |
21 | my %noquote = ( |
0c449973 |
22 | int => sub { $_[0] =~ /^ -? \d+ \z/x }, |
23 | bit => => sub { $_[0] =~ /^[01]\z/ }, |
24 | money => sub { $_[0] =~ /^\$ \d+ (\.\d*)? \z/x }, |
25 | float => $number, |
26 | real => $number, |
27 | double => $number, |
28 | decimal => $number, |
29 | numeric => $number, |
b55e97a7 |
30 | ); |
0c1bedfc |
31 | |
32 | sub should_quote_data_type { |
33 | my $self = shift; |
34 | my ($type, $value) = @_; |
35 | |
36 | return $self->next::method(@_) if not defined $value; |
37 | |
0c449973 |
38 | if (my $key = List::Util::first { $type =~ /$_/i } keys %noquote) { |
39 | return 0 if $noquote{$key}->($value); |
0c1bedfc |
40 | } |
41 | |
42 | return $self->next::method(@_); |
43 | } |
44 | |
5608593e |
45 | 1; |
7e8cecc1 |
46 | |
47 | =head1 NAME |
48 | |
49 | DBIx::Class::Storage::DBI::Sybase::NoBindVars - Storage::DBI subclass for Sybase |
50 | without placeholder support |
51 | |
52 | =head1 DESCRIPTION |
53 | |
54 | If you're using this driver than your version of Sybase does not support |
55 | placeholders. You can check with: |
56 | |
57 | $dbh->{syb_dynamic_supported} |
58 | |
59 | You can also enable this driver explicitly using: |
60 | |
61 | my $schema = SchemaClass->clone; |
62 | $schema->storage_type('::DBI::Sybase::NoBindVars'); |
63 | $schema->connect($dsn, $user, $pass, \%opts); |
64 | |
65 | See the discussion in L<< DBD::Sybase/Using ? Placeholders & bind parameters to |
66 | $sth->execute >> for details on the pros and cons of using placeholders. |
67 | |
68 | One advantage of not using placeholders is that C<select @@identity> will work |
69 | for obtainging the last insert id of an C<IDENTITY> column, instead of having to |
70 | do C<select max(col)> as the base Sybase driver does. |
71 | |
72 | When using this driver, bind variables will be interpolated (properly quoted of |
73 | course) into the SQL query itself, without using placeholders. |
74 | |
75 | The caching of prepared statements is also explicitly disabled, as the |
76 | interpolation renders it useless. |
77 | |
78 | =head1 AUTHORS |
79 | |
80 | See L<DBIx::Class/CONTRIBUTORS>. |
81 | |
82 | =head1 LICENSE |
83 | |
84 | You may distribute this code under the same terms as Perl itself. |
85 | |
86 | =cut |
87 | # vim:sts=2 sw=2: |