Alzabo
view release on metacpan or search on metacpan
lib/Alzabo/RDBMSRules.pm view on Meta::CPAN
my $self = shift;
my $table = shift;
my $dbh = $table->schema->driver->handle;
my $sth = $dbh->column_info( undef, $table->schema->name, $table->name );
while ( my $pk_info = $sth->fetchrow_hashref )
{
$table->add_primary_key( $table->column( $pk_info->{COLUMN_NAME} ) );
}
}
=cut
sub rules_id
{
shift()->_virtual;
}
sub schema_sql_diff
{
my $self = shift;
validate( @_, { new => { isa => 'Alzabo::Schema' },
old => { isa => 'Alzabo::Schema' } } );
my %p = @_;
local $self->{state};
my @sql;
my %changed_name;
foreach my $new_t ( $p{new}->tables )
{
# When syncing against an existing schema, the table may be
# present with its new name.
my $old_t;
if ( defined $new_t->former_name )
{
$old_t = eval { $p{old}->table( $new_t->former_name ) };
}
$old_t ||= eval { $p{old}->table( $new_t->name ) };
if ($old_t)
{
if ( $old_t->name ne $new_t->name )
{
$changed_name{ $old_t->name } = 1;
if ( $self->can_alter_table_name )
{
push @sql, $self->alter_table_name_sql($new_t);
}
else
{
push @sql, $self->recreate_table_sql( new => $new_t,
old => $old_t,
);
push @sql, $self->rename_sequences( new => $new_t,
old => $old_t,
);
# no need to do more because table will be
# recreated from scratch
next;
}
}
push @sql,
eval { $self->table_sql_diff( new => $new_t,
old => $old_t ) };
if ( my $e = Exception::Class->caught('Alzabo::Exception::RDBMSRules::RecreateTable' ) )
{
push @sql, $self->recreate_table_sql( new => $new_t,
old => $old_t,
);
}
elsif ( $e = $@ )
{
die $e;
}
}
else
{
push @sql, $self->table_sql($new_t);
foreach my $fk ( $new_t->all_foreign_keys )
{
push @{ $self->{state}{deferred_sql} }, $self->foreign_key_sql($fk);
}
}
}
foreach my $old_t ( $p{old}->tables )
{
unless ( $changed_name{ $old_t->name } ||
eval { $p{new}->table( $old_t->name ) } )
{
push @sql, $self->drop_table_sql($old_t);
}
}
return @sql, @{ $self->{state}{deferred_sql} || [] };
}
sub table_sql_diff
{
my $self = shift;
validate( @_, { new => { isa => 'Alzabo::Table' },
old => { isa => 'Alzabo::Table' } } );
my %p = @_;
my @sql;
foreach my $old_i ( $p{old}->indexes )
{
unless ( eval { $p{new}->index( $old_i->id ) } )
{
push @sql, $self->drop_index_sql($old_i, $p{new}->name)
( run in 2.151 seconds using v1.01-cache-2.11-cpan-98e64b0badf )