[Bast-commits] r7424 - in DBIx-Class/0.08/branches/sybase: .
lib/DBIx/Class/Storage/DBI
caelum at dev.catalyst.perl.org
caelum at dev.catalyst.perl.org
Sat Aug 29 07:31:41 GMT 2009
Author: caelum
Date: 2009-08-29 07:31:41 +0000 (Sat, 29 Aug 2009)
New Revision: 7424
Modified:
DBIx-Class/0.08/branches/sybase/Changes
DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/AutoCast.pm
DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase.pm
Log:
switch to ::DBI::AutoCast
Modified: DBIx-Class/0.08/branches/sybase/Changes
===================================================================
--- DBIx-Class/0.08/branches/sybase/Changes 2009-08-29 07:06:07 UTC (rev 7423)
+++ DBIx-Class/0.08/branches/sybase/Changes 2009-08-29 07:31:41 UTC (rev 7424)
@@ -4,11 +4,13 @@
- Support for TEXT/IMAGE columns
- Support for the 'money' datatype
- Transaction savepoints support
+ - DateTime inflation support
- Support for bind variables when connecting to a newer Sybase with
OpenClient libraries
- - Support for bind variables over FreeTDS with CASTs when needed
+ - Support for connections via FreeTDS with CASTs for bind variables
+ when needed
- Support for interpolated variables with proper quoting when
- connecting to an older Sybase or via FreeTDS
+ connecting to an older Sybase and/or via FreeTDS
- Fixed a complex prefetch + regular join regression introduced
in 0.08108
- SQLT related fixes:
Modified: DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/AutoCast.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/AutoCast.pm 2009-08-29 07:06:07 UTC (rev 7423)
+++ DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/AutoCast.pm 2009-08-29 07:31:41 UTC (rev 7424)
@@ -29,6 +29,10 @@
CAST(? as $mapped_type)
+This option can also be enabled in L<DBIx::Class::Storage::DBI/connect_info> as:
+
+ on_connect_call => ['set_auto_cast']
+
=cut
sub _prep_for_execute {
@@ -60,9 +64,29 @@
return ($sql, $bind);
}
+=head2 connect_call_set_auto_cast
-=head1 AUTHORS
+Executes:
+ $schema->storage->auto_cast(1);
+
+on connection.
+
+Used as:
+
+ on_connect_call => ['set_auto_cast']
+
+in L<DBIx::Class::Storage::DBI/connect_info>.
+
+=cut
+
+sub connect_call_set_auto_cast {
+ my $self = shift;
+ $self->auto_cast(1);
+}
+
+=head1 AUTHOR
+
See L<DBIx::Class/CONTRIBUTORS>
=head1 LICENSE
Modified: DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase.pm
===================================================================
--- DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase.pm 2009-08-29 07:06:07 UTC (rev 7423)
+++ DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase.pm 2009-08-29 07:31:41 UTC (rev 7424)
@@ -5,13 +5,14 @@
use base qw/
DBIx::Class::Storage::DBI::Sybase::Common
+ DBIx::Class::Storage::DBI::AutoCast
/;
use mro 'c3';
use Carp::Clan qw/^DBIx::Class/;
use List::Util ();
__PACKAGE__->mk_group_accessors('simple' =>
- qw/_identity _blob_log_on_update auto_cast insert_txn/
+ qw/_identity _blob_log_on_update insert_txn/
);
=head1 NAME
@@ -161,33 +162,6 @@
if exists $args{log_on_update};
}
-=head2 connect_call_set_auto_cast
-
-In some configurations (usually with L</FreeTDS>) statements with values bound
-to columns or conditions that are not strings will throw implicit type
-conversion errors. For L</FreeTDS> this is automatically detected, and this
-option is set.
-
-It converts placeholders to:
-
- CAST(? as $type)
-
-the type is taken from the L<DBIx::Class::ResultSource/data_type> setting from
-your Result class, and mapped to a Sybase type using a mapping based on
-L<SQL::Translator> if necessary.
-
-This setting can also be set outside of
-L<DBIx::Class::Storage::DBI/connect_info> at any time using:
-
- $schema->storage->auto_cast(1);
-
-=cut
-
-sub connect_call_set_auto_cast {
- my $self = shift;
- $self->auto_cast(1);
-}
-
=head2 connect_call_unsafe_insert
With placeholders enabled, inserts are done in a transaction so that there are
@@ -220,37 +194,13 @@
$type && $type =~ /(?:text|image|lob|bytea|binary|memo)/i;
}
-# The select-piggybacking-on-insert trick stolen from odbc/mssql
+# The select-piggybacking-on-insert trick stolen from mssql
sub _prep_for_execute {
my $self = shift;
my ($op, $extra_bind, $ident, $args) = @_;
my ($sql, $bind) = $self->next::method (@_);
-# Some combinations of FreeTDS and Sybase throw implicit conversion errors for
-# all placeeholders, so we convert them into CASTs here.
-# Based on code in ::DBI::NoBindVars .
-#
-# If we're using ::NoBindVars, there are no binds by this point so this code
-# gets skippeed.
- if ($self->auto_cast && @$bind) {
- my $new_sql;
- my @sql_part = split /\?/, $sql;
- my $col_info = $self->_resolve_column_info($ident,[ map $_->[0], @$bind ]);
-
- foreach my $bound (@$bind) {
- my $col = $bound->[0];
- my $syb_type = $self->_syb_base_type($col_info->{$col}{data_type});
-
- foreach my $data (@{$bound}[1..$#$bound]) {
- $new_sql .= shift(@sql_part) .
- ($syb_type ? "CAST(? AS $syb_type)" : '?');
- }
- }
- $new_sql .= join '', @sql_part;
- $sql = $new_sql;
- }
-
if ($op eq 'insert') {
my $table = $ident->from;
@@ -301,7 +251,7 @@
long => 'varchar',
);
-sub _syb_base_type {
+sub _native_data_type {
my ($self, $type) = @_;
$type = lc $type;
@@ -602,7 +552,7 @@
It is available via subversion from:
- http://dev.catalyst.perl.org/repos/bast/branches/DBIx-Class-Schema-Loader/current
+ http://dev.catalyst.perl.org/repos/bast/branches/DBIx-Class-Schema-Loader/current/
=head1 FreeTDS
@@ -625,11 +575,14 @@
case the storage will be reblessed to
L<DBIx::Class::Storage::DBI::Sybase::NoBindVars>.
-In some configurations, placeholders will work but will throw implicit
+In some configurations, placeholders will work but will throw implicit type
conversion errors for anything that's not expecting a string. In such a case,
-the C<auto_cast> option is automatically set, which you may enable yourself with
-L</connect_call_set_auto_cast> (see the description of that method for more
-details.)
+the C<auto_cast> option from L<DBIx::Class::Storage::DBI::AutoCast> is
+automatically set, which you may enable on connection with
+L<DBIx::Class::Storage::DBI::AutoCast/connect_call_set_auto_cast>. The type info
+for the C<CAST>s is taken from the L<DBIx::Class::ResultSource/data_type>
+definitions in your Result classes, and are mapped to a Sybase type (if it isn't
+already) using a mapping based on L<SQL::Translator>.
In other configurations, placeholers will work just as they do with the Sybase
Open Client libraries.
More information about the Bast-commits
mailing list