use YAML qw(Load);
use MooseX::MultiMethods;
- multi method parse(Schema $data) { return $data }
+ multi method parse(Schema $data) { $data }
multi method parse(Str $data) {
$data = Load($data);
keys %{ $data->{'tables'} };
for my $tdata ( @tables ) {
- my $table = Table->new({ map { $tdata->{$_} ? ($_ => $tdata->{$_}) : () } qw/name extra options/ });
+ my $table = Table->new({ name => $tdata->{name}, schema => $schema });
+ $table->extra($tdata->{extra}) if $tdata->{extra};
+ $table->options($tdata->{options}) if $tdata->{options};
$schema->add_table($table);
-
+
my @fields =
map { $tdata->{'fields'}{ $_->[1] } }
- map { [ $tdata->{'fields'}{ $_ }{'order'}, $_ ] }
+ map { [ $tdata->{'fields'}{ $_ }{'order'} || 0, $_ ] }
keys %{ $tdata->{'fields'} };
for my $fdata ( @fields ) {
$fdata->{sql_data_type} = $self->data_type_mapping->{$fdata->{data_type}} || -99999;
+ $fdata->{table} = $table;
my $column = Column->new($fdata);
$table->add_column($column);
- $table->primary_key($column->name) if $fdata->{is_primary_key};
+ $column->is_primary_key(1) if $fdata->{is_primary_key};
}
- for my $idata ( @{ $tdata->{'indices'} || [] } ) {
+ for my $idata ( @{ $tdata->{'indices'} || [] } ) {
+ $idata->{table} = $table;
+ my $columns = delete $idata->{fields};
+
my $index = Index->new($idata);
+ $index->add_column($table->get_column($_)) for @$columns;
$table->add_index($index);
}
for my $cdata ( @{ $tdata->{'constraints'} || [] } ) {
+ $cdata->{table} = $table;
+ $cdata->{reference_columns} = delete $cdata->{reference_fields} || [];
+ my $columns = delete $cdata->{fields} || [];
+ $columns = ref $columns eq 'ARRAY' ? $columns : [ $columns ];
my $constraint = Constraint->new($cdata);
+ $constraint->add_column($table->get_column($_)) for @$columns;
$table->add_constraint($constraint);
}
}
keys %{ $data->{'triggers'} };
for my $tdata ( @triggers ) {
- my @columns = delete $tdata->{fields} || ();
+ my $columns = delete $tdata->{fields} || ();
my $trigger = Trigger->new($tdata);
- $trigger->add_column($schema->get_table($tdata->{on_table})->get_column($_)) for @columns;
+ $trigger->add_column($schema->get_table($tdata->{on_table})->get_column($_)) for @$columns;
$schema->add_trigger($trigger);
}
map { [ $data->{'procedures'}{ $_ }{'order'}, $_ ] }
keys %{ $data->{'procedures'} };
- for my $tdata ( @procedures ) {
- my $procedure = Procedure->new($tdata);
+ for my $pdata ( @procedures ) {
+ my $procedure = Procedure->new($pdata);
$schema->add_procedure($procedure);
}
$translator->trace( $tr_data->{'trace'} );
}
- return $schema;
+ return 1;
}
}