Cleanup/extend blob/clob detection/checks
Rafael Kitover [Sun, 23 Jan 2011 12:03:13 +0000 (07:03 -0500)]
lib/DBIx/Class/Storage/DBI.pm
lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm
lib/DBIx/Class/Storage/DBI/Replicated.pm
lib/DBIx/Class/Storage/DBI/Sybase/ASE.pm

index d6ef837..fc66f3b 100644 (file)
@@ -2931,12 +2931,27 @@ sub _max_column_bytesize {
 }
 
 # Determine if a data_type is some type of BLOB
+# FIXME: these regexes are expensive, result of these checks should be cached in
+# the column_info .
 sub _is_lob_type {
   my ($self, $data_type) = @_;
-  $data_type && ($data_type =~ /(?:lob|bfile|text|image|bytea|memo)/i
-    || $data_type =~ /^long(?:\s*(?:raw|bit\s*varying|varbit|binary
+  $data_type && ($data_type =~ /lob|bfile|text|image|bytea|memo/i
+    || $data_type =~ /^long(?:\s+(?:raw|bit\s*varying|varbit|binary
                                   |varchar|character\s*varying|nvarchar
-                                  |national\s*character\s*varying))?$/xi);
+                                  |national\s*character\s*varying))?\z/xi);
+}
+
+sub _is_binary_lob_type {
+  my ($self, $data_type) = @_;
+  $data_type && ($data_type =~ /blob|bfile|image|bytea/i
+    || $data_type =~ /^long(?:\s+(?:raw|bit\s*varying|varbit|binary))?\z/xi);
+}
+
+sub _is_text_lob_type {
+  my ($self, $data_type) = @_;
+  $data_type && ($data_type =~ /^(?:clob|memo)\z/i
+    || $data_type =~ /^long(?:\s+(?:varchar|character\s*varying|nvarchar
+                        |national\s*character\s*varying))\z/xi);
 }
 
 1;
index 20dac87..79896d8 100644 (file)
@@ -410,15 +410,14 @@ sub source_bind_attributes
   my $self = shift;
   my($source) = @_;
 
-  my %bind_attributes;
+  my %bind_attributes = %{ $self->next::method(@_) };
 
   foreach my $column ($source->columns) {
-    my $data_type = $source->column_info($column)->{data_type}
-      or next;
+    my %column_bind_attrs = %{ $bind_attributes{$column} || {} };
 
-    my %column_bind_attrs = $self->bind_attribute_by_data_type($data_type);
+    my $data_type = $source->column_info($column)->{data_type};
 
-    if ($data_type =~ /^[BC]LOB$/i) {
+    if ($self->_is_lob_type($data_type)) {
       if ($DBD::Oracle::VERSION eq '1.23') {
         $self->throw_exception(
 "BLOB/CLOB support in DBD::Oracle == 1.23 is broken, use an earlier or later ".
@@ -426,7 +425,7 @@ sub source_bind_attributes
         );
       }
 
-      $column_bind_attrs{'ora_type'} = uc($data_type) eq 'CLOB'
+      $column_bind_attrs{'ora_type'} = $self->_is_text_lob_type($data_type)
         ? DBD::Oracle::ORA_CLOB()
         : DBD::Oracle::ORA_BLOB()
       ;
index 878ece9..c004c39 100644 (file)
@@ -386,6 +386,8 @@ my @unimplemented = qw(
 
   _max_column_bytesize
   _is_lob_type
+  _is_binary_lob_type
+  _is_text_lob_type
 );
 
 # the capability framework
index 2fae10f..52e90bf 100644 (file)
@@ -1169,7 +1169,7 @@ bulk_insert using prepare_cached (see comments.)
 
 =head1 AUTHOR
 
-See L<DBIx::Class/CONTRIBUTORS>.
+See L<DBIx::Class/AUTHOR> and L<DBIx::Class/CONTRIBUTORS>.
 
 =head1 LICENSE