817aaad1a38876eb9a535c811bccb4fcb6fb4c35
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Parser / DBI / MySQL.pm
1 use MooseX::Declare;
2 role SQL::Translator::Parser::DBI::MySQL {
3     use MooseX::Types::Moose qw(HashRef Maybe Str);
4     use SQL::Translator::Types qw(View Table Schema);
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     );
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};
28         $default_value =~ s/::.*$// if defined $default_value;
29
30         return $default_value;
31     }
32
33     method _add_foreign_keys(Table $table, Schema $schema) {
34         my $fk_info = $self->dbh->foreign_key_info($self->catalog_name, $self->schema_name, $table->name, $self->catalog_name, $self->schema_name, undef);
35         return unless $fk_info;
36         my $fk_data;
37         while (my $fk_col = $fk_info->fetchrow_hashref) {
38             my $fk_name = $fk_col->{FK_NAME};
39             push @{$fk_data->{$fk_name}{columns}}, $fk_col->{FKCOLUMN_NAME};
40             push @{$fk_data->{$fk_name}{reference_columns}}, $fk_col->{PKCOLUMN_NAME};
41             $fk_data->{$fk_name}{table} = $fk_col->{FKTABLE_NAME};
42             $fk_data->{$fk_name}{reference_table} = $fk_col->{PKTABLE_NAME};
43             my $pk_name = $fk_col->{PK_NAME};
44             $pk_name = 'PRIMARY' unless defined $pk_name;
45             $fk_data->{$fk_name}{uk} = $schema->get_table($fk_col->{PKTABLE_NAME})->get_index($pk_name);
46         }
47
48         foreach my $fk_name (keys %$fk_data) {
49           my $fk = SQL::Translator::Object::ForeignKey->new(
50             {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}});
51           $fk->add_column($schema->get_table($fk_data->{$fk_name}{table})->get_column($_))
52             for @{$fk_data->{$fk_name}{columns}};
53           $schema->get_table($fk_data->{$fk_name}{table})->add_constraint($fk);
54         }
55     }
56
57     method _add_indexes(Table $table) {
58         my $index_info = $self->dbh->prepare(qq{SHOW INDEX FROM } . $table->name);
59
60         $index_info->execute;
61
62         my %indexes;
63         while (my $index_col = $index_info->fetchrow_hashref('NAME_uc')) {
64           my $index_name = $index_col->{KEY_NAME};
65
66           next if $index_name eq 'PRIMARY';
67           $indexes{$index_name}{index_type} = $index_col->{NON_UNIQUE} ? 'NORMAL' : 'UNIQUE';
68           my $column = $table->get_column($index_col->{COLUMN_NAME});
69           push @{$indexes{$index_name}{index_cols}},
70             {column => $column, pos => $index_col->{SEQ_IN_INDEX}};
71         }
72         foreach my $index_name (keys %indexes) {
73           next if $table->exists_index($index_name);
74           my $index = SQL::Translator::Object::Index->new(
75             {name => $index_name, type => $indexes{$index_name}{index_type}});
76           $index->add_column($_->{column})
77             for sort { $a->{pos} <=> $b->{pos} } @{$indexes{$index_name}{index_cols}};
78           $table->add_index($index);
79         }
80     }
81 }