Skip to content

Commit

Permalink
Merge pull request #6895 from kennyj/support_collate_for_postgresql
Browse files Browse the repository at this point in the history
Support collate for postgresql
  • Loading branch information
rafaelfranca committed Jun 28, 2012
2 parents 2596aeb + 138934f commit fda2431
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 1 deletion.
Expand Up @@ -916,7 +916,8 @@ def recreate_database(name, options = {}) #:nodoc:
end

# Create a new PostgreSQL database. Options include <tt>:owner</tt>, <tt>:template</tt>,
# <tt>:encoding</tt>, <tt>:tablespace</tt>, and <tt>:connection_limit</tt> (note that MySQL uses
# <tt>:encoding</tt>, <tt>:collate</tt>, <tt>:ctype</tt>,
# <tt>:tablespace</tt>, and <tt>:connection_limit</tt> (note that MySQL uses
# <tt>:charset</tt> while PostgreSQL uses <tt>:encoding</tt>).
#
# Example:
Expand All @@ -933,6 +934,10 @@ def create_database(name, options = {})
" TEMPLATE = \"#{value}\""
when :encoding
" ENCODING = '#{value}'"
when :collate
" LC_COLLATE = '#{value}'"
when :ctype
" LC_CTYPE = '#{value}'"
when :tablespace
" TABLESPACE = \"#{value}\""
when :connection_limit
Expand Down Expand Up @@ -1059,6 +1064,20 @@ def encoding
end_sql
end

# Returns the current database collate.
def collate
query(<<-end_sql, 'SCHEMA')[0][0]
SELECT pg_database.datcollate FROM pg_database WHERE pg_database.datname LIKE '#{current_database}'
end_sql
end

# Returns the current database ctype.
def ctype
query(<<-end_sql, 'SCHEMA')[0][0]
SELECT pg_database.datctype FROM pg_database WHERE pg_database.datname LIKE '#{current_database}'
end_sql
end

# Returns an array of schema names.
def schema_names
query(<<-SQL, 'SCHEMA').flatten
Expand Down
Expand Up @@ -21,6 +21,10 @@ def test_create_database_with_encoding
assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, :encoding => :latin1)
end

def test_create_database_with_collate_and_ctype
assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'UTF8' LC_COLLATE = 'ja_JP.UTF8' LC_CTYPE = 'ja_JP.UTF8'), create_database(:aimonetti, :encoding => :"UTF8", :collate => :"ja_JP.UTF8", :ctype => :"ja_JP.UTF8")
end

def test_add_index
# add_index calls index_name_exists? which can't work since execute is stubbed
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:define_method, :index_name_exists?) do |*|
Expand Down
Expand Up @@ -21,6 +21,14 @@ def test_encoding
assert_not_nil @connection.encoding
end

def test_collate
assert_not_nil @connection.collate
end

def test_ctype
assert_not_nil @connection.ctype
end

def test_default_client_min_messages
assert_equal "warning", @connection.client_min_messages
end
Expand Down
8 changes: 8 additions & 0 deletions activerecord/test/cases/tasks/postgresql_rake_test.rb
Expand Up @@ -38,6 +38,14 @@ def test_creates_database_with_given_encoding
merge('encoding' => 'latin')
end

def test_creates_database_with_given_collate_and_ctype
@connection.expects(:create_database).
with('my-app-db', @configuration.merge('encoding' => 'utf8', 'collate' => 'ja_JP.UTF8', 'ctype' => 'ja_JP.UTF8'))

ActiveRecord::Tasks::DatabaseTasks.create @configuration.
merge('collate' => 'ja_JP.UTF8', 'ctype' => 'ja_JP.UTF8')
end

def test_establishes_connection_to_new_database
ActiveRecord::Base.expects(:establish_connection).with(@configuration)

Expand Down

0 comments on commit fda2431

Please sign in to comment.