Remove use of _resolve_column_info call from _prep_for_execute in NoBindVars
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / NoBindVars.pm
CommitLineData
3885cff6 1package DBIx::Class::Storage::DBI::NoBindVars;
2
3use strict;
4use warnings;
5
6use base 'DBIx::Class::Storage::DBI';
2ad62d97 7use mro 'c3';
3885cff6 8
b43345f2 9=head1 NAME
10
11DBIx::Class::Storage::DBI::NoBindVars - Sometime DBDs have poor to no support for bind variables
12
13=head1 DESCRIPTION
14
15This class allows queries to work when the DBD or underlying library does not
16support the usual C<?> placeholders, or at least doesn't support them very
17well, as is the case with L<DBD::Sybase>
18
19=head1 METHODS
20
b33697ef 21=head2 connect_info
b43345f2 22
b33697ef 23We can't cache very effectively without bind variables, so force the C<disable_sth_caching> setting to be turned on when the connect info is set.
b43345f2 24
25=cut
26
b33697ef 27sub connect_info {
28 my $self = shift;
d944c5ae 29 my $retval = $self->next::method(@_);
b33697ef 30 $self->disable_sth_caching(1);
31 $retval;
b43345f2 32}
33
d5130dd2 34=head2 _prep_for_execute
b43345f2 35
d5130dd2 36Manually subs in the values for the usual C<?> placeholders.
b43345f2 37
38=cut
39
d5130dd2 40sub _prep_for_execute {
41 my $self = shift;
b50a5275 42
d944c5ae 43 my ($sql, $bind) = $self->next::method(@_);
44
7c63f828 45 # stringify bind args, quote via $dbh, and manually insert
0e773352 46 #my ($op, $ident, $args) = @_;
47 my $ident = $_[1];
d944c5ae 48
b4474f31 49 my @sql_part = split /\?/, $sql;
50 my $new_sql;
51
0e773352 52 for (@$bind) {
abe9977d 53 my $data = (ref $_->[1]) ? "$_->[1]" : $_->[1]; # always stringify, array types are currently not supported
b55e97a7 54
abe9977d 55 my $datatype = $_->[0]{sqlt_datatype};
b55e97a7 56
0e773352 57 $data = $self->_prep_interpolated_value($datatype, $data)
58 if $datatype;
6636ad53 59
0e773352 60 $data = $self->_get_dbh->quote($data)
abe9977d 61 unless ($datatype and $self->interpolate_unquoted($datatype, $data) );
e06ad5d5 62
0e773352 63 $new_sql .= shift(@sql_part) . $data;
d944c5ae 64 }
0e773352 65
b4474f31 66 $new_sql .= join '', @sql_part;
d5130dd2 67
01c04b1b 68 return ($new_sql, []);
3885cff6 69}
70
80007f97 71=head2 interpolate_unquoted
e06ad5d5 72
148e3b50 73This method is called by L</_prep_for_execute> for every column in
74order to determine if its value should be quoted or not. The arguments
75are the current column data type and the actual bind value. The return
80007f97 76value is interpreted as: true - do not quote, false - do quote. You should
148e3b50 77override this in you Storage::DBI::<database> subclass, if your RDBMS
78does not like quotes around certain datatypes (e.g. Sybase and integer
80007f97 79columns). The default method always returns false (do quote).
e06ad5d5 80
0ac07712 81 WARNING!!!
e06ad5d5 82
148e3b50 83 Always validate that the bind-value is valid for the current datatype.
84 Otherwise you may very well open the door to SQL injection attacks.
e06ad5d5 85
0ac07712 86=cut
e06ad5d5 87
80007f97 88sub interpolate_unquoted {
0ac07712 89 #my ($self, $datatype, $value) = @_;
80007f97 90 return 0;
0ac07712 91}
148e3b50 92
166c6561 93=head2 _prep_interpolated_value
e06ad5d5 94
95Given a datatype and the value to be inserted directly into a SQL query, returns
0ac07712 96the necessary string to represent that value (by e.g. adding a '$' sign)
e06ad5d5 97
98=cut
99
166c6561 100sub _prep_interpolated_value {
0ac07712 101 #my ($self, $datatype, $value) = @_;
102 return $_[2];
103}
e06ad5d5 104
3885cff6 105=head1 AUTHORS
106
0ac07712 107See L<DBIx::Class/CONTRIBUTORS>
3885cff6 108
109=head1 LICENSE
110
111You may distribute this code under the same terms as Perl itself.
112
113=cut
b43345f2 114
1151;