package SQL::Translator::Producer::SQLServer;
-=head1 NAME
-
-SQL::Translator::Producer::SQLServer - MS SQLServer producer for SQL::Translator
-
-=head1 SYNOPSIS
-
- use SQL::Translator;
-
- my $t = SQL::Translator->new( parser => '...', producer => 'SQLServer' );
- $t->translate;
-
-=head1 DESCRIPTION
-
-B<WARNING>B This is still fairly early code, basically a hacked version of the
-Sybase Producer (thanks Sam, Paul and Ken for doing the real work ;-)
-
-=head1 Extra Attributes
-
-=over 4
-
-=item field.list
-
-List of values for an enum field.
-
-=back
-
-=head1 TODO
-
- * !! Write some tests !!
- * Reserved words list needs updating to SQLServer.
- * Triggers, Procedures and Views DO NOT WORK
-
-=cut
-
use strict;
use warnings;
our ( $DEBUG, $WARN );
use Data::Dumper;
use SQL::Translator::Schema::Constants;
use SQL::Translator::Utils qw(debug header_comment);
-use SQL::Translator::Generator::Utils;
use SQL::Translator::Generator::DDL::SQLServer;
-my $util = SQL::Translator::Generator::Utils->new( quote_chars => ['[', ']'] );
my $future = SQL::Translator::Generator::DDL::SQLServer->new();
-my %translate = (
- date => 'datetime',
- 'time' => 'datetime',
- # Sybase types
- #integer => 'numeric',
- #int => 'numeric',
- #number => 'numeric',
- #money => 'money',
- #varchar => 'varchar',
- #varchar2 => 'varchar',
- #timestamp => 'datetime',
- #text => 'varchar',
- #real => 'double precision',
- #comment => 'text',
- #bit => 'bit',
- #tinyint => 'smallint',
- #float => 'double precision',
- #serial => 'numeric',
- #boolean => 'varchar',
- #char => 'char',
- #long => 'varchar',
-);
-
-# If these datatypes have size appended the sql fails.
-my @no_size = qw/tinyint smallint int integer bigint text bit image datetime/;
-
-my $max_id_length = 128;
-my %global_names;
-
-=pod
-
-=head1 SQLServer Create Table Syntax
-
-TODO
-
-=cut
-
sub produce {
my $translator = shift;
- $DEBUG = $translator->debug;
- $WARN = $translator->show_warnings;
my $no_comments = $translator->no_comments;
my $add_drop_table = $translator->add_drop_table;
my $schema = $translator->schema;
- %global_names = (); #reset
-
my $output;
$output .= header_comment."\n" unless ($no_comments);
$output .= "\n";
$output .= "--\n-- Drop tables\n--\n\n" unless $no_comments;
foreach my $table (@tables) {
- my $name = $table->name;
- my $q_name = unreserve($name);
- $output .= "IF EXISTS (SELECT name FROM sysobjects WHERE name = '$name' AND type = 'U') DROP TABLE $q_name;\n"
+ $output .= $future->drop_table($table);
}
}
return $output;
}
+sub unreserve { $future->quote($_[0]) }
+
+1;
+
=pod
+=head1 SQLServer Create Table Syntax
+
+TODO
+
+
+=head1 NAME
+
+SQL::Translator::Producer::SQLServer - MS SQLServer producer for SQL::Translator
+
+=head1 SYNOPSIS
+
+ use SQL::Translator;
+
+ my $t = SQL::Translator->new( parser => '...', producer => 'SQLServer' );
+ $t->translate;
+
+=head1 DESCRIPTION
+
+B<WARNING>B This is still fairly early code, basically a hacked version of the
+Sybase Producer (thanks Sam, Paul and Ken for doing the real work ;-)
+
+=head1 Extra Attributes
+
+=over 4
+
+=item field.list
+
+List of values for an enum field.
+
+=back
+
+=head1 TODO
+
+ * !! Write some tests !!
+ * Reserved words list needs updating to SQLServer.
+ * Triggers, Procedures and Views DO NOT WORK
+
+
# Text of view is already a 'create view' statement so no need to
# be fancy
foreach ( $schema->get_views ) {
$text =~ s/\r//g;
$output .= "$text\nGO\n";
}
-=cut
-
-sub mk_name {
- my ($name, $scope, $critical) = @_;
-
- $scope ||= \%global_names;
- if ( my $prev = $scope->{ $name } ) {
- my $name_orig = $name;
- $name .= sprintf( "%02d", ++$prev );
- substr($name, $max_id_length - 3) = "00"
- if length( $name ) > $max_id_length;
-
- warn "The name '$name_orig' has been changed to ",
- "'$name' to make it unique.\n" if $WARN;
-
- $scope->{ $name_orig }++;
- }
- $name = substr( $name, 0, $max_id_length )
- if ((length( $name ) > $max_id_length) && $critical);
- $scope->{ $name }++;
- return unreserve($name);
-}
-
-sub unreserve { $util->quote($_[0]) }
-
-1;
-
-=pod
=head1 SEE ALSO