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); |
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 | } |