Title: [848] trunk/activerecord-jdbc: - MySQL quoting and migration updates

Diff

Modified: trunk/activerecord-jdbc/History.txt (847 => 848)


--- trunk/activerecord-jdbc/History.txt	2007-12-15 18:44:05 UTC (rev 847)
+++ trunk/activerecord-jdbc/History.txt	2007-12-15 18:47:20 UTC (rev 848)
@@ -5,6 +5,9 @@
   0.6 release.
 - Release coincides with JRuby 1.0.3 and JRuby 1.1b2 releases
 - Simultaneous support for JRuby trunk and 1.0 branch
+- Get rid of log_no_bench method, so we time SQL execution again.
+- Implement #select_rows
+- MySQL migration and quoting updates
 
 == 0.6
 

Modified: trunk/activerecord-jdbc/Rakefile (847 => 848)


--- trunk/activerecord-jdbc/Rakefile	2007-12-15 18:44:05 UTC (rev 847)
+++ trunk/activerecord-jdbc/Rakefile	2007-12-15 18:47:20 UTC (rev 848)
@@ -29,6 +29,7 @@
   rm_rf FileList['test.db.*']
   rm_rf "test/reports"
   rm_f FileList['lib/**/*.jar']
+  rm_f "manifest.mf"
 end
 
 task :clean => :more_clean

Modified: trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter.rb (847 => 848)


--- trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter.rb	2007-12-15 18:44:05 UTC (rev 847)
+++ trunk/activerecord-jdbc/lib/active_record/connection_adapters/jdbc_adapter.rb	2007-12-15 18:47:20 UTC (rev 848)
@@ -10,7 +10,7 @@
       # The original implementation of this had a bug, which modifies native_database_types.
       # This version allows us to cache that value.
       def type_to_sql(type, limit = nil, precision = nil, scale = nil) #:nodoc:
-        native = native_database_types[type]
+        native = native_database_types[type.to_s.downcase.to_sym]
         column_type_sql = native.is_a?(Hash) ? native[:name] : native
         if type == :decimal # ignore limit, use precison and scale
           precision ||= native[:precision]
@@ -171,7 +171,14 @@
 
       def choose_best_types
         type_map = {}
-        AR_TO_JDBC_TYPES.each_key do |k|
+        @types.each do |row|
+          name = row['type_name'].downcase
+          k = name.to_sym
+          type_map[k] = { :name => name }
+          type_map[k][:limit] = row['precision'].to_i if row['precision']
+        end
+
+        AR_TO_JDBC_TYPES.keys.each do |k|
           typerow = choose_type(k)
           type_map[k] = { :name => typerow['type_name'].downcase }
           case k
@@ -470,19 +477,25 @@
       end
       
       def disconnect!
-	@connection.disconnect!
+        @connection.disconnect!
       end
 
       def select_all(sql, name = nil)
         select(sql, name)
       end
 
+      def select_rows(sql, name = nil)
+        rows = []
+        select(sql, name).each {|row| rows << row.values }
+        rows
+      end
+
       def select_one(sql, name = nil)
         select(sql, name).first
       end
 
       def execute(sql, name = nil)
-        log_no_bench(sql, name) do
+        log(sql, name) do
           _execute(sql,name)
         end
       end
@@ -542,27 +555,6 @@
       def select(sql, name=nil)
         execute(sql,name)
       end
-
-      def log_no_bench(sql, name)
-        if block_given?
-          if @logger and @logger.level <= Logger::INFO
-            result = yield
-            log_info(sql, name, 0)
-            result
-          else
-            yield
-          end
-        else
-          log_info(sql, name, 0)
-          nil
-        end
-      rescue Exception => e
-        # Log message and raise exception.
-        message = "#{e.class.name}: #{e.message}: #{sql}"
-
-        log_info(message, name, 0)
-        raise ActiveRecord::StatementInvalid, message
-      end
     end
   end
 end

Modified: trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_hsqldb.rb (847 => 848)


--- trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_hsqldb.rb	2007-12-15 18:44:05 UTC (rev 847)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_hsqldb.rb	2007-12-15 18:47:20 UTC (rev 848)
@@ -134,7 +134,7 @@
     end
 
     def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil) #:nodoc:
-      log_no_bench(sql,name) do
+      log(sql,name) do
         @connection.execute_update(sql)
       end
       table = sql.split(" ", 4)[2]

Modified: trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_mysql.rb (847 => 848)


--- trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_mysql.rb	2007-12-15 18:44:05 UTC (rev 847)
+++ trunk/activerecord-jdbc/lib/jdbc_adapter/jdbc_mysql.rb	2007-12-15 18:47:20 UTC (rev 848)
@@ -81,6 +81,10 @@
     def quote_column_name(name) #:nodoc:
         "`#{name}`"
     end
+
+    def quote_table_name(name) #:nodoc:
+      quote_column_name(name).gsub('.', '`.`')
+    end
     
     def quoted_true
         "1"
@@ -90,6 +94,25 @@
         "0"
     end
     
+    def begin_db_transaction #:nodoc:
+      @connection.begin
+    rescue Exception
+      # Transactions aren't supported
+    end
+
+    def commit_db_transaction #:nodoc:
+      @connection.commit
+    rescue Exception
+      # Transactions aren't supported
+    end
+
+    def rollback_db_transaction #:nodoc:
+      @connection.rollback
+    rescue Exception
+      # Transactions aren't supported
+    end
+
+
     # SCHEMA STATEMENTS ========================================
     
     def structure_dump #:nodoc:
@@ -101,7 +124,7 @@
       
       select_all(sql).inject("") do |structure, table|
         table.delete('Table_type')
-        structure += select_one("SHOW CREATE TABLE #{table.to_a.first.last}")["Create Table"] + ";\n\n"
+        structure += select_one("SHOW CREATE TABLE #{quote_table_name(table.to_a.first.last)}")["Create Table"] + ";\n\n"
       end
     end
     
@@ -127,28 +150,32 @@
     end
     
     def rename_table(name, new_name)
-      execute "RENAME TABLE #{name} TO #{new_name}"
+      execute "RENAME TABLE #{quote_table_name(name)} TO #{quote_table_name(new_name)}"
     end  
     
     def change_column_default(table_name, column_name, default) #:nodoc:
-      current_type = select_one("SHOW COLUMNS FROM #{table_name} LIKE '#{column_name}'")["Type"]
+      current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'")["Type"]
 
-      execute("ALTER TABLE #{table_name} CHANGE #{column_name} #{column_name} #{current_type} DEFAULT #{quote(default)}")
+      execute("ALTER TABLE #{quote_table_name(table_name)} CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{current_type} DEFAULT #{quote(default)}")
     end
     
     def change_column(table_name, column_name, type, options = {}) #:nodoc:
-      unless options.include?(:default) && !(options[:null] == false && options[:default].nil?)
-        options[:default] = select_one("SHOW COLUMNS FROM #{table_name} LIKE '#{column_name}'")["Default"]
+      unless options_include_default?(options)
+        if column = columns(table_name).find { |c| c.name == column_name.to_s }
+          options[:default] = column.default
+        else
+          raise "No such column: #{table_name}.#{column_name}"
+        end
       end
-      
-      change_column_sql = "ALTER TABLE #{table_name} CHANGE #{column_name} #{column_name} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
+
+      change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
       add_column_options!(change_column_sql, options)
       execute(change_column_sql)
     end
-    
+
     def rename_column(table_name, column_name, new_column_name) #:nodoc:
-      current_type = select_one("SHOW COLUMNS FROM #{table_name} LIKE '#{column_name}'")["Type"]
-      execute "ALTER TABLE #{table_name} CHANGE #{column_name} #{new_column_name} #{current_type}"
+      current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'")["Type"]
+      execute "ALTER TABLE #{quote_table_name(table_name)} CHANGE #{quote_table_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}"
     end
     
     def add_limit_offset!(sql, options) #:nodoc:
@@ -161,9 +188,23 @@
       end
     end
 
+    def show_variable(var)
+      res = execute("show variables like '#{var}'")
+      row = res.detect {|row| row["Variable_name"] == var }
+      row && row["Value"]
+    end
+
+    def charset
+      show_variable("character_set_database")
+    end
+
+    def collation
+      show_variable("collation_database")
+    end
+
     private
     def supports_views?
       false
     end
   end
-end
+end
\ No newline at end of file
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to