Pg views and sqlite views, patch from wreis
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Producer / SQLite.pm
index dca2aea..3060875 100644 (file)
@@ -76,6 +76,13 @@ sub produce {
         push @table_defs, $create, map( { "$_;" } @defs), "";
     }
 
+    for my $view ( $schema->get_views ) {
+      push @table_defs, create_view($view, {
+        add_drop_view => $add_drop_table,
+        no_comments   => $no_comments,
+      });
+    }
+
 #    $create .= "COMMIT;\n";
 
     return wantarray ? ($create, @table_defs, "COMMIT;\n") : join("\n", ($create, @table_defs, "COMMIT;\n"));
@@ -117,6 +124,32 @@ sub mk_name {
     return $name;
 }
 
+sub create_view {
+    my ($view, $options) = @_;
+    my $add_drop_view = $options->{add_drop_view};
+
+    my $view_name = $view->name;
+    debug("PKG: Looking at view '${view_name}'\n");
+
+    # Header.  Should this look like what mysqldump produces?
+    my $extra = $view->extra;
+    my $create = '';
+    $create .= "--\n-- View: ${view_name}\n--\n" unless $options->{no_comments};
+    $create .= "DROP VIEW IF EXISTS $view_name;\n" if $add_drop_view;
+    $create .= 'CREATE';
+    $create .= " TEMPORARY" if exists($extra->{temporary}) && $extra->{temporary};
+    $create .= ' VIEW';
+    $create .= " IF NOT EXISTS" if exists($extra->{if_not_exists}) && $extra->{if_not_exists};
+    $create .= " ${view_name}";
+
+    if( my $sql = $view->sql ){
+      $create .= " AS\n    ${sql}";
+    }
+    $create .= ";\n\n";
+    return $create;
+}
+
+
 sub create_table
 {
     my ($table, $options) = @_;
@@ -337,15 +370,13 @@ sub alter_drop_constraint { alter_drop_index(@_) }
 sub alter_drop_index {
   my ($constraint) = @_;
 
-  return sprintf("DROP INDEX %s ON %s",
-      $constraint->name, $constraint->table->name);
+  return sprintf("DROP INDEX %s",
+      $constraint->name);
 }
 
 sub batch_alter_table {
   my ($table, $diffs) = @_;
 
-  $DB::single = 1 if $table->name eq 'deleted'; 
-
   # If we have any of the following
   #
   #  rename_field
@@ -364,32 +395,49 @@ sub batch_alter_table {
   # COMMIT;
   #
   # Fun, eh?
+  #
+  # If we have rename_field we do similarly.
+
+  my $table_name = $table->name;
+  my $renaming = $diffs->{rename_table} && @{$diffs->{rename_table}};
 
   if ( @{$diffs->{rename_field}} == 0 &&
        @{$diffs->{alter_field}}  == 0 &&
-       @{$diffs->{drop_field}}   == 0) {
+       @{$diffs->{drop_field}}   == 0
+       ) {
     return join("\n", map { 
         my $meth = __PACKAGE__->can($_) or die __PACKAGE__ . " cant $_";
         map { my $sql = $meth->(ref $_ eq 'ARRAY' ? @$_ : $_); $sql ?  ("$sql;") : () } @{ $diffs->{$_} }
         
-      } grep { @{$diffs->{$_}} } keys %$diffs);
+      } grep { @{$diffs->{$_}} } 
+    qw/rename_table
+       alter_drop_constraint
+       alter_drop_index
+       drop_field
+       add_field
+       alter_field
+       rename_field
+       alter_create_index
+       alter_create_constraint
+       alter_table/);
   }
 
 
   my @sql;
+  my $old_table = $renaming ? $diffs->{rename_table}[0][0] : $table;
   
   do {
-    local $table->{name} = $table->name . '_temp_alter';
+    local $table->{name} = $table_name . '_temp_alter';
     # We only want the table - dont care about indexes on tmp table
     my ($table_sql) = create_table($table, {no_comments => 1, temporary_table => 1});
     push @sql,$table_sql;
   };
 
-  push @sql, "INSERT INTO @{[$table]}_temp_alter SELECT @{[ join(', ', $table->get_fields)]} FROM @{[$table]}",
-             "DROP TABLE @{[$table]}",
+  push @sql, "INSERT INTO @{[$table_name]}_temp_alter SELECT @{[ join(', ', $old_table->get_fields)]} FROM @{[$old_table]}",
+             "DROP TABLE @{[$old_table]}",
              create_table($table, { no_comments => 1 }),
-             "INSERT INTO @{[$table]} SELECT @{[ join(', ', $table->get_fields)]} FROM @{[$table]}_temp_alter",
-             "DROP TABLE @{[$table]}_temp_alter";
+             "INSERT INTO @{[$table_name]} SELECT @{[ join(', ', $old_table->get_fields)]} FROM @{[$table_name]}_temp_alter",
+             "DROP TABLE @{[$table_name]}_temp_alter";
 
   return join(";\n", @sql, "");
 }
@@ -399,6 +447,18 @@ sub drop_table {
   return "DROP TABLE $table;";
 }
 
+sub rename_table {
+  my ($old_table, $new_table, $options) = @_;
+
+  my $qt = $options->{quote_table_names} || '';
+
+  return "ALTER TABLE $qt$old_table$qt RENAME TO $qt$new_table$qt";
+
+}
+
+# No-op. Just here to signify that we are a new style parser.
+sub preproces_schema { }
+
 1;
 
 =pod