Commit | Line | Data |
b8657f04 |
1 | package SQL::Translator::Parser::DBI; |
abb2c327 |
2 | use namespace::autoclean; |
684763c1 |
3 | use Moose::Role; |
4 | use MooseX::Types::Moose qw(Maybe Str); |
b8657f04 |
5 | use DBI::Const::GetInfoType; |
c4ec1b63 |
6 | use DBI::Const::GetInfo::ANSI; |
7 | use DBI::Const::GetInfoReturn; |
44547961 |
8 | use aliased 'SQL::Translator::Object::Column'; |
9 | use aliased 'SQL::Translator::Object::Index'; |
10 | use aliased 'SQL::Translator::Object::Table'; |
11 | use aliased 'SQL::Translator::Object::View'; |
b8657f04 |
12 | |
684763c1 |
13 | has 'quoter' => ( |
44547961 |
14 | is => 'rw', |
15 | isa => Str, |
16 | requried => 1, |
17 | lazy => 1, |
18 | default => sub { shift->dbh->get_info(29) || q{"} } |
b8657f04 |
19 | ); |
20 | |
684763c1 |
21 | has 'namesep' => ( |
44547961 |
22 | is => 'rw', |
23 | isa => Str, |
24 | required => 1, |
25 | lazy => 1, |
26 | default => sub { shift->dbh->get_info(41) || '.' } |
b8657f04 |
27 | ); |
28 | |
684763c1 |
29 | has 'schema_name' => ( |
44547961 |
30 | is => 'rw', |
31 | isa => Maybe[Str], |
32 | required => 0, |
33 | lazy => 1, |
34 | default => undef |
684763c1 |
35 | ); |
36 | |
37 | has 'catalog_name' => ( |
44547961 |
38 | is => 'rw', |
39 | isa => Maybe[Str], |
40 | required => 0, |
41 | lazy => 1, |
42 | default => undef |
b8657f04 |
43 | ); |
44 | |
684763c1 |
45 | sub _subclass { |
b8657f04 |
46 | my $self = shift; |
47 | |
684763c1 |
48 | my $dbtype = $self->dbh->get_info($GetInfoType{SQL_DBMS_NAME}) || $self->dbh->{Driver}{Name}; |
b8657f04 |
49 | |
684763c1 |
50 | my $class = __PACKAGE__ . '::'. $dbtype; |
51 | Class::MOP::load_class($class); |
52 | $class->meta->apply($self); |
53 | } |
54 | |
55 | sub _add_tables { |
56 | my $self = shift; |
57 | my $schema = shift; |
58 | |
59 | my $sth = $self->dbh->table_info($self->catalog_name, $self->schema_name, '%', 'TABLE,VIEW'); |
60 | while (my $table_info = $sth->fetchrow_hashref) { |
61 | if ($table_info->{TABLE_TYPE} eq 'TABLE') { |
44547961 |
62 | my $table = Table->new({ name => $table_info->{TABLE_NAME} }); |
684763c1 |
63 | $schema->add_table($table); |
64 | $self->_add_columns($table); |
65 | $self->_add_primary_key($table); |
66 | } |
67 | elsif ($table_info->{TABLE_TYPE} eq 'VIEW') { |
68 | my $sql = $self->_get_view_sql($table_info->{TABLE_NAME}); |
44547961 |
69 | my $view = View->new({ name => $table_info->{TABLE_NAME}, sql => $sql }); |
70 | $schema->add_view($view); |
71 | $self->_add_columns($view); |
684763c1 |
72 | } |
73 | } |
74 | } |
b8657f04 |
75 | |
684763c1 |
76 | sub _add_columns { |
77 | my $self = shift; |
78 | my $table = shift; |
b8657f04 |
79 | |
684763c1 |
80 | my $sth = $self->dbh->column_info($self->catalog_name, $self->schema_name, $table->name, '%'); |
81 | while (my $col_info = $sth->fetchrow_hashref) { |
44547961 |
82 | my $column = Column->new({ name => $col_info->{COLUMN_NAME}, |
83 | data_type => $col_info->{TYPE_NAME}, |
84 | size => $col_info->{COLUMN_SIZE}, |
85 | default_value => $col_info->{COLUMN_DEF}, |
86 | is_nullable => $col_info->{NULLABLE}, }); |
684763c1 |
87 | $table->add_column($column); |
684763c1 |
88 | } |
89 | } |
90 | |
91 | sub _add_primary_key { |
92 | my $self = shift; |
93 | my $table = shift; |
b8657f04 |
94 | |
684763c1 |
95 | my $pk_info = $self->dbh->primary_key_info($self->catalog_name, $self->schema_name, $table->name); |
684763c1 |
96 | my ($pk_name, @pk_cols); |
97 | while (my $pk_col = $pk_info->fetchrow_hashref) { |
98 | $pk_name = $pk_col->{PK_NAME}; |
99 | push @pk_cols, $pk_col->{COLUMN_NAME}; |
aad333cd |
100 | } |
44547961 |
101 | my $index = Index->new({ name => $pk_name, type => 'PRIMARY_KEY' }); |
684763c1 |
102 | $index->add_column($table->get_column($_)) for @pk_cols; |
103 | $table->add_index($index); |
b8657f04 |
104 | } |
105 | |
106 | 1; |