X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FVersioned.pm;h=1a26e2d7400cf2656cc854a38d140c99f15a290e;hb=3e82fc271c93bb64a0d5f5c159f34e3933890f2a;hp=6ded2fbbd4c7cf181fba824e77791ab35459105c;hpb=e84a43c14a0804314245c9cf872d7af9366efc96;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Schema/Versioned.pm b/lib/DBIx/Class/Schema/Versioned.pm index 6ded2fb..1a26e2d 100644 --- a/lib/DBIx/Class/Schema/Versioned.pm +++ b/lib/DBIx/Class/Schema/Versioned.pm @@ -100,7 +100,7 @@ not found then no upgrade is possible. NB: At the moment, only SQLite and MySQL are supported. This is due to spotty behaviour in the SQL::Translator producers, please help us by -enhancing them. Ask on the mailing list or IRC channel for details (details +enhancing them. Ask on the mailing list or IRC channel for details (community details in L). =head1 GETTING STARTED @@ -235,7 +235,7 @@ sub install if ($new_version) { # create versions table and version row $self->{vschema}->deploy; - $self->_set_db_version; + $self->_set_db_version({ version => $new_version }); } } @@ -251,6 +251,27 @@ sub deploy { $self->install(); } +=head2 create_upgrade_path + +=over 4 + +=item Arguments: { upgrade_file => $file } + +=back + +Virtual method that should be overriden to create an upgrade file. +This is useful in the case of upgrading across multiple versions +to concatenate several files to create one upgrade file. + +You'll probably want the db_version retrieved via $self->get_db_version +and the schema_version which is retrieved via $self->schema_version + +=cut + +sub create_upgrade_path { + ## override this method +} + =head2 upgrade Call this to attempt to upgrade your database from the version it is at to the version @@ -294,11 +315,15 @@ sub upgrade $db_version, ); + $self->create_upgrade_path({ upgrade_file => $upgrade_file }); + unless (-f $upgrade_file) { warn "Upgrade not possible, no upgrade file found ($upgrade_file), please create one\n"; return; } + warn "\nDB version ($db_version) is lower than the schema version (".$self->schema_version."). Attempting upgrade.\n"; + # backup if necessary then apply upgrade $self->_filedata($self->_read_sql_file($upgrade_file)); $self->backup() if($self->do_backup); @@ -350,13 +375,26 @@ sub run_upgrade for (@statements) { $self->storage->debugobj->query_start($_) if $self->storage->debug; - $self->storage->dbh->do($_) or warn "SQL was:\n $_"; + $self->apply_statement($_); $self->storage->debugobj->query_end($_) if $self->storage->debug; } return 1; } +=head2 apply_statement + +Takes an SQL statement and runs it. Override this if you want to handle errors +differently. + +=cut + +sub apply_statement { + my ($self, $statement) = @_; + + $self->storage->dbh->do($_) or warn "SQL was:\n $_"; +} + =head2 get_db_version Returns the version that your database is currently at. This is determined by the values in the @@ -481,9 +519,9 @@ sub _create_db_to_schema_diff { return; } - eval 'require SQL::Translator "0.09"'; + eval 'require SQL::Translator "0.09003"'; if ($@) { - $self->throw_exception("SQL::Translator 0.09 required"); + $self->throw_exception("SQL::Translator 0.09003 required"); } my $db_tr = SQL::Translator->new({ @@ -495,7 +533,6 @@ sub _create_db_to_schema_diff { $db_tr->producer($db); my $dbic_tr = SQL::Translator->new; $dbic_tr->parser('SQL::Translator::Parser::DBIx::Class'); - $dbic_tr = $self->storage->configure_sqlt($dbic_tr, $db); $dbic_tr->data($self); $dbic_tr->producer($db); @@ -533,9 +570,12 @@ sub _create_db_to_schema_diff { sub _set_db_version { my $self = shift; + my ($params) = @_; + $params ||= {}; + my $version = $params->{version} ? $params->{version} : $self->schema_version; my $vtable = $self->{vschema}->resultset('Table'); - $vtable->create({ version => $self->schema_version, + $vtable->create({ version => $version, installed => strftime("%Y-%m-%d %H:%M:%S", gmtime()) });