Alzabo

 view release on metacpan or  search on metacpan

eg/convert.pl  view on Meta::CPAN

#!/usr/bin/perl -w

use strict;

use Alzabo::Create;
use ExtUtils::MakeMaker qw(prompt);
use Getopt::Long;

my $V = $Alzabo::VERSION;

use vars qw($name);

unless (@ARGV)
{
    @ARGV = Alzabo::Config::available_schemas();
    print "No arguments given.  Converting all schemas\n\n";
}

my @eval;
foreach my $s_name (@ARGV)
{
    @eval = ();

    my $s = Alzabo::Create::Schema->load_from_file( name => $s_name );

    push @eval, "use strict;\n\nuse Alzabo::Create::Schema;\n\n";

    push @eval, "my (\$t, \$d);\n";

    dump_schema($s, 'schema');

    push @eval, "\$schema->save_to_file;\n";

    print <<"EOF";

The code necessary to recreate the $s_name schema has been created.

EOF

    save_schema($s_name);
}

sub dump_schema
{
    my $s = shift;
    local $name = shift;
    my $recursed = shift;

    push @eval, "my \$$name = Alzabo::Create::Schema->new(";
    my $n = $s->name;
    $n =~ s/'/\\'/g;
    push @eval, "\tname => '$n',";

    my $rdbms;

    if ($V > 0.20)
    {
	$rdbms = $s->rules->rules_id;
    }
    else
    {
	($rdbms) = (split /::/, ref $s->rules)[2];
    }
    push @eval, "\trdbms => '$rdbms',";

    push @eval, ");\n";

eg/convert.pl  view on Meta::CPAN

    foreach my $key ( $V < 0.25 ? qw( column_from column_to ) : qw( columns_from columns_to ) )
    {
	my ($table, $columns);
	if ( $V < 0.25 )
	{
	    $table = $fk->$key()->table->name;
	    $columns = $fk->$key()->name;
	    $columns = "'$columns'";
	}
	else
	{
	    $table = ($fk->$key())[0]->table->name;
	    $columns = join ', ', map { "'$_'" } map { $_->name } $fk->$key();
	}

	$key =~ s/_/s_/ if $V < 0.25;
	push @eval, "\t$key => [ \$$name\->table('$table')->columns($columns) ],";
    }

    my ($cardinality, $from_is_dependent, $to_is_dependent);
    if ($V < 0.52)
    {
	# reverses cardinality for older schemas
	$cardinality = join ', ', map { $_ =~ /\D/ ? "'$_'" : $_ } ($fk->min_max_to)[1], ($fk->min_max_from)[1];
	$from_is_dependent = ($fk->min_max_from)[0] ? 1 : 0;
	$to_is_dependent = ($fk->min_max_to)[0] ? 1 : 0;
    }
    else
    {
	$cardinality = join ', ', $fk->cardinality;
	$from_is_dependent = $fk->from_is_dependent ? 1 : 0;
	$to_is_dependent = $fk->to_is_dependent ? 1 : 0;
    }

    push @eval, "\tcardinality => [ $cardinality ],";
    push @eval, "\tfrom_is_dependent => $from_is_dependent,";
    push @eval, "\tto_is_dependent => $to_is_dependent,";

    push @eval, ");\n";

    $fk{$id1} = $fk{$id2} = 1;
}

sub dump_column_ownership
{
    my $c = shift;

    return if $c eq $c->definition->owner;

    my $table = $c->table->name;
    my $column = $c->name;
    my $owner = $c->definition->owner->name;
    my $owner_table = $c->definition->owner->table->name;
    push @eval, "\$d = \$$name\->table('$owner_table')->column('$owner')->definition;";
    push @eval, "\$$name\->table('$table')->column('$column')->set_definition( \$d );\n";
}

sub save_schema
{
    my $s_name = shift;
    my $file = prompt( "File to which schema should be written?", "${s_name}_schema.pl" );

    local *S;
    open S, ">$file" or die "Cannot open file '$file': $!\n";
    unless ( print S (join "\n", @eval) ) { die "Cannot write to file '$file': $!\n"; }
    close S or die "Cannot close file '$file': $!\n";

    print <<"EOF";
The schema has been saved to $file.

To use this file, you will first have to install the version of Alzabo
that includes this script.  Then you can simply run:

 $^X $file

This will overwrite the existing files for the $s_name schema

EOF
}



( run in 1.664 second using v1.01-cache-2.11-cpan-6aa56a78535 )