rewrite "CURRENT_TIMESTAMP" to "current_timestamp" for SQLite
[dbsrgits/DBIx-Class-Schema-Loader.git] / lib / DBIx / Class / Schema / Loader / DBI / InterBase.pm
index 3fdf44c..3dd27ca 100644 (file)
@@ -8,11 +8,7 @@ use base qw/DBIx::Class::Schema::Loader::DBI/;
 use Carp::Clan qw/^DBIx::Class/;
 use List::Util 'first';
 
-__PACKAGE__->mk_group_ro_accessors('simple', qw/
-    unquoted_ddl
-/);
-
-our $VERSION = '0.06000';
+our $VERSION = '0.07000';
 
 =head1 NAME
 
@@ -21,54 +17,55 @@ Firebird Implementation.
 
 =head1 DESCRIPTION
 
-See L<DBIx::Class::Schema::Loader::Base> for available options.
+See L<DBIx::Class::Schema::Loader> and L<DBIx::Class::Schema::Loader::Base>.
+
+=head1 COLUMN NAME CASE ISSUES
 
 By default column names from unquoted DDL will be generated in uppercase, as
 that is the only way they will work with quoting on.
 
-See the L</unquoted_ddl> option in this driver if you would like to have
-lowercase column names.
-
-=head1 DRIVER OPTIONS
+See the L<preserve_case|DBIx::Class::Schema::Loader::Base/preserve_case> option
+to false if you would like to have lowercase column names.
 
-=head2 unquoted_ddl
-
-Set this loader option if your DDL uses unquoted identifiers and you will not
-use quoting (the L<quote_char|DBIx::Class::Storage::DBI/quote_char> option in
+Setting this option is a good idea if your DDL uses unquoted identifiers and
+you will not use quoting (the
+L<quote_char|DBIx::Class::Storage::DBI/quote_char> option in
 L<connect_info|DBIx::Class::Storage::DBI/connect_info>.)
 
+Be careful to also not use any SQL reserved words in your DDL.
+
 This will generate lowercase column names (as opposed to the actual uppercase
 names) in your Result classes that will only work with quoting off.
 
 Mixed-case table and column names will be ignored when this option is on and
 will not work with quoting turned off.
 
-=cut
-
-sub _is_case_sensitive {
-    my $self = shift;
+B<NOTE:> This option used to be called C<unquoted_ddl> but has been removed in
+favor of the more generic option.
 
-    return $self->unquoted_ddl ? 0 : 1;
-}
+=cut
 
 sub _setup {
     my $self = shift;
 
-    $self->next::method;
+    $self->next::method(@_);
 
     $self->schema->storage->sql_maker->name_sep('.');
 
-    if (not defined $self->unquoted_ddl) {
+    if (not defined $self->preserve_case) {
         warn <<'EOF';
 
-WARNING: Assuming mixed-case Firebird DDL, see the unquoted_ddl option in
+WARNING: Assuming mixed-case Firebird DDL, see
 perldoc DBIx::Class::Schema::Loader::DBI::InterBase
+and the 'preserve_case' option in
+perldoc DBIx::Class::Schema::Loader::Base
 for more information.
 
 EOF
+        $self->preserve_case(1);
     }
 
-    if (not $self->unquoted_ddl) {
+    if ($self->preserve_case) {
         $self->schema->storage->sql_maker->quote_char('"');
     }
     else {
@@ -76,18 +73,6 @@ EOF
     }
 }
 
-sub _lc {
-    my ($self, $name) = @_;
-
-    return $self->unquoted_ddl ? lc($name) : $name;
-}
-
-sub _uc {
-    my ($self, $name) = @_;
-
-    return $self->unquoted_ddl ? uc($name) : $name;
-}
-
 sub _table_pk_info {
     my ($self, $table) = @_;
 
@@ -213,8 +198,8 @@ EOF
 SELECT f.rdb$field_precision, f.rdb$field_scale, f.rdb$field_type, f.rdb$field_sub_type, t.rdb$type_name, st.rdb$type_name
 FROM rdb$fields f
 JOIN rdb$relation_fields rf ON rf.rdb$field_source = f.rdb$field_name
-JOIN rdb$types t  ON f.rdb$field_type     = t.rdb$type  AND t.rdb$field_name  = 'RDB$FIELD_TYPE'
-JOIN rdb$types st ON f.rdb$field_sub_type = st.rdb$type AND st.rdb$field_name = 'RDB$FIELD_SUB_TYPE'
+LEFT JOIN rdb$types t  ON f.rdb$field_type     = t.rdb$type  AND t.rdb$field_name  = 'RDB$FIELD_TYPE'
+LEFT JOIN rdb$types st ON f.rdb$field_sub_type = st.rdb$type AND st.rdb$field_name = 'RDB$FIELD_SUB_TYPE'
 WHERE rf.rdb$relation_name = ?
     AND rf.rdb$field_name  = ?
 EOF
@@ -226,11 +211,11 @@ EOF
             s/\s+\z// for $type_name, $sub_type_name;
 
             # fixups primarily for DBD::InterBase
-            if ($info->{data_type} =~ /^integer|int|smallint|bigint|-9581\z/) {
-                if ($precision && $type_name =~ /^LONG|INT64\z/ && $sub_type_name eq 'BLR') {
+            if ($info->{data_type} =~ /^(?:integer|int|smallint|bigint|-9581)\z/) {
+                if ($precision && $type_name =~ /^(?:LONG|INT64)\z/ && $sub_type_name eq 'BLR') {
                     $info->{data_type} = 'decimal';
                 }
-                elsif ($precision && $type_name =~ /^LONG|SHORT|INT64\z/ && $sub_type_name eq 'TEXT') {
+                elsif ($precision && $type_name =~ /^(?:LONG|SHORT|INT64)\z/ && $sub_type_name eq 'TEXT') {
                     $info->{data_type} = 'numeric';
                 }
                 elsif ((not $precision) && $type_name eq 'INT64' && $sub_type_name eq 'BINARY') {
@@ -248,7 +233,7 @@ EOF
             }
         }
 
-        if ($info->{data_type} =~ /^decimal|numeric\z/ && defined $precision && defined $scale) {
+        if ($info->{data_type} =~ /^(?:decimal|numeric)\z/ && defined $precision && defined $scale) {
             if ($precision == 9 && $scale == 0) {
                 delete $info->{size};
             }
@@ -281,10 +266,10 @@ EOF
         }
 
         # DBD::InterBase sets scale to '0' for some reason for char types
-        if ($info->{data_type} =~ /^char|varchar\z/ && ref($info->{size}) eq 'ARRAY') {
+        if ($info->{data_type} =~ /^(?:char|varchar)\z/ && ref($info->{size}) eq 'ARRAY') {
             $info->{size} = $info->{size}[0];
         }
-        elsif ($info->{data_type} !~ /^char|varchar|numeric|decimal\z/) {
+        elsif ($info->{data_type} !~ /^(?:char|varchar|numeric|decimal)\z/) {
             delete $info->{size};
         }
 
@@ -308,6 +293,9 @@ EOF
                 $info->{default_value} = $def =~ /^\d/ ? $def : \$def;
             }
         }
+
+        ${ $info->{default_value} } = 'current_timestamp'
+            if ref $info->{default_value} && ${ $info->{default_value} } eq 'CURRENT_TIMESTAMP';
     }
 
     return $result;