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 )