Revert my previous changes (rev 1722 reverted back to rev 1721)
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Utils.pm
index e85000a..3d5e572 100644 (file)
@@ -1,9 +1,7 @@
 package SQL::Translator::Utils;
 
 # ----------------------------------------------------------------------
-# $Id: Utils.pm,v 1.12 2004-02-09 23:04:26 kycl4rk Exp $
-# ----------------------------------------------------------------------
-# Copyright (C) 2002-4 SQLFairy Authors
+# Copyright (C) 2002-2009 SQLFairy Authors
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License as
@@ -23,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 = sprintf "%d.%02d", q$Revision: 1.12 $ =~ /(\d+)\.(\d+)/;
+$VERSION = '1.59';
 $DEFAULT_COMMENT = '-- ';
 @EXPORT_OK = qw(
-    debug normalize_name header_comment parse_list_arg truncate_id_uniquely $DEFAULT_COMMENT
+    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)
@@ -153,24 +151,114 @@ 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
          . '_'
          . $collision_tag;
 }
 
+
+#---------------------------------------------------------------------
+# parse_mysql_version ( $version_string, $result_target)
+#
+# Attempts to parse an arbitrary string as a mysql version number. 
+# Returns either a floating point perl style string, or a mysql style
+# 5 digit string, depending on the supplied $result_target
+#---------------------------------------------------------------------
+sub parse_mysql_version {
+    my ($v, $target) = @_;
+
+    return undef unless $v;
+
+    $target ||= 'perl';
+
+    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'";
+    }
+}
+
+#---------------------------------------------------------------------
+# 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;
 
 # ----------------------------------------------------------------------
@@ -300,11 +388,24 @@ Will give three different results; specifically:
 This is the default comment string, '-- ' by default.  Useful for
 C<header_comment>.
 
+=head2 parse_mysql_version
+
+Used by both L<Parser::MySQL|SQL::Translator::Parser::MySQL> and 
+L<Producer::MySQL|SQL::Translator::Producer::MySQL> in order to provide a
+consistent format for both C<< parser_args->{mysql_parser_version} >> and
+C<< producer_args->{mysql_version} >> respectively. Takes any of the following
+version specifications:
+
+  5.0.3
+  4.1
+  3.23.2
+  5
+  5.001005  (perl style)
+  30201     (mysql style)
+
 =head1 AUTHORS
 
 Darren Chamberlain E<lt>darren@cpan.orgE<gt>,
 Ken Y. Clark E<lt>kclark@cpan.orgE<gt>.
 
 =cut
-
-=cut