Alzabo

 view release on metacpan or  search on metacpan

lib/Alzabo/Create/Schema.pm  view on Meta::CPAN

sub sync_backend
{
    my $self = shift;
    my %p = @_;

    local $self->{db_schema_name} = delete $p{schema_name}
        if exists $p{schema_name};

    unless ( $self->_has_been_instantiated(%p) )
    {
        $self->set_instantiated(0);
        return $self->create(%p);
    }

    $self->{driver}->connect(%p);

    foreach my $statement ( $self->sync_backend_sql(%p) )
    {
        $self->driver->do( sql => $statement );
    }

    $self->save_current_name;

    $self->set_instantiated(1);
    my $driver = delete $self->{driver};
    $self->{original} = Storable::dclone($self);
    $self->{driver} = $driver;
    delete $self->{original}{original};
}

sub drop
{
    my $self = shift;
    my %p = @_;

    local $self->{db_schema_name} = delete $p{schema_name}
        if exists $p{schema_name};

    $self->{driver}->drop_database(%p);
    $self->set_instantiated(0);
}

sub delete
{
    my $self = shift;
    my %p = @_;

    my $name = $p{name} || $self->name;

    my $schema_dir = File::Spec->catdir( Alzabo::Config::schema_dir(), $name );

    my $dh = do { local *DH; };
    opendir $dh, $schema_dir
        or system_exception "Unable to open $schema_dir directory: $!";

    foreach my $f ( grep { /\.alz|\.rdbms|\.version/ } readdir $dh )
    {
        my $file = File::Spec->catfile( $schema_dir, $f );
        next unless -f $file;

        # untaint
        ($file) = $file =~ /^(.+)$/;

        unlink $file
            or system_exception "Unable to delete $file: $!";
    }
    closedir $dh
        or system_exception "Unable to close $schema_dir: $!";

    rmdir $schema_dir
        or system_exception "Unable to delete $schema_dir: $!";
}

sub is_saved
{
    my $self = shift;

    my %p = @_;

    my $name = $p{name} || $self->name;

    my $schema_dir = File::Spec->catdir( Alzabo::Config::schema_dir(), $name );

    return -d $schema_dir;
}

sub save_to_file
{
    my $self = shift;

    my $schema_dir = File::Spec->catdir( Alzabo::Config::schema_dir(), $self->{name} );
    unless (-e $schema_dir)
    {
        mkdir $schema_dir, 0775
            or system_exception "Unable to make directory $schema_dir: $!";
    }

    my $create_save_name = $self->_base_filename( $self->{name} ) . '.create.alz';

    my $fh = do { local *FH; };
    open $fh, ">$create_save_name"
        or system_exception "Unable to write to $create_save_name: $!\n";

    my $driver = delete $self->{driver};
    Storable::nstore_fd( $self, $fh )
        or system_exception "Can't store to filehandle";

    $self->{driver} = $driver;
    close $fh
        or system_exception "Unable to close $create_save_name: $!";

    my $rdbms_save_name = $self->_base_filename( $self->{name} ) . '.rdbms';

    open $fh, ">$rdbms_save_name"
        or system_exception "Unable to write to $rdbms_save_name: $!\n";

    print $fh $self->{driver}->driver_id
        or system_exception "Can't write to $rdbms_save_name: $!";
    close $fh
        or system_exception "Unable to close $rdbms_save_name: $!";



( run in 1.960 second using v1.01-cache-2.11-cpan-ceb78f64989 )