Ambrosia

 view release on metacpan or  search on metacpan

share/Managers/buildXml.pm  view on Meta::CPAN

    Context->repository->set( config => {
            name     => config->ID,
            label    => config->Label,
            charset  => lc(config->Charset || 'utf-8'),
            hostname => config->hostname || $hostname,

            ServerName => config->ServerName,
            ServerPort => config->ServerPort,

            ProjectPath => abs_path($path_to_app),
            PerlLibPath => join(' ', map {abs_path($_)} split /\s+/, config->PerlLibPath),
        } );
    Context->repository->set( Message => $message );
}

sub getDataSource
{
    my $t = shift;
    my $sn = shift;
    if ( ref config->data_source->{$t} eq 'ARRAY' )
    {
        foreach ( @{config->data_source->{$t}} )
        {
            return $_ if $_->{source_name} eq $sn;
        }
        throw Ambrosia::error::Exception::BadParams "Error: cannot find in config data_source source_name=$sn in type = $t";
    }
    elsif( config->data_source->{$t}->{source_name} eq $sn )
    {
        return config->data_source->{$t};
    }
    else
    {
        throw Ambrosia::error::Exception::BadParams "Error: cannot find in config data_source source_name=$sn in type = $t";
    }
}

sub processDataSource
{
    my $driver = shift;
    my $type = shift;
    my $source_name = shift;
    my $self = shift;

    my $schema_list = Context->repository->get( 'schema_list' );
    my $schema = {type => $type,
                  ($driver->catalog ? (catalog => $driver->catalog) : ()),
                  schema => $driver->schema,
                  tables => [],
                  config => {} };
    push @$schema_list, $schema;

    my $ds = getDataSource($type, $source_name);

    $schema->{config} = {
        db_engine   => $ds->{engine_name},
        db_source   => $source_name,
        db_params   => $ds->{engine_params},
        db_user     => $ds->{user},
        db_password => $ds->{password},
        db_charset  => (config->data_source_info->{$type}->{$source_name}->{charset} || 'utf8'),
    };

    my $tables = table_info($driver);
    my %hTables = ();

    my %foreign_keys = ();
    foreach ( @{foreign_key_info($driver)} )
    {
        push @{$foreign_keys{$_->{pktable_name}}}, {
            fktable_name => $_->{fktable_name},
            pkcolumn_name => $_->{pkcolumn_name},
            fkcolumn_name => $_->{fkcolumn_name},
            key_seq       => $_->{key_seq},
        };
    }

    foreach my $t ( @$tables )
    {
        my %primary_keys = ();
        foreach ( @{primary_key_info($driver, $t->{table_name})} )
        {
            $primary_keys{$_->{column_name}} = $_->{key_seq};
        }
        my $hasPK = scalar keys %primary_keys;

        my %table = (tId => $self->__tableIdInc++);
        $table{type} = uc $t->{table_type};
        $table{name} = $t->{table_name};
        if ( my $has_one = $foreign_keys{$table{name}} )
        {
            $table{has_one} = $has_one;
        }

        if ( $hasPK == 1 )
        {
            $table{AUTO_UNIQUE_VALUE} = scalar keys %primary_keys == 1;
            $table{KEY} = 1;
        }
        elsif( $hasPK )
        {
            $table{KEY} = 1;
        }
        elsif( $table{has_one} )
        {
            $table{KEY} = 1;
        }

        my $columns = column_info($driver, $t->{table_name});
        my $tablePK = 0;
        $table{column} = [ map {
                my $cn = $_->{column_name};
                my $h = {
                    Default => $_->{column_def}||'',
                    Size    => $_->{column_size}||'',
                    Name    => $_->{column_name}||'',
                    Remarks => $_->{remarks}||'',
                    DecimalDigits => $_->{decimal_digits}||'',
                    IsNullable    => $_->{is_nullable}||'',
                    Type     => $_->{type_name}||'',
                };



( run in 1.344 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )