more types for ADO fix, and documentation
Rafael Kitover [Thu, 17 Dec 2009 17:09:55 +0000 (17:09 +0000)]
lib/DBIx/Class/Storage/DBI/ADO/Microsoft_SQL_Server.pm

index 3014c34..e291656 100644 (file)
@@ -30,6 +30,8 @@ sub source_bind_attributes {
 sub bind_attribute_by_data_type {
   my ($self, $data_type) = @_;
 
+  ($data_type = lc($data_type)) =~ s/\s+.*//;
+
   my $max_size =
     $self->_mssql_max_data_type_representation_size_in_bytes->{$data_type};
 
@@ -47,6 +49,7 @@ sub _mssql_max_data_type_representation_size_in_bytes {
   my $blob_max = $self->_get_dbh->{LongReadLen} || 32768;
 
   return +{
+# MSSQL types
     char => 8000,
     varchar => 8000,
     binary => 8000,
@@ -60,6 +63,7 @@ sub _mssql_max_data_type_representation_size_in_bytes {
     bigint => 100,
     bit => 100,
     decimal => 100,
+    integer => 100,
     int => 100,
     money => 100,
     float => 100,
@@ -75,6 +79,18 @@ sub _mssql_max_data_type_representation_size_in_bytes {
     smalldatetime => 100,
     time => 100,
     timestamp => 100,
+    cursor => 100,
+    hierarchyid => 100,
+    sql_variant => 100,
+    table => 100,
+    xml => $blob_max, # ???
+
+# some non-MSSQL types
+    serial => 100,
+    bigserial => 100,
+    varchar2 => 8000,
+    blob => $blob_max,
+    clob => $blob_max,
   }
 }
 
@@ -94,10 +110,29 @@ This subclass supports MSSQL server connections via L<DBD::ADO>.
 The MSSQL specific functionality is provided by
 L<DBIx::Class::Storage::DBI::MSSQL>.
 
+=head2 CAVEATS
+
+=head3 identities
+
 C<_identity_method> is set to C<@@identity>, as C<SCOPE_IDENTITY()> doesn't work
 with L<DBD::ADO>. See L<DBIx::Class::Storage::DBI::MSSQL/IMPLEMENTATION NOTES>
 for caveats regarding this.
 
+=head3 truncation bug
+
+There is a bug with MSSQL ADO providers where data gets truncated based on the
+size on the bind sizes in the first prepare:
+
+L<https://rt.cpan.org/Ticket/Display.html?id=52048>
+
+The C<ado_size> workaround is used (see L<DBD::ADO/"ADO Providers">) with the
+approximate maximum size of the data_type of the bound column, or 8000 (maximum
+VARCHAR size) if the data_type is not available.
+
+This code is incomplete and may be buggy. Particularly, C<VARCHAR(MAX)> is not
+supported yet. The data_type list for other DBs is also incomplete. Please
+report problems (and send patches.)
+
 =head1 AUTHOR
 
 See L<DBIx::Class/CONTRIBUTORS>.