$VERSION
=
sprintf
"%d.%02d"
,
q$Revision: 1.8 $
=~ /(\d+)\.(\d+)/;
sub
parse {
my
(
$translator
,
$data
) =
@_
;
$data
= Load(
$data
);
$data
=
$data
->{
'schema'
};
warn
"YAML data:"
,Dumper(
$data
)
if
$translator
->debug;
my
$schema
=
$translator
->schema;
my
@tables
=
map
{
$data
->{
'tables'
}{
$_
->[1] } }
sort
{
$a
->[0] <=>
$b
->[0] }
map
{ [
$data
->{
'tables'
}{
$_
}{
'order'
} || 0,
$_
] }
keys
%{
$data
->{
'tables'
} }
;
for
my
$tdata
(
@tables
) {
my
$table
=
$schema
->add_table(
name
=>
$tdata
->{
'name'
},
extra
=>
$tdata
->{
'extra'
},
) or
die
$schema
->error;
my
@fields
=
map
{
$tdata
->{
'fields'
}{
$_
->[1] } }
sort
{
$a
->[0] <=>
$b
->[0] }
map
{ [
$tdata
->{
'fields'
}{
$_
}{
'order'
},
$_
] }
keys
%{
$tdata
->{
'fields'
} }
;
for
my
$fdata
(
@fields
) {
$table
->add_field(
%$fdata
) or
die
$table
->error;
$table
->primary_key(
$fdata
->{
'name'
} )
if
$fdata
->{
'is_primary_key'
};
}
for
my
$idata
( @{
$tdata
->{
'indices'
} || [] } ) {
$table
->add_index(
%$idata
) or
die
$table
->error;
}
for
my
$cdata
( @{
$tdata
->{
'constraints'
} || [] } ) {
$table
->add_constraint(
%$cdata
) or
die
$table
->error;
}
}
my
@views
=
map
{
$data
->{
'views'
}{
$_
->[1] } }
sort
{
$a
->[0] <=>
$b
->[0] }
map
{ [
$data
->{
'views'
}{
$_
}{
'order'
},
$_
] }
keys
%{
$data
->{
'views'
} }
;
for
my
$vdata
(
@views
) {
$schema
->add_view(
%$vdata
) or
die
$schema
->error;
}
my
@triggers
=
map
{
$data
->{
'triggers'
}{
$_
->[1] } }
sort
{
$a
->[0] <=>
$b
->[0] }
map
{ [
$data
->{
'triggers'
}{
$_
}{
'order'
},
$_
] }
keys
%{
$data
->{
'triggers'
} }
;
for
my
$tdata
(
@triggers
) {
$schema
->add_trigger(
%$tdata
) or
die
$schema
->error;
}
my
@procedures
=
map
{
$data
->{
'procedures'
}{
$_
->[1] } }
sort
{
$a
->[0] <=>
$b
->[0] }
map
{ [
$data
->{
'procedures'
}{
$_
}{
'order'
},
$_
] }
keys
%{
$data
->{
'procedures'
} }
;
for
my
$tdata
(
@procedures
) {
$schema
->add_procedure(
%$tdata
) or
die
$schema
->error;
}
if
(
my
$tr_data
=
$data
->{
'translator'
} ) {
$translator
->add_drop_table(
$tr_data
->{
'add_drop_table'
} );
$translator
->filename(
$tr_data
->{
'filename'
} );
$translator
->no_comments(
$tr_data
->{
'no_comments'
} );
$translator
->parser_args(
$tr_data
->{
'parser_args'
} );
$translator
->producer_args(
$tr_data
->{
'producer_args'
} );
$translator
->parser_type(
$tr_data
->{
'parser_type'
} );
$translator
->producer_type(
$tr_data
->{
'producer_type'
} );
$translator
->show_warnings(
$tr_data
->{
'show_warnings'
} );
$translator
->trace(
$tr_data
->{
'trace'
} );
}
return
1;
}
1;