use base 'DBIx::Class';
use POSIX 'strftime';
use Data::Dumper;
-# use DBIx::Class::Version;
__PACKAGE__->mk_classdata('_filedata');
__PACKAGE__->mk_classdata('upgrade_directory');
+__PACKAGE__->mk_classdata('backup_directory');
sub on_connect
{
my ($self) = @_;
-# print "on_connect\n";
my $vschema = DBIx::Class::Version->connect(@{$self->storage->connect_info()});
my $vtable = $vschema->resultset('Table');
my $pversion;
+
if(!$self->exists($vtable))
{
-# print "deploying.. \n";
- $vschema->storage->debug(1);
-# print "Debugging is: ", $vschema->storage->debug, "\n";
+# $vschema->storage->debug(1);
+ $vschema->storage->ensure_connected();
$vschema->deploy();
$pversion = 0;
}
return 1;
}
-
- $vtable->create({ Version => $self->VERSION,
- Installed => strftime("%Y-%m-%d %H:%M:%S", gmtime())
- });
+## use IC::DT?
if(!$pversion)
{
- warn "No previous version found, skipping upgrade\n";
+ $vtable->create({ Version => $self->VERSION,
+ Installed => strftime("%Y-%m-%d %H:%M:%S", gmtime())
+ });
+ ## If we let the user do this, where does the Version table get updated?
+ warn "No previous version found, calling deploy to install this version.\n";
+ $self->deploy();
return 1;
}
-# $self->create_upgrades($self->upgrade_directoy, $pversion, $self->VERSION);
-
- my $file = $self->ddl_filename($self->upgrade_directory,
+ my $file = $self->ddl_filename(
$self->storage->sqlt_type,
+ $self->upgrade_directory,
$self->VERSION
);
if(!$file)
return 1;
}
- $file =~ s/@{[ $self->VERSION ]}/"${pversion}-" . $self->VERSION/e;
+ $file = $self->ddl_filename(
+ $self->storage->sqlt_type,
+ $self->upgrade_directory,
+ $self->VERSION,
+ $pversion,
+ );
+# $file =~ s/@{[ $self->VERSION ]}/"${pversion}-" . $self->VERSION/e;
if(!-f $file)
{
warn "Upgrade not possible, no upgrade file found ($file)\n";
return;
}
-# print "Found Upgrade file: $file\n";
+
my $fh;
open $fh, "<$file" or warn("Can't open upgrade file, $file ($!)");
my @data = split(/;\n/, join('', <$fh>));
close($fh);
@data = grep { $_ && $_ !~ /^-- / } @data;
@data = grep { $_ !~ /^(BEGIN TRANACTION|COMMIT)/m } @data;
-# print "Commands: ", join("\n", @data), "\n";
- $self->_filedata(\@data);
- $self->backup();
- $self->upgrade($pversion, $self->VERSION);
+ $self->_filedata(\@data);
+ ## Don't do this yet, do only on command?
+ ## If we do this later, where does the Version table get updated??
+ warn "Versions out of sync. This is " . $self->VERSION .
+ ", your database contains version $pversion, please call upgrade on your Schema.\n";
+# $self->upgrade($pversion, $self->VERSION);
}
sub exists
{
my ($self, $rs) = @_;
- eval {
+ my $c = eval {
$rs->search({ 1, 0 })->count;
};
- return 0 if $@;
+ return 0 if $@ || !defined $c;
return 1;
}
{
my ($self) = @_;
## Make each ::DBI::Foo do this
- $self->storage->backup();
+ $self->storage->backup($self->backup_directory());
}
sub upgrade
## overridable sub, per default just run all the commands.
+ $self->backup();
+
$self->run_upgrade(qr/create/i);
$self->run_upgrade(qr/alter table .*? add/i);
$self->run_upgrade(qr/alter table .*? (?!drop)/i);
$self->run_upgrade(qr/alter table .*? drop/i);
$self->run_upgrade(qr/drop/i);
- $self->run_upgrade(qr//i);
+# $self->run_upgrade(qr//i);
+
+ my $vschema = DBIx::Class::Version->connect(@{$self->storage->connect_info()});
+ my $vtable = $vschema->resultset('Table');
+ $vtable->create({ Version => $self->VERSION,
+ Installed => strftime("%Y-%m-%d %H:%M:%S", gmtime())
+ });
}
return 1;
}
+1;
+
=head1 NAME
DBIx::Class::Versioning - DBIx::Class::Schema plugin for Schema upgrades
__PACKAGE__->load_components(qw/+DBIx::Class::Schema::Versioned/);
__PACKAGE__->upgrade_directory('/path/to/upgrades/');
+ __PACKAGE__->backup_directory('/path/to/backups/');
sub backup
{
path between the two versions supplied. By default, every change in
your VERSION is regarded as needing an upgrade.
+The actual upgrade is called manually by calling C<upgrade> on your
+schema object. Code is run at connect time to determine whether an
+upgrade is needed, if so, a warning "Versions out of sync" is
+produced.
+
NB: At the moment, SQLite upgrading is rather spotty, as SQL::Translator::Diff
returns SQL statements that SQLite does not support.
This method should return the name of the backup file, if appropriate.
+C<backup> is called from C<upgrade>, make sure you call it, if you write your
+own <upgrade> method.
+
=head2 upgrade
This is an overwritable method used to run your upgrade. The freeform method
C<upgrade> method, running whichever commands you specify via the
regex in the parameter.
+=head2 upgrade_directory
+
+Use this to set the directory your upgrade files are stored in.
+
+=head2 backup_directory
+
+Use this to set the directory you want your backups stored in.
+
=head1 AUTHOR
Jess Robinson <castaway@desert-island.demon.co.uk>