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