Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 6848

Show
Ignore:
Timestamp:
05/26/07 00:20:37 (2 years ago)
Author:
bitsweat
Message:

MySQL: create_database takes :charset and :collation options. Charset defaults to utf8. References #8448.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/activerecord/CHANGELOG

    r6845 r6848  
    11*SVN* 
     2 
     3* MySQL: create_database takes :charset and :collation options. Charset defaults to utf8.  #8448 [matt] 
    24 
    35* Find with a list of ids supports limit/offset.  #8437 [hrudududu] 
  • trunk/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb

    r6678 r6848  
    210210        "1" 
    211211      end 
    212        
     212 
    213213      def quoted_false 
    214214        "0" 
     
    239239        connect 
    240240      end 
    241        
     241 
    242242      def disconnect! 
    243243        @connection.close rescue nil 
     
    305305          sql = "SHOW TABLES" 
    306306        end 
    307          
     307 
    308308        select_all(sql).inject("") do |structure, table| 
    309309          table.delete('Table_type') 
     
    317317      end 
    318318 
    319       def create_database(name) #:nodoc: 
    320         execute "CREATE DATABASE `#{name}`" 
    321       end 
    322        
     319      # Create a new MySQL database with optional :charset and :collation. 
     320      # Charset defaults to utf8. 
     321      # 
     322      # Example: 
     323      #   create_database 'charset_test', :charset => 'latin1', :collation => 'latin1_bin' 
     324      #   create_database 'matt_development' 
     325      #   create_database 'matt_development', :charset => :big5 
     326      def create_database(name, options = {}) 
     327        if options[:collation] 
     328          execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}` COLLATE `#{options[:collation]}`" 
     329        else 
     330          execute "CREATE DATABASE `#{name}` DEFAULT CHARACTER SET `#{options[:charset] || 'utf8'}`" 
     331        end 
     332      end 
     333 
    323334      def drop_database(name) #:nodoc: 
    324335        execute "DROP DATABASE IF EXISTS `#{name}`" 
     
    326337 
    327338      def current_database 
    328         select_one("SELECT DATABASE() as db")["db"] 
     339        select_value 'SELECT DATABASE() as db' 
     340      end 
     341 
     342      # Returns the database character set. 
     343      def charset 
     344        show_variable 'character_set_database' 
     345      end 
     346 
     347      # Returns the database collation strategy. 
     348      def collation 
     349        show_variable 'collation_database' 
    329350      end 
    330351 
     
    360381        super(name, {:options => "ENGINE=InnoDB"}.merge(options)) 
    361382      end 
    362        
     383 
    363384      def rename_table(name, new_name) 
    364385        execute "RENAME TABLE #{name} TO #{new_name}" 
    365       end   
     386      end 
    366387 
    367388      def change_column_default(table_name, column_name, default) #:nodoc: 
     
    386407      end 
    387408 
     409 
     410      # SHOW VARIABLES LIKE 'name' 
     411      def show_variable(name) 
     412        select_value "SHOW VARIABLES LIKE '#{name}'" 
     413      end 
    388414 
    389415      private 
  • trunk/activerecord/test/active_schema_test_mysql.rb

    r4571 r6848  
    66      alias_method :real_execute, :execute 
    77      def execute(sql, name = nil) return sql end 
    8     end     
     8    end 
    99  end 
    10    
     10 
    1111  def teardown 
    1212    ActiveRecord::ConnectionAdapters::MysqlAdapter.send(:alias_method, :execute, :real_execute) 
     
    1616    assert_equal "DROP TABLE people", drop_table(:people) 
    1717  end 
    18    
     18 
     19  if current_adapter?(:MysqlAdapter) 
     20    def test_create_mysql_database_with_encoding 
     21      assert_equal "CREATE DATABASE `matt` DEFAULT CHARACTER SET `utf8`", create_database(:matt) 
     22      assert_equal "CREATE DATABASE `aimonetti` DEFAULT CHARACTER SET `latin1`", create_database(:aimonetti, {:charset => 'latin1'}) 
     23      assert_equal "CREATE DATABASE `matt_aimonetti` DEFAULT CHARACTER SET `big5` COLLATE `big5_chinese_ci`", create_database(:matt_aimonetti, {:charset => :big5, :collation => :big5_chinese_ci}) 
     24    end 
     25  end 
     26 
    1927  def test_add_column 
    2028    assert_equal "ALTER TABLE people ADD `last_name` varchar(255)", add_column(:people, :last_name, :string) 
    2129  end 
    22    
     30 
    2331  def test_add_column_with_limit 
    2432    assert_equal "ALTER TABLE people ADD `key` varchar(32)", add_column(:people, :key, :string, :limit => 32) 
    2533  end 
    26    
     34 
    2735  private 
    2836    def method_missing(method_symbol, *arguments) 
  • trunk/activerecord/test/adapter_test.rb

    r4291 r6848  
    2020  def test_indexes 
    2121    idx_name = "accounts_idx" 
    22        
     22 
    2323    if @connection.respond_to?(:indexes) 
    2424      indexes = @connection.indexes("accounts") 
     
    4040    @connection.remove_index(:accounts, :name => idx_name) rescue nil 
    4141  end 
    42    
     42 
    4343  def test_current_database 
    4444    if @connection.respond_to?(:current_database) 
    4545      assert_equal ENV['ARUNIT_DB_NAME'] || "activerecord_unittest", @connection.current_database 
     46    end 
     47  end 
     48 
     49  if current_adapter?(:MysqlAdapter) 
     50    def test_charset 
     51      assert @connection.charset 
     52    end 
     53 
     54    def test_collation 
     55      assert @connection.collation 
    4656    end 
    4757  end 
     
    5363      alias_method :table_alias_length,     :test_table_alias_length 
    5464    end 
    55        
     65 
    5666    assert_equal 'posts',      @connection.table_alias_for('posts') 
    5767    assert_equal 'posts_comm', @connection.table_alias_for('posts_comments') 
    5868    assert_equal 'dbo_posts',  @connection.table_alias_for('dbo.posts') 
    59      
     69 
    6070    class << @connection 
    6171      alias_method :table_alias_length, :old_table_alias_length 
     
    6777    require 'fixtures/movie' 
    6878    require 'fixtures/subscriber' 
    69      
     79 
    7080    def test_reset_empty_table_with_custom_pk 
    7181      Movie.delete_all