Mercurial > pub > Impl
diff Lib/Deployment/Batch/CDBIUpdate.pm @ 49:16ada169ca75
migrating to the Eclipse IDE
author | wizard@linux-odin.local |
---|---|
date | Fri, 26 Feb 2010 10:49:21 +0300 |
parents | 03e58a454b20 |
children | 76515373dac0 |
line wrap: on
line diff
--- a/Lib/Deployment/Batch/CDBIUpdate.pm Fri Feb 26 01:43:42 2010 +0300 +++ b/Lib/Deployment/Batch/CDBIUpdate.pm Fri Feb 26 10:49:21 2010 +0300 @@ -1,139 +1,139 @@ -use strict; -package Deployment::Batch::CDBIUpdate; -use Common; -use base qw(Deployment::Batch::Generic); - -use DBI; -use Schema::DataSource; -use Schema::DataSource::CDBIBuilder; - - -BEGIN { - DeclareProperty DataSchemaFile => ACCESS_READ; - DeclareProperty DataSourceDir => ACCESS_READ; - DeclareProperty DSNamespace => ACCESS_READ; - DeclareProperty DBConnection => ACCESS_READ; - DeclareProperty DBTraitsClass => ACCESS_READ; - DeclareProperty SchemaPrev => ACCESS_READ; -} - -sub CTOR { - my ($this,%args) = @_; - - $this->{$DataSchemaFile} = $args{'Source'} or die new Exception('A data shema file is required'); - $this->{$DataSourceDir} = $args{'Output'} or die new Exception('A directory for a data source is required'); - $this->{$DSNamespace} = $args{'Namespace'} || 'DataSource'; - $this->{$DBTraitsClass} = $args{'DBTraits'} or die new Exception('A DBTraitsClass is required'); - - (my $modname = $args{'DBTraits'}.'.pm') =~ s/::/\//g; - $this->Log("Loading DBTraits '$modname'"); - require $modname; -} - -sub Run { - my ($this) = @_; - - $this->{$DBConnection} = $this->Context->{Connection}; - - my $prefix = $this->{$DSNamespace}.'::'; - - my $schemaDS = new Schema::DataSource(DataSourceBuilder => new Schema::DataSource::CDBIBuilder); - $schemaDS->BuildSchema($this->{$DataSchemaFile}); - - my $schemaDB = $schemaDS->DataSourceBuilder->BuildDBSchema(); - (my $fname = $this->{$DataSourceDir}.$this->{$DSNamespace}.'.pm') =~ s/::/\//g; - - # we are in the immediate mode, so the file will be backupped immediatelly; - $this->Log("Backup $fname"); - Deployment::Batch->Backup( File => $fname ); - - $this->Log("Write the datasource '$this->{$DSNamespace}' to '$this->{$DataSourceDir}'"); - $schemaDS->DataSourceBuilder->WriteModules($fname,$prefix); - - if ($this->{$DBConnection}) { - $this->Log("Update the database '$this->{$DBConnection}[0]'"); - - $this->{$SchemaPrev} = $this->UpdateDBToSchema($schemaDB); - - } - $schemaDB->Dispose; -} - -sub Rollback { - my ($this) = @_; - - if ($this->{$SchemaPrev}) { - $this->Log("Rallback the DB schema"); - $this->UpdateDBToSchema($this->{$SchemaPrev})->Dispose; - $this->{$SchemaPrev}->Dispose; - delete $this->{$SchemaPrev}; - } - -} - -sub UpdateDBToSchema { - my ($this,$schemaDB) = @_; - my $dbh = DBI->connect(@{$this->{$DBConnection}}) or die new Exception('Failed to connect to the database',@{$this->{$DBConnection}}); - my $SchemaSource; - - if (UNIVERSAL::can($this->{$DBTraitsClass},'GetMetaTable')) { - $SchemaSource = new Deployment::CDBI::SQLSchemeSource (MetaTable => $this->{$DBTraitsClass}->GetMetaTable($dbh)); - } else { - die new Exception("Can't get a meta table",$this->{$DBTraitsClass}); - } - - my $schemaDBOld = $SchemaSource->ReadSchema($schemaDB->Name); - - my $updater = $this->{$DBTraitsClass}->new(SrcSchema => $schemaDBOld, DstSchema => $schemaDB); - $updater->UpdateSchema(); - - $dbh->do($_) or die new Exception('Failed to execute the sql statement', $_) foreach $updater->Handler->Sql; - - $SchemaSource->SaveSchema($schemaDB); - return $schemaDBOld; -} - -sub DESTROY { - my $this = shift; - - $this->{$SchemaPrev}->Dispose if $this->{$SchemaPrev}; -} - -package Deployment::CDBI::SQLSchemeSource; -use Common; -use Data::Dumper; -use MIME::Base64; -use Storable qw(nstore_fd fd_retrieve); -our @ISA = qw(Object); - -BEGIN { - DeclareProperty MetaTable => ACCESS_NONE; -} - -sub ReadSchema { - my ($this,$name) = @_; - - my $schema = decode_base64($this->{$MetaTable}->ReadProperty("db_schema_$name")); - if ($schema) { - open my $hvar,"<",\$schema or die new Exception("Failed to create a handle to the variable"); - return fd_retrieve($hvar); - } else { - return new Schema::DB(Name => $name, Version => 0); - } -} - -sub SaveSchema { - my ($this,$schema) = @_; - - my $name = $schema->Name; - - my $data = ""; - { - open my $hvar,">",\$data or die new Exception("Failed to create a handle to the variable"); - nstore_fd($schema,$hvar); - } - - $this->{$MetaTable}->SetProperty("db_schema_$name",encode_base64($data)); -} - -1; \ No newline at end of file +use strict; +package Deployment::Batch::CDBIUpdate; +use Common; +use base qw(Deployment::Batch::Generic); + +use DBI; +use Schema::DataSource; +use Schema::DataSource::CDBIBuilder; + + +BEGIN { + DeclareProperty DataSchemaFile => ACCESS_READ; + DeclareProperty DataSourceDir => ACCESS_READ; + DeclareProperty DSNamespace => ACCESS_READ; + DeclareProperty DBConnection => ACCESS_READ; + DeclareProperty DBTraitsClass => ACCESS_READ; + DeclareProperty SchemaPrev => ACCESS_READ; +} + +sub CTOR { + my ($this,%args) = @_; + + $this->{$DataSchemaFile} = $args{'Source'} or die new Exception('A data shema file is required'); + $this->{$DataSourceDir} = $args{'Output'} or die new Exception('A directory for a data source is required'); + $this->{$DSNamespace} = $args{'Namespace'} || 'DataSource'; + $this->{$DBTraitsClass} = $args{'DBTraits'} or die new Exception('A DBTraitsClass is required'); + + (my $modname = $args{'DBTraits'}.'.pm') =~ s/::/\//g; + $this->Log("Loading DBTraits '$modname'"); + require $modname; +} + +sub Run { + my ($this) = @_; + + $this->{$DBConnection} = $this->Context->{Connection}; + + my $prefix = $this->{$DSNamespace}.'::'; + + my $schemaDS = new Schema::DataSource(DataSourceBuilder => new Schema::DataSource::CDBIBuilder); + $schemaDS->BuildSchema($this->{$DataSchemaFile}); + + my $schemaDB = $schemaDS->DataSourceBuilder->BuildDBSchema(); + (my $fname = $this->{$DataSourceDir}.$this->{$DSNamespace}.'.pm') =~ s/::/\//g; + + # we are in the immediate mode, so the file will be backupped immediatelly; + $this->Log("Backup $fname"); + Deployment::Batch->Backup( File => $fname ); + + $this->Log("Write the datasource '$this->{$DSNamespace}' to '$this->{$DataSourceDir}'"); + $schemaDS->DataSourceBuilder->WriteModules($fname,$prefix); + + if ($this->{$DBConnection}) { + $this->Log("Update the database '$this->{$DBConnection}[0]'"); + + $this->{$SchemaPrev} = $this->UpdateDBToSchema($schemaDB); + + } + $schemaDB->Dispose; +} + +sub Rollback { + my ($this) = @_; + + if ($this->{$SchemaPrev}) { + $this->Log("Rallback the DB schema"); + $this->UpdateDBToSchema($this->{$SchemaPrev})->Dispose; + $this->{$SchemaPrev}->Dispose; + delete $this->{$SchemaPrev}; + } + +} + +sub UpdateDBToSchema { + my ($this,$schemaDB) = @_; + my $dbh = DBI->connect(@{$this->{$DBConnection}}) or die new Exception('Failed to connect to the database',@{$this->{$DBConnection}}); + my $SchemaSource; + + if (UNIVERSAL::can($this->{$DBTraitsClass},'GetMetaTable')) { + $SchemaSource = new Deployment::CDBI::SQLSchemeSource (MetaTable => $this->{$DBTraitsClass}->GetMetaTable($dbh)); + } else { + die new Exception("Can't get a meta table",$this->{$DBTraitsClass}); + } + + my $schemaDBOld = $SchemaSource->ReadSchema($schemaDB->Name); + + my $updater = $this->{$DBTraitsClass}->new(SrcSchema => $schemaDBOld, DstSchema => $schemaDB); + $updater->UpdateSchema(); + + $dbh->do($_) or die new Exception('Failed to execute the sql statement', $_) foreach $updater->Handler->Sql; + + $SchemaSource->SaveSchema($schemaDB); + return $schemaDBOld; +} + +sub DESTROY { + my $this = shift; + + $this->{$SchemaPrev}->Dispose if $this->{$SchemaPrev}; +} + +package Deployment::CDBI::SQLSchemeSource; +use Common; +use Data::Dumper; +use MIME::Base64; +use Storable qw(nstore_fd fd_retrieve); +our @ISA = qw(Object); + +BEGIN { + DeclareProperty MetaTable => ACCESS_NONE; +} + +sub ReadSchema { + my ($this,$name) = @_; + + my $schema = decode_base64($this->{$MetaTable}->ReadProperty("db_schema_$name")); + if ($schema) { + open my $hvar,"<",\$schema or die new Exception("Failed to create a handle to the variable"); + return fd_retrieve($hvar); + } else { + return new Schema::DB(Name => $name, Version => 0); + } +} + +sub SaveSchema { + my ($this,$schema) = @_; + + my $name = $schema->Name; + + my $data = ""; + { + open my $hvar,">",\$data or die new Exception("Failed to create a handle to the variable"); + nstore_fd($schema,$hvar); + } + + $this->{$MetaTable}->SetProperty("db_schema_$name",encode_base64($data)); +} + +1;