Commit | Line | Data |
4f4fd192 |
1 | use MooseX::Declare; |
2 | role SQL::Translator::Parser::DBI::MySQL { |
2ac3a8e1 |
3 | use MooseX::Types::Moose qw(HashRef Maybe Str); |
9406163a |
4 | use SQL::Translator::Types qw(View Table Schema Column); |
2ac3a8e1 |
5 | |
6 | has 'schema_name' => ( |
7 | is => 'rw', |
8 | isa => Maybe [Str], |
9 | lazy => 1, |
10 | default => sub { |
11 | my ($name) = shift->dbh->selectrow_array("select database()"); |
12 | return $name; |
13 | }, |
14 | ); |
6fbb2193 |
15 | |
16 | method _get_view_sql(View $view) { |
17 | #my ($sql) = $self->dbh->selectrow_array(''); |
18 | #return $sql; |
19 | return ''; |
20 | } |
21 | |
22 | method _is_auto_increment(HashRef $column_info) { |
23 | return $column_info->{mysql_is_auto_increment}; |
24 | } |
25 | |
26 | method _column_default_value(HashRef $column_info) { |
27 | my $default_value = $column_info->{COLUMN_DEF}; |
1f5bc4d1 |
28 | $default_value =~ s/::.*$// if defined $default_value; |
6fbb2193 |
29 | |
30 | return $default_value; |
31 | } |
8a812758 |
32 | |
9406163a |
33 | method _column_data_type(HashRef $column_info) { $column_info->{TYPE_NAME} } |
34 | |
35 | method _add_column_extra(Column $column, HashRef $column_info) { |
36 | $column->add_extra(unsigned => 1) if $column_info->{mysql_type_name} =~ /unsigned/; |
37 | $column->add_extra(zerofill => 1) if $column_info->{mysql_type_name} =~ /zerofill/; |
38 | $column->add_extra(values => $column_info->{mysql_values}) if $column_info->{mysql_values}; |
39 | if (my ($size) = $column_info->{mysql_type_name} =~ /\((\d+,\d+)\)/) { |
40 | $column->size($size); |
41 | } |
42 | } |
43 | |
8a812758 |
44 | method _add_foreign_keys(Table $table, Schema $schema) { |
45 | my $fk_info = $self->dbh->foreign_key_info($self->catalog_name, $self->schema_name, $table->name, $self->catalog_name, $self->schema_name, undef); |
46 | return unless $fk_info; |
47 | my $fk_data; |
48 | while (my $fk_col = $fk_info->fetchrow_hashref) { |
49 | my $fk_name = $fk_col->{FK_NAME}; |
50 | push @{$fk_data->{$fk_name}{columns}}, $fk_col->{FKCOLUMN_NAME}; |
51 | push @{$fk_data->{$fk_name}{reference_columns}}, $fk_col->{PKCOLUMN_NAME}; |
52 | $fk_data->{$fk_name}{table} = $fk_col->{FKTABLE_NAME}; |
53 | $fk_data->{$fk_name}{reference_table} = $fk_col->{PKTABLE_NAME}; |
54 | my $pk_name = $fk_col->{PK_NAME}; |
55 | $pk_name = 'PRIMARY' unless defined $pk_name; |
56 | $fk_data->{$fk_name}{uk} = $schema->get_table($fk_col->{PKTABLE_NAME})->get_index($pk_name); |
57 | } |
58 | |
59 | foreach my $fk_name (keys %$fk_data) { |
60 | my $fk = SQL::Translator::Object::ForeignKey->new( |
61 | {name => $fk_name, references => $fk_data->{$fk_name}{uk}, reference_table => $fk_data->{$fk_name}{reference_table}, reference_columns => $fk_data->{$fk_name}{reference_columns}}); |
62 | $fk->add_column($schema->get_table($fk_data->{$fk_name}{table})->get_column($_)) |
63 | for @{$fk_data->{$fk_name}{columns}}; |
64 | $schema->get_table($fk_data->{$fk_name}{table})->add_constraint($fk); |
65 | } |
66 | } |
67 | |
68 | method _add_indexes(Table $table) { |
69 | my $index_info = $self->dbh->prepare(qq{SHOW INDEX FROM } . $table->name); |
70 | |
71 | $index_info->execute; |
72 | |
73 | my %indexes; |
74 | while (my $index_col = $index_info->fetchrow_hashref('NAME_uc')) { |
75 | my $index_name = $index_col->{KEY_NAME}; |
76 | |
77 | next if $index_name eq 'PRIMARY'; |
78 | $indexes{$index_name}{index_type} = $index_col->{NON_UNIQUE} ? 'NORMAL' : 'UNIQUE'; |
79 | my $column = $table->get_column($index_col->{COLUMN_NAME}); |
80 | push @{$indexes{$index_name}{index_cols}}, |
81 | {column => $column, pos => $index_col->{SEQ_IN_INDEX}}; |
82 | } |
83 | foreach my $index_name (keys %indexes) { |
84 | next if $table->exists_index($index_name); |
85 | my $index = SQL::Translator::Object::Index->new( |
86 | {name => $index_name, type => $indexes{$index_name}{index_type}}); |
87 | $index->add_column($_->{column}) |
88 | for sort { $a->{pos} <=> $b->{pos} } @{$indexes{$index_name}{index_cols}}; |
89 | $table->add_index($index); |
90 | } |
91 | } |
4f4fd192 |
92 | } |