Hi,

As discussed in IRC, I've made a patch for enabling a version-switch on
the mysql producer in order to use the "BOOLEAN" type for boolean
fields, instead of using "enum('0','1')". The default is to be 3.x
compatible (for compatibility reasons, but I would argue to have 4.x as
default).

daniel
diff --git a/sqlfairy/bin/sqlt b/sqlfairy/bin/sqlt
index 2608167..afc05e7 100755
--- a/sqlfairy/bin/sqlt
+++ b/sqlfairy/bin/sqlt
@@ -69,6 +69,10 @@ To translate a schema:
     --mysql-parser-version  Target MySQL parser version for dealing with
                               /*! comments; default = 30000
 
+  MySQL Producer Options:
+
+    --mysql-version  MySQL server version
+
   General Producer Options
 
     --producer-db-user   Database user for producer
@@ -189,6 +193,7 @@ my $producer_dsn;     # db_user "
 my $add_truncate;
 my $mysql_parser_version;  # MySQL parser arg for /*! comments
 my $postgres_version; # PostgreSQL version
+my $mysql_version; # MySQL version
 
 GetOptions(
     'add-drop-table'   => \$add_drop_table,
@@ -232,6 +237,7 @@ GetOptions(
     'version'          => \$show_version,
     'mysql-parser-version=i' => \$mysql_parser_version,
     'postgres-version=f' => \$postgres_version,
+    'mysql-version=f' => \$mysql_version,
 ) or pod2usage(2);
 
 if ($use_same_auth) {
@@ -296,6 +302,7 @@ my $translator           =  SQL::Translator->new(
         indent           => $indent,
         newlines         => $newlines,
         postgres_version => $postgres_version,
+        mysql_version    => $mysql_version,
 	    package_name     => $package_name,
     },
 );
diff --git a/sqlfairy/lib/SQL/Translator.pm b/sqlfairy/lib/SQL/Translator.pm
index 645102c..890b3ca 100644
--- a/sqlfairy/lib/SQL/Translator.pm
+++ b/sqlfairy/lib/SQL/Translator.pm
@@ -1299,6 +1299,8 @@ The following people have contributed to the SQLFairy project:
 
 =item * Ying Zhang <[EMAIL PROTECTED]>
 
+=item * Daniel Ruoso <[EMAIL PROTECTED]>
+
 =back
 
 If you would like to contribute to the project, you can send patches
diff --git a/sqlfairy/lib/SQL/Translator/Producer/MySQL.pm b/sqlfairy/lib/SQL/Translator/Producer/MySQL.pm
index 1dfede4..a57bd9c 100644
--- a/sqlfairy/lib/SQL/Translator/Producer/MySQL.pm
+++ b/sqlfairy/lib/SQL/Translator/Producer/MySQL.pm
@@ -240,6 +240,8 @@ sub produce {
     my $add_drop_table = $translator->add_drop_table;
     my $schema         = $translator->schema;
     my $show_warnings  = $translator->show_warnings || 0;
+    my $producer_args  = $translator->producer_args;
+    my $mysql_version  = $producer_args->{mysql_version} || 0;
 
     my ($qt, $qf, $qc) = ('','', '');
     $qt = '`' if $translator->quote_table_names;
@@ -266,7 +268,8 @@ sub produce {
                                          show_warnings     => $show_warnings,
                                          no_comments       => $no_comments,
                                          quote_table_names => $qt,
-                                         quote_field_names => $qf
+                                         quote_field_names => $qf,
+                                         mysql_version     => $mysql_version
                                          });
     }
 
@@ -421,8 +424,13 @@ sub create_field
         @size      = ();
     }
     elsif ( $data_type =~ /boolean/i ) {
-        $data_type = 'enum';
-        $commalist = "'0','1'";
+        my $mysql_version = $options->{mysql_version} || 0;
+        if ($mysql_version >= 4) {
+            $data_type = 'boolean';
+        } else {
+            $data_type = 'enum';
+            $commalist = "'0','1'";
+        }
     }
     elsif ( exists $translate{ lc $data_type } ) {
         $data_type = $translate{ lc $data_type };
diff --git a/sqlfairy/t/38-mysql-producer.t b/sqlfairy/t/38-mysql-producer.t
index 3f0a507..ce5bbdd 100644
--- a/sqlfairy/t/38-mysql-producer.t
+++ b/sqlfairy/t/38-mysql-producer.t
@@ -19,7 +19,7 @@ use FindBin qw/$Bin/;
 #=============================================================================
 
 BEGIN {
-    maybe_plan(11,
+    maybe_plan(14,
         'YAML',
         'SQL::Translator::Producer::MySQL',
         'Test::Differences',
@@ -236,3 +236,17 @@ is($add_field, 'ALTER TABLE mytable ADD COLUMN myfield VARCHAR(10)', 'Add field
 
 my $drop_field = SQL::Translator::Producer::MySQL::drop_field($field2);
 is($drop_field, 'ALTER TABLE mytable DROP COLUMN myfield', 'Drop field works');
+
+my $field3 = SQL::Translator::Schema::Field->new( name      => 'myfield',
+                                                  table => $table,
+                                                  data_type => 'boolean',
+                                                  is_nullable => 0,
+                                                  is_foreign_key => 0,
+                                                  is_unique => 0 );
+
+my $field3_sql = SQL::Translator::Producer::MySQL::create_field($field3, { mysql_version => 4.1 });
+is($field3_sql, 'myfield boolean NOT NULL', 'For Mysql >= 4, use boolean type');
+$field3_sql = SQL::Translator::Producer::MySQL::create_field($field3, { mysql_version => 3.22 });
+is($field3_sql, "myfield enum('0','1') NOT NULL", 'For Mysql < 4, use enum for boolean type');
+$field3_sql = SQL::Translator::Producer::MySQL::create_field($field3,);
+is($field3_sql, "myfield enum('0','1') NOT NULL", 'When no version specified, use enum for boolean type');
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
-- 
sqlfairy-developers mailing list
sqlfairy-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlfairy-developers

Reply via email to