Thanks for the plug ;)
If you're using Alzabo to manage your schema structure then using it as part of an install/update process is trivial. Here's some sample code from a Module::Build subclass I wrote:
sub ACTION_update_db
{
$_[0]->_update_db;
}
sub _update_db
{
my $self = shift;
$self->depends_on('install');
require Alzabo::Create::Schema;
my $schema_svn_dir =
File::Spec->catdir
( $self->base_dir,
'alzabo-schema-files',
'NameOfSchema' );
my $to_dir =
File::Spec->catdir
( Alzabo::Config::schema_dir(),
'NameOfSchema' );
my $copied;
foreach my $file
( glob File::Spec->catfile
( $schema_svn_dir, 'NameOfSchema.*' ) )
{
my $file =
$self->copy_if_modified( from => $file,
to_dir => $to_dir,
flatten => 1,
);
$copied = $file if defined $file;
}
return unless $copied;
require Alzabo::Create::Schema;
my $s =
Alzabo::Create::Schema->load_from_file
( name => 'NameOfSchema' );
my %connect = ( user => 'username',
password => 'password',
);
if ( grep { /NameOfSchema/ }
$s->driver->schemas(%connect) )
{
# This makes the live schema in the database look
# like the schema stored in the Alzabo data files.
$s->sync_backend(%connect);
}
else
{
$s->set_instantiated(0);
$s->create(%connect);
}
}
This code can be run as its own action (./Build update_db), and it's also run when the install action is run. It's pretty darn convenient.
|