package SQL::Translator::Utils;
-# ----------------------------------------------------------------------
-# 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
-# published by the Free Software Foundation; version 2.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA
-# -------------------------------------------------------------------
-
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)
# 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
. '_'
}
}
+#---------------------------------------------------------------------
+# 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;