add (and use) _default_value method, relatively similar to old _apply_default_value
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Producer.pm
index 4cc3084..7363ee9 100644 (file)
@@ -1,66 +1,81 @@
-package SQL::Translator::Producer;
-use namespace::autoclean;
-use Moose;
-use MooseX::Types::Moose qw(Bool Str);
-use SQL::Translator::Types qw(Schema);
+use MooseX::Declare;
+class SQL::Translator::Producer {
+    use SQL::Translator::Constants qw(:sqlt_types);
+    use MooseX::Types::Moose qw(ArrayRef Bool HashRef ScalarRef Str);
+    use SQL::Translator::Types qw(Column Table Translator);
+    
+    has 'data_type_mapping' => (
+        isa => HashRef,
+        is => 'ro',
+        lazy_build => 1
+    );
 
-has 'schema' => (
-    isa => Schema,
-    is => 'rw',
-    required => 1
-);
+    has 'translator' => (
+        isa => Translator,
+        is => 'ro',
+        weak_ref => 1,
+        required => 1,
+        handles => [ qw(schema) ],
+    );
 
-has 'no_comments' => (
-    isa => Bool,
-    is => 'rw',
-    lazy => 1, 
-    default => 0
-);
+    method _build_data_type_mapping {
+        return { 
+            SQL_LONGVARCHAR() => 'text',
+            SQL_TIMESTAMP()   => 'timestamp',
+            SQL_TYPE_TIMESTAMP() => 'timestamp without time zone',
+            SQL_TYPE_TIMESTAMP_WITH_TIMEZONE() => 'timestamp',
+            SQL_INTEGER()     => 'integer',
+            SQL_CHAR()        => 'char',
+            SQL_VARCHAR()     => 'varchar',
+            SQL_BIGINT()      => 'bigint',
+            SQL_FLOAT()       => 'numeric',
+        };
+    }
 
-has 'drop_table' => (
-    isa => Bool,
-    is => 'rw',
-    lazy => 1,
-    default => 1
-);
+    method produce {
+        my $schema = $self->schema;
 
-sub produce {
-    my $self = shift;
-    my $schema = $self->schema;
+        $self->_create_table($_) for values %{$schema->tables};
+    }
+    
+    method _create_table(Table $table) {
+        my $no_comments    = 0;
+        my $add_drop_table = 1;
+        my $sqlite_version = 0;
+    
+        my $create_table;
+        my (@column_defs, @index_defs, @constraint_defs);
+    
+        $create_table .= 'DROP TABLE '   . $table->name . ";\n" if $add_drop_table;
+        $create_table .= 'CREATE TABLE ' . $table->name . " (\n";
+    
+        push @column_defs, $self->_create_column($_) for values %{$table->columns};
+        $create_table .= join(",\n", map { '  ' . $_ } @column_defs ) . "\n)";
+        print $create_table . "\n";
+    }
+    
+    method _create_column(Column $column) {
+        my $column_def;
+        $column_def  = $column->name . ' ' . $column->data_type;
+        $column_def .= '(' . $column->size . ')' if $column->size;
+        $column_def .= ' NOT NULL' unless $column->is_nullable;
+        $column_def;
+    }
 
-    $self->_create_table($_) for values %{$schema->tables};
-}
-
-sub _create_table {
-    my $self = shift;
-    my $table = shift;
-
-    my $no_comments    = 0;
-    my $add_drop_table = 1;
-    my $sqlite_version = 0;
-
-    my $create_table;
-    my (@column_defs, @index_defs, @constraint_defs);
-
-    $create_table .= 'DROP TABLE '   . $table->name . ";\n" if $add_drop_table;
-    $create_table .= 'CREATE TABLE ' . $table->name . " (\n";
+    method _default_value(ScalarRef|Str $default, ArrayRef $exceptions) {
+      if ($exceptions and ! ref $default) {
+        for (my $i = 0; $i < @$exceptions; $i += 2) {
+          my ($pat, $val) = @$exceptions[ $i, $i + 1 ];
+          if (ref $pat and $default =~ $pat) {
+          $default = $val;
+          last;
+          } elsif (lc $default eq lc $pat) {
+              $default = $val;
+              last
+          }
+        }
+      }
 
-    push @column_defs, $self->_create_column($_) for values %{$table->columns};
-    $create_table .= join(",\n", map { '  ' . $_ } @column_defs ) . "\n)";
-    print $create_table . "\n";
+      return ref($default) ? " DEFAULT $$default" : " DEFAULT '$default'";
+    }
 }
-
-sub _create_column {
-    my $self = shift;
-    my $column = shift;
-
-    my $column_def;
-    $column_def  = $column->name . ' ' . $column->data_type;
-    $column_def .= '(' . $column->size . ')' if $column->size;
-    $column_def .= ' NOT NULL' unless $column->is_nullable;
-    $column_def;
-}
-
-__PACKAGE__->meta->make_immutable;
-
-1;