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 )