Changeset 14975 for lang/perl/Archer
- Timestamp:
- 07/01/08 10:48:45 (5 months ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/Archer/trunk/lib/Archer/Plugin/MySQLDiff/Sledge.pm
r11268 r14975 3 3 use warnings; 4 4 use base qw/Archer::Plugin/; 5 use SQL::Translator; 6 use SQL::Translator::Diff; 7 use SQL::Translator::Parser::MySQL; 8 use Path::Class; 5 use MySQL::Diff; 9 6 10 7 sub run { … … 12 9 13 10 my $config = "$self->{project}::Config"; 14 $config->use or die $@; 11 $config->use or die; 12 15 13 return unless $config->can('_new_instance'); 16 14 17 my $src = $self->_src_schema; 15 my $dev = $self->_db($config->_new_instance->datasource); 16 local $ENV{SLEDGE_CONFIG_NAME} = '_product'; 17 my $product = $self->_db($config->_new_instance->datasource); 18 18 19 local $ENV{SLEDGE_CONFIG_NAME} = '_product'; 20 my $production = $self->_production_db($config->_new_instance->{datasource}); 21 22 my $diff = SQL::Translator::Diff->new( 23 { 24 output_db => 'MySQL', 25 source_schema => $src, 26 target_schema => $production, 27 target_db => 'MySQL', 28 no_batch_alters => 1, 29 } 30 )->compute_differences->produce_diff_sql; 31 32 print STDERR $diff; 19 print MySQL::Diff::diff_dbs({}, $product, $dev); 33 20 } 34 21 35 sub _src_schema { 36 my $self = shift; 37 my $work_dir = Archer->context->{ config }->{ global }->{ work_dir }; 22 sub _db { 23 my ($self, $drv, $user, $pass) = @_; 38 24 39 my $ src = file( $work_dir, $self->{project}, $self->l_project, 'db', 'schema.sql' )->slurp;40 $src =~ s/\s+COMMENT\s+['"][^'"]+['"]\s*//gi; # SQL::Translator cannot parse comments.25 my $db = ($drv =~ /^dbi:[^:]+:([^:;=]+)/) ? $1 : ''; 26 my $host = ($drv =~ /hostname=([a-zA-Z_0-9.]+)/) ? $1 : ''; 41 27 42 my $t = SQL::Translator->new(); 43 $t->parser('SQL::Translator::Parser::MySQL'); 44 $t->translate( \$src ); 45 46 my $schema = $t->schema; 47 $schema->name('schema.sql'); 48 $schema; 49 } 50 51 sub _production_db { 52 my ($self, $dsn) = @_; 53 54 if ( scalar @$dsn == 4 ) { 55 pop @$dsn; # dbic stuff 56 } 57 58 my $dbh = DBI->connect( 59 @$dsn, 60 { 61 RaiseError => 1, 62 FetchHashKeyName => 'NAME_lc', 63 } 28 return MySQL::Database->new( 29 auth => 30 { user => $user, password => $pass, host => $host }, 31 db => $db, 64 32 ); 65 66 my $t = SQL::Translator->new(67 parser => 'DBI',68 no_comments => 1,69 parser_args => {70 dbh => $dbh,71 }72 );73 $t->translate;74 75 my $schema = $t->schema or die $t->error;76 $schema->name($dsn->[0]);77 $schema;78 33 } 79 34
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)