X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator.pm;h=55b555d3aba99d69024245109584be32bfd432d6;hb=857ab1c2fe0f14539cc17291384da15abee0be54;hp=4e6c57fbaf87a998668d211665eb95794c32e7cb;hpb=ee1a2ac9cd4f7611c7ff4d63fa0e81a7de356e64;p=dbsrgits%2FSQL-Translator-2.0-ish.git diff --git a/lib/SQL/Translator.pm b/lib/SQL/Translator.pm index 4e6c57f..55b555d 100644 --- a/lib/SQL/Translator.pm +++ b/lib/SQL/Translator.pm @@ -1,7 +1,7 @@ use MooseX::Declare; class SQL::Translator { use TryCatch; - use MooseX::Types::Moose qw(Bool HashRef Str); + use MooseX::Types::Moose qw(Bool HashRef Int Str Undef); use SQL::Translator::Types qw(DBIHandle Parser Producer Schema); use SQL::Translator::Object::Schema; @@ -40,23 +40,28 @@ class SQL::Translator { has 'schema' => ( isa => Schema, is => 'rw', - default => sub { SQL::Translator::Object::Schema->new } + lazy => 1, + default => sub { SQL::Translator::Object::Schema->new }, ); has 'parser_args' => ( isa => HashRef, is => 'rw', + predicate => 'has_parser_args', ); has 'producer_args' => ( isa => HashRef, is => 'rw', + predicate => 'has_producer_args', ); has 'add_drop_table' => (isa => Bool, is => 'rw', default => 0); has 'no_comments' => (isa => Bool, is => 'rw', default => 0); has 'show_warnings' => (isa => Bool, is => 'rw', default => 1); has 'trace' => (isa => Bool, is => 'rw', default => 0); + has 'quote_table_names' => (isa => Bool, is => 'rw', default => 0); + has 'quote_field_names' => (isa => Bool, is => 'rw', default => 0); has 'version' => (isa => Str, is => 'rw'); has 'filename' => (isa => Str, is => 'rw'); @@ -78,9 +83,14 @@ class SQL::Translator { method _build__producer { my $class = 'SQL::Translator::Producer'; my $role = $class . '::' . $self->producer; - + Class::MOP::load_class($class); - try { Class::MOP::load_class($role) } catch ($e) { warn "ERROR: $e"; $role = $class . '::SQL::' . $self->producer; Class::MOP::load_class($role) } + try { + Class::MOP::load_class($role) + } catch ($e) { + $role = $class . '::SQL::' . $self->producer; + Class::MOP::load_class($role) + } my $producer = $class->new({ translator => $self }); $role->meta->apply($producer); @@ -89,18 +99,62 @@ class SQL::Translator { } method translate(:$data, :$producer?, :$producer_args?, :$parser?, :$parser_args?) { - if ($parser) { + my $return; + + $parser ||= $self->parser; + if (defined $parser) { $self->_clear_parser; $self->parser($parser); - $self->schema($self->parse($data)); - } elsif ($producer) { + $self->parse($data); + $return = $self->schema; + } + + $producer ||= $self->producer; + if (defined $producer) { $self->_clear_producer; - $self->schema($self->parse($data)) if $data; $self->producer($producer); - return $self->produce; + $return = $self->produce; } + + return $return; } method parser_type { return $self->parser } method producer_type { return $self->producer } + + method engine_version(Int|Str|Undef $v, Str $target = 'perl') { + return undef unless $v; + + my @vers; + + # X.Y.Z style + if ( $v =~ / ^ (\d+) \. (\d{1,3}) (?: \. (\d{1,3}) )? $ /x ) { + push @vers, $1, $2, $3; + } + + # XYYZZ (mysql) style + elsif ( $v =~ / ^ (\d) (\d{2}) (\d{2}) $ /x ) { + push @vers, $1, $2, $3; + } + + # XX.YYYZZZ (perl) style or simply X + elsif ( $v =~ / ^ (\d+) (?: \. (\d{3}) (\d{3}) )? $ /x ) { + push @vers, $1, $2, $3; + } + else { + #how do I croak sanely here? + die "Unparseable MySQL version '$v'"; + } + + if ($target eq 'perl') { + return sprintf ('%d.%03d%03d', map { $_ || 0 } (@vers) ); + } + elsif ($target eq 'mysql') { + return sprintf ('%d%02d%02d', map { $_ || 0 } (@vers) ); + } + else { + #how do I croak sanely here? + die "Unknown version target '$target'"; + } + } }