SQL-Translator
view release on metacpan or search on metacpan
lib/SQL/Translator/Schema.pm view on Meta::CPAN
}
return $g;
}
has _tables => (is => 'ro', init_arg => undef, default => quote_sub(q{ +{} }));
sub add_table {
=pod
=head2 add_table
Add a table object. Returns the new L<SQL::Translator::Schema::Table> object.
The "name" parameter is required. If you try to create a table with the
same name as an existing table, you will get an error and the table will
not be created.
my $t1 = $schema->add_table( name => 'foo' ) or die $schema->error;
my $t2 = SQL::Translator::Schema::Table->new( name => 'bar' );
$t2 = $schema->add_table( $table_bar ) or die $schema->error;
=cut
my $self = shift;
my $table_class = 'SQL::Translator::Schema::Table';
my $table;
if (UNIVERSAL::isa($_[0], $table_class)) {
$table = shift;
$table->schema($self);
} else {
my %args = ref $_[0] eq 'HASH' ? %{ $_[0] } : @_;
$args{'schema'} = $self;
$table = $table_class->new(\%args)
or return $self->error($table_class->error);
}
$table->order(++$self->_order->{table});
# We know we have a name as the Table->new above errors if none given.
my $table_name = $table->name;
if (defined $self->_tables->{$table_name}) {
return $self->error(qq[Can't use table name "$table_name": table exists]);
} else {
$self->_tables->{$table_name} = $table;
}
return $table;
}
sub drop_table {
=pod
=head2 drop_table
Remove a table from the schema. Returns the table object if the table was found
and removed, an error otherwise. The single parameter can be either a table
name or an L<SQL::Translator::Schema::Table> object. The "cascade" parameter
can be set to 1 to also drop all triggers on the table, default is 0.
$schema->drop_table('mytable');
$schema->drop_table('mytable', cascade => 1);
=cut
my $self = shift;
my $table_class = 'SQL::Translator::Schema::Table';
my $table_name;
if (UNIVERSAL::isa($_[0], $table_class)) {
$table_name = shift->name;
} else {
$table_name = shift;
}
my %args = @_;
my $cascade = $args{'cascade'};
if (!exists $self->_tables->{$table_name}) {
return $self->error(qq[Can't drop table: "$table_name" doesn't exist]);
}
my $table = delete $self->_tables->{$table_name};
if ($cascade) {
# Drop all triggers on this table
$self->drop_trigger() for (grep { $_->on_table eq $table_name } values %{ $self->_triggers });
}
return $table;
}
has _procedures => (is => 'ro', init_arg => undef, default => quote_sub(q{ +{} }));
sub add_procedure {
=pod
=head2 add_procedure
Add a procedure object. Returns the new L<SQL::Translator::Schema::Procedure>
object. The "name" parameter is required. If you try to create a procedure
with the same name as an existing procedure, you will get an error and the
procedure will not be created.
my $p1 = $schema->add_procedure( name => 'foo' );
my $p2 = SQL::Translator::Schema::Procedure->new( name => 'bar' );
$p2 = $schema->add_procedure( $procedure_bar ) or die $schema->error;
=cut
my $self = shift;
my $procedure_class = 'SQL::Translator::Schema::Procedure';
my $procedure;
if (UNIVERSAL::isa($_[0], $procedure_class)) {
$procedure = shift;
$procedure->schema($self);
} else {
my %args = ref $_[0] eq 'HASH' ? %{ $_[0] } : @_;
$args{'schema'} = $self;
return $self->error('No procedure name') unless $args{'name'};
$procedure = $procedure_class->new(\%args)
or return $self->error($procedure_class->error);
}
$procedure->order(++$self->_order->{proc});
my $procedure_name = $procedure->name
or return $self->error('No procedure name');
if (defined $self->_procedures->{$procedure_name}) {
return $self->error(qq[Can't create procedure: "$procedure_name" exists]);
} else {
$self->_procedures->{$procedure_name} = $procedure;
}
return $procedure;
}
sub drop_procedure {
=pod
=head2 drop_procedure
( run in 0.586 second using v1.01-cache-2.11-cpan-524268b4103 )