Add method to populate a column extra fields
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Parser / DBI / MySQL.pm
CommitLineData
4f4fd192 1use MooseX::Declare;
2role 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}