X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FObject%2FSchema.pm;h=80f268d051d3de592b6dd8c38859648528ba4616;hb=b100149134bda5d233ee03b80f89bf9cac424acf;hp=b3c69edb674296d6cba9643ca7b5cd7e13530e5f;hpb=6381c78d23878fe50d7912193c4b609c77a169aa;p=dbsrgits%2FSQL-Translator-2.0-ish.git diff --git a/lib/SQL/Translator/Object/Schema.pm b/lib/SQL/Translator/Object/Schema.pm index b3c69ed..80f268d 100644 --- a/lib/SQL/Translator/Object/Schema.pm +++ b/lib/SQL/Translator/Object/Schema.pm @@ -1,9 +1,8 @@ use MooseX::Declare; -class SQL::Translator::Object::Schema { +class SQL::Translator::Object::Schema extends SQL::Translator::Object { use MooseX::Types::Moose qw(HashRef Maybe Str); - use MooseX::AttributeHelpers; use SQL::Translator::Types qw(Procedure Table Trigger View); - extends 'SQL::Translator::Object'; + use MooseX::MultiMethods; has 'name' => ( is => 'rw', @@ -11,69 +10,118 @@ class SQL::Translator::Object::Schema { required => 1, default => '' ); + + has 'database' => ( + is => 'rw', + isa => Maybe[Str], + ); has 'tables' => ( - metaclass => 'Collection::Hash', + traits => ['Hash'], is => 'rw', isa => HashRef[Table], - provides => { - exists => 'exists_table', - keys => 'table_ids', - values => 'get_tables', - get => 'get_table', - set => 'add_table', + handles => { + exists_table => 'exists', + table_ids => 'keys', + get_tables => 'values', + get_table => 'get', + add_table => 'set', + remove_table => 'delete', }, default => sub { my %hash = (); tie %hash, 'Tie::IxHash'; return \%hash }, ); has 'views' => ( - metaclass => 'Collection::Hash', + traits => ['Hash'], is => 'rw', isa => HashRef[View], - provides => { - exists => 'exists_view', - keys => 'view_ids', - values => 'get_views', - get => 'get_view', - set => 'add_view', + handles => { + exists_view => 'exists', + view_ids => 'keys', + get_views => 'values', + get_view => 'get', + add_view => 'set', + remove_view => 'delete', }, default => sub { my %hash = (); tie %hash, 'Tie::IxHash'; return \%hash }, ); has 'procedures' => ( - metaclass => 'Collection::Hash', + traits => ['Hash'], is => 'rw', isa => HashRef[Procedure], - provides => { - exists => 'exists_procedure', - keys => 'procedure_ids', - values => 'get_procedures', - get => 'get_procedure', - set => 'add_procedure', + handles => { + exists_procedure => 'exists', + procedure_ids => 'keys', + get_procedures => 'values', + get_procedure => 'get', + add_procedure => 'set', + remove_procedure => 'delete', }, default => sub { my %hash = (); tie %hash, 'Tie::IxHash'; return \%hash }, ); has 'triggers' => ( - metaclass => 'Collection::Hash', + traits => ['Hash'], is => 'rw', isa => HashRef[Trigger], - provides => { - exists => 'exists_trigger', - keys => 'trigger_ids', - values => 'get_triggers', - get => 'get_trigger', - set => 'add_trigger', + handles => { + exists_trigger => 'exists', + trigger_ids => 'keys', + get_triggers => 'values', + get_trigger => 'get', + add_trigger => 'set', + remove_trigger => 'delete', }, default => sub { my %hash = (); tie %hash, 'Tie::IxHash'; return \%hash }, ); - around add_table(Table $table) { $self->$orig($table->name, $table) } - around add_view(View $view) { $self->$orig($view->name, $view) } - around add_procedure(Procedure $procedure) { $self->$orig($procedure->name, $procedure) } - around add_trigger(Trigger $trigger) { $self->$orig($trigger->name, $trigger) } + around add_table(Table $table does coerce) { + die "Can't use table name " . $table->name if $self->exists_table($table->name) || $table->name eq ''; + $table->schema($self); + $self->$orig($table->name, $table); + } + + around add_view(View $view does coerce) { + die "Can't use view name " . $view->name if $self->exists_view($view->name) || $view->name eq ''; + $view->schema($self); + $self->$orig($view->name, $view) + } + + around add_procedure(Procedure $procedure does coerce) { + $procedure->schema($self); + $self->$orig($procedure->name, $procedure) + } + + around add_trigger(Trigger $trigger does coerce) { + $trigger->schema($self); + $self->$orig($trigger->name, $trigger);; + } + + method is_valid { return $self->get_tables ? 1 : undef } + + around remove_table(Table|Str $table, Int :$cascade = 0) { + my $name = is_Table($table) ? $table->name : $table; + die "Can't drop non-existant table " . $name unless $self->exists_table($name); + $self->$orig($name); + } + + around remove_view(View|Str $view) { + my $name = is_View($view) ? $view->name : $view; + die "Can't drop non-existant view " . $name unless $self->exists_view($name); + $self->$orig($name); + } + + around remove_trigger(Trigger|Str $trigger) { + my $name = is_Trigger($trigger) ? $trigger->name : $trigger; +#### die "Can't drop non-existant trigger " . $name unless $self->exists_trigger($name); + $self->$orig($name); + } - method is_valid { 1 } + around remove_procedure(Procedure|Str $procedure) { + my $name = is_Procedure($procedure) ? $procedure->name : $procedure; + $self->$orig($name); + } method order { } method perform_action_when { }