SQL-Translator
view release on metacpan or search on metacpan
lib/SQL/Translator/Parser/Sybase.pm view on Meta::CPAN
local $::RD_ERRORS = 1
unless defined $::RD_ERRORS; # Make sure the parser dies when it encounters an error
local $::RD_WARN = 1
unless defined $::RD_WARN; # Enable warnings. This will warn on unused rules &c.
local $::RD_HINT = 1
unless defined $::RD_HINT; # Give out hints to help fix problems.
local $::RD_TRACE = $translator->trace ? 1 : undef;
local $DEBUG = $translator->debug;
my $parser = ddl_parser_instance('Sybase');
my $result = $parser->startrule($data);
return $translator->error("Parse failed.") unless defined $result;
warn Dumper($result) if $DEBUG;
my $schema = $translator->schema;
my @tables = sort { $result->{$a}->{'order'} <=> $result->{$b}->{'order'} }
keys %{$result};
for my $table_name (@tables) {
my $tdata = $result->{$table_name};
my $table = $schema->add_table(name => $tdata->{'name'})
or die "Can't create table '$table_name': ", $schema->error;
$table->comments($tdata->{'comments'});
my @fields = sort { $tdata->{'fields'}->{$a}->{'order'} <=> $tdata->{'fields'}->{$b}->{'order'} }
keys %{ $tdata->{'fields'} };
for my $fname (@fields) {
my $fdata = $tdata->{'fields'}{$fname};
my $field = $table->add_field(
name => $fdata->{'name'},
data_type => $fdata->{'data_type'},
size => $fdata->{'size'},
default_value => $fdata->{'default'},
is_auto_increment => $fdata->{'is_auto_inc'},
is_nullable => $fdata->{'nullable'},
comments => $fdata->{'comments'},
) or die $table->error;
$table->primary_key($field->name) if $fdata->{'is_primary_key'};
for my $qual (qw[ binary unsigned zerofill list ]) {
if (my $val = $fdata->{$qual} || $fdata->{ uc $qual }) {
next if ref $val eq 'ARRAY' && !@$val;
$field->extra($qual, $val);
}
}
if ($field->data_type =~ /(set|enum)/i && !$field->size) {
my %extra = $field->extra;
my $longest = 0;
for my $len (map {length} @{ $extra{'list'} || [] }) {
$longest = $len if $len > $longest;
}
$field->size($longest) if $longest;
}
for my $cdata (@{ $fdata->{'constraints'} }) {
next unless $cdata->{'type'} eq 'foreign_key';
$cdata->{'fields'} ||= [ $field->name ];
push @{ $tdata->{'constraints'} }, $cdata;
}
}
for my $idata (@{ $tdata->{'indices'} || [] }) {
my $index = $table->add_index(
name => $idata->{'name'},
type => uc $idata->{'type'},
fields => $idata->{'fields'},
) or die $table->error;
}
for my $cdata (@{ $tdata->{'constraints'} || [] }) {
my $constraint = $table->add_constraint(
name => $cdata->{'name'},
type => $cdata->{'type'},
fields => $cdata->{'fields'},
reference_table => $cdata->{'reference_table'},
reference_fields => $cdata->{'reference_fields'},
match_type => $cdata->{'match_type'} || '',
on_delete => $cdata->{'on_delete'} || $cdata->{'on_delete_do'},
on_update => $cdata->{'on_update'} || $cdata->{'on_update_do'},
) or die $table->error;
}
}
return 1;
}
1;
# -------------------------------------------------------------------
# Every hero becomes a bore at last.
# Ralph Waldo Emerson
# -------------------------------------------------------------------
=pod
=head1 AUTHOR
Ken Y. Clark E<lt>kclark@cpan.orgE<gt>.
=head1 SEE ALSO
SQL::Translator, SQL::Translator::Parser::DBI, L<http://www.midsomer.org/>.
=cut
( run in 3.501 seconds using v1.01-cache-2.11-cpan-5a3173703d6 )