MySQL-Workbench-DBIC

 view release on metacpan or  search on metacpan

lib/MySQL/Workbench/DBIC.pm  view on Meta::CPAN

    for my $table ( @tables ){
        my $name = $table->name;

        push @classes, $name;

        my $rels = $table->foreign_keys;
        for my $to_table ( keys %$rels ){
            $relations{$to_table}->{to}->{$name}   = $rels->{$to_table};
            $relations{$name}->{from}->{$to_table} = $rels->{$to_table};
        }
    }

    $self->_set_classes( \@classes );

    my @scheme = $self->_main_template;

    my @files;
    for my $table ( @tables ){
        my $custom_code = $self->_custom_code_table( $table );
        push @files, $self->_class_template( $table, $relations{$table->name}, $custom_code );
    }

    for my $view ( @{ $parser->views || [] } ) {
        my $custom_code = $self->_custom_code_table( $view );
        push @files, $self->_view_template( $view, $custom_code );
    }

    push @files, @scheme;

    $self->_write_files( @files );
}

sub _custom_code_table {
    my ($self, $table) = @_;

    my $name = $table->name;
    if ( $self->uppercase ) {
        $name = join '', map{ ucfirst } split /[_-]/, $table->name;
    }

    my @base_path;
    push @base_path, $self->output_path if $self->output_path;

    my $path = File::Spec->catfile(
        @base_path,
        (split /::/, $self->namespace),
        $self->schema_name,
        $self->result_namespace,
        'Result',
        $name . '.pm'
    );

    return '' if !-f $path;

    return $self->_custom_code( $path );
}

sub _custom_code {
    my ($self, $path) = @_;

    my $content = do { local (@ARGV, $/) = $path; <> };

    my ($code) = $content =~ m{
        ^[#] \s+ --- \s*
        ^[#] \s+ Put \s+ your \s+ own \s+ code \s+ below \s+ this \s+ comment \s*
        ^[#] \s+ --- \s*
        (.*?) \s+
        ^[#] \s+ --- \s*
    }xms;

    return $code;
}

sub _write_files{
    my ($self, %files) = @_;

    for my $package ( keys %files ){
        my @path;
        push @path, $self->output_path if $self->output_path;
        push @path, split /::/, $package;
        my $file = pop @path;
        my $dir  = File::Spec->catdir( @path );

        if( !-e $dir ){
            make_path( $dir ) or croak "Cannot create directory $dir";
        }

        if( open my $fh, '>', $dir . '/' . $file . '.pm' ){
            if ( $self->utf8 ) {
                binmode $fh, ':encoding(utf-8)';
            }

            print $fh $files{$package};
            close $fh;
        }
        else{
            croak "Couldn't create $file.pm: $!";
        }
    }
}

sub _has_many_template{
    my ($self, $to, $rels) = @_;

    my $name                 = $to;
    my ($to_class, $package) = $self->_create_class_and_package_name( $to );

    if ( defined $self->remove_table_prefix ) {
        my $prefix = $self->remove_table_prefix;
        $name      =~ s{\A\Q$prefix\E}{};
    }

    my %has_many_rels;
    my $counter = 1;

    my $string = '';
    for my $field ( @{ $rels || [] } ) {
        my $me_field      = $field->{foreign};
        my $foreign_field = $field->{me};

        my $temp_field = $self->has_many_prefix . $name;



( run in 0.645 second using v1.01-cache-2.11-cpan-39bf76dae61 )