X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FUtils.pm;h=3d5e57278f771fa26f97b46dd4fd0e84cc5450df;hb=44659089c28216f1984873bc4aa8641e2e0e3410;hp=f3603f36befa5725ae8c0b5c1115ae248af07c48;hpb=b03926cdac036bdbcf69e478ca29e1121c814646;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Utils.pm b/lib/SQL/Translator/Utils.pm index f3603f3..3d5e572 100644 --- a/lib/SQL/Translator/Utils.pm +++ b/lib/SQL/Translator/Utils.pm @@ -21,16 +21,16 @@ package SQL::Translator::Utils; use strict; use base qw(Exporter); use vars qw($VERSION $DEFAULT_COMMENT @EXPORT_OK); - use Digest::SHA1 qw( sha1_hex ); - use Exporter; -$VERSION = '1.99'; +$VERSION = '1.59'; $DEFAULT_COMMENT = '-- '; @EXPORT_OK = qw( - debug normalize_name header_comment parse_list_arg truncate_id_uniquely $DEFAULT_COMMENT parse_mysql_version + debug normalize_name header_comment parse_list_arg truncate_id_uniquely + $DEFAULT_COMMENT parse_mysql_version parse_dbms_version ); +use constant COLLISION_TAG_LENGTH => 8; # ---------------------------------------------------------------------- # debug(@msg) @@ -151,18 +151,19 @@ sub parse_list_arg { # truncated name, giving a high probability that the symbol will be # unique. # ---------------------------------------------------------------------- -my $COLLISION_TAG_LENGTH = 8; sub truncate_id_uniquely { my ( $desired_name, $max_symbol_length ) = @_; - return $desired_name unless defined $desired_name && length $desired_name > $max_symbol_length; + return $desired_name + unless defined $desired_name && length $desired_name > $max_symbol_length; - my $truncated_name = substr $desired_name, 0, $max_symbol_length - $COLLISION_TAG_LENGTH - 1; + my $truncated_name = substr $desired_name, 0, + $max_symbol_length - COLLISION_TAG_LENGTH - 1; # Hex isn't the most space-efficient, but it skirts around allowed # charset issues my $digest = sha1_hex($desired_name); - my $collision_tag = substr $digest, 0, $COLLISION_TAG_LENGTH; + my $collision_tag = substr $digest, 0, COLLISION_TAG_LENGTH; return $truncated_name . '_' @@ -217,6 +218,46 @@ sub parse_mysql_version { } } +#--------------------------------------------------------------------- +# parse_dbms_version ( $version_string, $target ) +# +# Attempts to parse either a native or perl-style version string into +# a version number format as specified by $target, which can be either +# 'perl' for a perl-style version number, or 'native' for an X.X.X +# style version number. +#--------------------------------------------------------------------- +sub parse_dbms_version { + my ($v, $target) = @_; + + 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; + } + + # 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 database server version '$v'"; + } + + if ($target eq 'perl') { + return sprintf ('%d.%03d%03d', map { $_ || 0 } (@vers) ); + } + elsif ($target eq 'native') { + return join '.' => grep defined, @vers; + } + else { + #how do I croak sanely here? + die "Unknown version target '$target'"; + } +} 1;