Alzabo
view release on metacpan or search on metacpan
lib/Alzabo/Create/Table.pm view on Meta::CPAN
optional => 1 },
comment => { type => UNDEF | SCALAR,
default => '' },
} );
my %p = @_;
my $self = bless {}, $class;
$self->{schema} = $p{schema};
$self->set_name($p{name});
$self->{columns} = Tie::IxHash->new;
$self->{pk} = [];
$self->{indexes} = Tie::IxHash->new;
my %attr;
tie %{ $self->{attributes} }, 'Tie::IxHash';
$self->set_attributes( @{ $p{attributes} } );
$self->set_comment( $p{comment} );
# Setting this prevents run time type errors.
$self->{fk} = {};
return $self;
}
sub set_name
{
my $self = shift;
validate_pos( @_, { type => SCALAR } );
my $name = shift;
params_exception "Table $name already exists in schema"
if $self->schema->has_table($name);
my @i;
if ($self->{indexes})
{
@i = $self->indexes;
$self->delete_index($_) foreach @i;
}
my $old_name = $self->{name};
$self->{name} = $name;
eval
{
$self->schema->rules->validate_table_name($self);
};
$self->add_index($_) foreach @i;
if ($@)
{
$self->{name} = $old_name;
rethrow_exception($@);
}
if ( $old_name && eval { $self->schema->table($old_name) } )
{
$self->schema->register_table_name_change( table => $self,
old_name => $old_name );
foreach my $fk ($self->all_foreign_keys)
{
$fk->table_to->register_table_name_change( table => $self,
old_name => $old_name );
}
}
}
sub make_column
{
my $self = shift;
my %p = @_;
my $is_pk = delete $p{primary_key};
my %p2;
foreach ( qw( before after ) )
{
$p2{$_} = delete $p{$_} if exists $p{$_};
}
$self->add_column( column => Alzabo::Create::Column->new( table => $self,
%p ),
%p2 );
my $col = $self->column( $p{name} );
$self->add_primary_key($col) if $is_pk;
return $col;
}
sub add_column
{
my $self = shift;
validate( @_, { column => { isa => 'Alzabo::Create::Column' },
before => { optional => 1 },
after => { optional => 1 } } );
my %p = @_;
my $col = $p{column};
params_exception "Column " . $col->name . " already exists in " . $self->name
if $self->{columns}->EXISTS( $col->name );
$col->set_table($self) unless $col->table eq $self;
$self->{columns}->STORE( $col->name, $col);
foreach ( qw( before after ) )
{
if ( exists $p{$_} )
{
$self->move_column( $_ => $p{$_},
( run in 1.417 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )