add constraints after all tables are added
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Object / Column.pm
CommitLineData
4f4fd192 1use MooseX::Declare;
072eb218 2class SQL::Translator::Object::Column extends SQL::Translator::Object is dirty {
66daa43a 3 use MooseX::Types::Moose qw(Int Maybe ScalarRef Str);
f49a2a49 4 use MooseX::MultiMethods;
3c557f72 5 use SQL::Translator::Types qw(Bit Constraint Table Trigger);
a499b4bd 6 use Tie::IxHash;
072eb218 7 clean;
8
9 use overload
10 '""' => sub { shift->name },
11 'bool' => sub { $_[0]->name || $_[0] },
12 fallback => 1,
13 ;
f49a2a49 14
15 has 'table' => (
16 is => 'rw',
17 isa => Table,
f49a2a49 18 weak_ref => 1,
19 );
4f4fd192 20
21 has 'name' => (
22 is => 'rw',
23 isa => Str,
072eb218 24 required => 1,
476b3969 25# trigger => sub { my ($self, $new, $old) = @_; if (defined $old) { $self->table->remove_column($old); $self->table->add_column($self) } }
4f4fd192 26 );
27
28 has 'data_type' => (
29 is => 'rw',
81429cb9 30 isa => Str,
072eb218 31 required => 1,
32 default => '',
e1bc9e4a 33 trigger => sub { my ($self, $new, $old) = @_; $self->is_auto_increment(1) if $new =~ /^serial$/i; },
81429cb9 34 );
35
36 has 'sql_data_type' => (
37 is => 'rw',
4f4fd192 38 isa => Int,
072eb218 39 required => 1,
40 default => 0
4f4fd192 41 );
42
958a3ef7 43 has 'length' => (
4f4fd192 44 is => 'rw',
958a3ef7 45 isa => Int,
46 default => 0,
47 lazy => 1,
48 predicate => 'has_length',
49 );
50
51 has 'precision' => (
52 is => 'rw',
53 isa => Int,
54 default => 0,
55 lazy => 1,
56 predicate => 'has_precision',
4f4fd192 57 );
58
59 has 'is_nullable' => (
60 is => 'rw',
2cb42d47 61 isa => Bit,
4f4fd192 62 required => 1,
160f1f55 63 default => 1,
4f4fd192 64 );
995165f7 65
66 has 'is_unique' => (
67 is => 'rw',
66daa43a 68 isa => Bit,
995165f7 69 default => 0,
70 );
4f4fd192 71
4f4fd192 72 has 'default_value' => (
73 is => 'rw',
1ddd6d2a 74 isa => Maybe[ScalarRef|Str],
4f4fd192 75 );
0874db2d 76
81429cb9 77 has 'is_auto_increment' => (
78 is => 'rw',
ada068ed 79 isa => Bit,
81429cb9 80 required => 1,
ada068ed 81 coerce => 1,
81429cb9 82 default => 0
83 );
84
0874db2d 85 has 'is_primary_key' => (
86 is => 'rw',
66daa43a 87 isa => Bit,
0874db2d 88 default => 0
89 );
70ada8ac 90
91 has 'is_foreign_key' => (
92 is => 'rw',
66daa43a 93 isa => Bit,
70ada8ac 94 default => 0
95 );
96
97 has 'foreign_key_reference' => (
98 is => 'rw',
99 isa => Constraint,
100 );
4f4fd192 101
102 has 'trigger' => (
103 is => 'rw',
104 isa => Trigger,
105 );
0874db2d 106
815822d5 107 has '_order' => (
108 is => 'rw',
109 isa => Int,
110 );
111
70ada8ac 112 around size(@args) {
113 $self->$orig(@args) if @args;
114 my @sizes = $self->$orig;
115 return wantarray ? @sizes
116 : join ',', @sizes;
117 }
b750d2f1 118
8bd81980 119 method full_name { $self->table->name . '.' . $self->name }
120 method schema { $self->table->schema }
121
e8ef9a9b 122 before name($name?) { die "Can't use column name $name" if defined $name && $self->table->exists_column($name) && $name ne $self->name }
958a3ef7 123
124 multi method size(Str $size) { my ($length, $precision) = split /,/, $size; $self->length($length); $self->precision($precision) if $precision; $self->size }
125 multi method size(Int $length, Int $precision) { $self->length($length); $self->precision($precision); $self->size }
126 multi method size(ArrayRef $size) { $self->length($size->[0]); $self->precision($size->[1]) if @$size == 2; $self->size }
127
a20ea10d 128 multi method size {
958a3ef7 129 return $self->has_precision
130 ? wantarray
131 ? ($self->length, $self->precision)
132 : join ',', ($self->length, $self->precision)
133 : $self->length;
134 }
135
815822d5 136 multi method order(Int $order) { $self->_order($order); }
137 multi method order {
138 my $order = $self->_order;
139 unless (defined $order && $order) {
140 my $columns = Tie::IxHash->new( map { $_->name => $_ } $self->table->get_columns );
160f1f55 141 $order = $columns->Indices($self->name) || 0; $order++;
815822d5 142 $self->_order($order);
143 }
144 return $order;
145 }
146
e8ef9a9b 147 method BUILD(HashRef $args) {
148 die "Cannot use column name $args->{name}" if $args->{name} eq '';
815822d5 149 $self->size($args->{size}) if $args->{size};
e8ef9a9b 150 }
4f4fd192 151}