fix is_nullable detection on MS Access
Rafael Kitover [Thu, 9 Jun 2011 13:44:50 +0000 (09:44 -0400)]
Changes
lib/DBIx/Class/Schema/Loader/DBI/ADO/MS_Jet.pm
lib/DBIx/Class/Schema/Loader/DBI/ODBC/ACCESS.pm
t/lib/dbixcsl_common_tests.pm

diff --git a/Changes b/Changes
index da4dc7a..baf4363 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,6 @@
 Revision history for Perl extension DBIx::Class::Schema::Loader
 
+        - fix is_nullable detection on MS Access
         - remove '$table has no primary key' warning
         - added uniq_to_primary option to promote unique keys to primary keys
           (RT#25944)
index 4ae3407..b802b78 100644 (file)
@@ -124,23 +124,7 @@ sub _columns_info_for {
     while (my ($col, $info) = each %$result) {
         my $data_type = $info->{data_type};
 
-        my $col_obj;
-
-        my $cols = $self->_adox_catalog->Tables->Item($table)->Columns;
-
-        for my $col_idx (0..$cols->Count-1) {
-            $col_obj = $cols->Item($col_idx);
-            if ($self->preserve_case) {
-                last if $col_obj->Name eq $col;
-            }
-            else {
-                last if lc($col_obj->Name) eq lc($col);
-            }
-        }
-
-        if ($col_obj->Attributes | 2 == 2) {
-            $info->{is_nullable} = 1;
-        }
+        my $col_obj = $self->_adox_column($table, $col);
 
         if ($data_type eq 'long') {
             $info->{data_type} = 'integer';
@@ -194,7 +178,6 @@ sub _columns_info_for {
                     $info->{data_type} = 'binary';
                     last;
                 }
-
             }
 
             $info->{size} = $col_obj->DefinedSize;
index 34ded3c..8040b2e 100644 (file)
@@ -158,6 +158,26 @@ sub _adox_catalog {
     return $cat;
 }
 
+sub _adox_column {
+    my ($self, $table, $col) = @_;
+
+    my $col_obj;
+
+    my $cols = $self->_adox_catalog->Tables->Item($table)->Columns;
+
+    for my $col_idx (0..$cols->Count-1) {
+        $col_obj = $cols->Item($col_idx);
+        if ($self->preserve_case) {
+            last if $col_obj->Name eq $col;
+        }
+        else {
+            last if lc($col_obj->Name) eq lc($col);
+        }
+    }
+
+    return $col_obj;
+}
+
 sub rescan {
     my $self = shift;
 
@@ -256,6 +276,10 @@ sub _columns_info_for {
     while (my ($col, $info) = each %$result) {
         my $data_type = $info->{data_type};
 
+        my $col_obj = $self->_adox_column($table, $col);
+
+        $info->{is_nullable} = ($col_obj->Attributes & 2) == 2 ? 1 : 0;
+
         if ($data_type eq 'counter') {
             $info->{data_type} = 'integer';
             $info->{is_auto_increment} = 1;
index affa207..306860a 100644 (file)
@@ -120,7 +120,7 @@ sub run_tests {
     $num_rescans++ if $self->{vendor} eq 'Firebird';
 
     plan tests => @connect_info *
-        (207 + $num_rescans * $col_accessor_map_tests + $extra_count + ($self->{data_type_tests}{test_count} || 0));
+        (209 + $num_rescans * $col_accessor_map_tests + $extra_count + ($self->{data_type_tests}{test_count} || 0));
 
     foreach my $info_idx (0..$#connect_info) {
         my $info = $connect_info[$info_idx];
@@ -588,6 +588,12 @@ sub test_schema {
     is( $class2->column_info('crumb_crisp_coating')->{accessor},  'trivet',
         'col_accessor_map is being run' );
 
+    is $class1->column_info('dat')->{is_nullable}, 0,
+        'is_nullable=0 detection';
+
+    is $class2->column_info('set_primary_key')->{is_nullable}, 1,
+        'is_nullable=1 detection';
+
     SKIP: {
         skip $self->{skip_rels}, 131 if $self->{skip_rels};