aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2013-03-22 19:41:29 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2013-03-22 19:41:29 -0700
commit7a872e9d84be2f0205d8ca811698be92195ef0e1 (patch)
treefaceaaedddf84672e014617c57f3698672cacc70 /activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
parentdb3a6e6a7fc80e85afe239abf5d01aa30685c1c1 (diff)
parentbc8ebefe9825dbff2cffa29ff015a1e7a31f9812 (diff)
downloadrails-7a872e9d84be2f0205d8ca811698be92195ef0e1.tar.gz
rails-7a872e9d84be2f0205d8ca811698be92195ef0e1.tar.bz2
rails-7a872e9d84be2f0205d8ca811698be92195ef0e1.zip
Merge branch 'schema'
* schema: add uuid primary key support separate primary key from column type push the mysql add_column up to the abstract adapter allow multiple add columns pull add_column_options! off the pg connection class add a pg visitor for dealing with schema modification push alter table add column sql in to the schema modification visitor there is no reason to check for an already defined column push column initialization down to the factory method @columns list is no longer necessary keep ivars private, do not manipulate them outside their owner object factory methods should not alter object state push SQL generation inside the schema creation object mostly decouple TableDefinition from the database connection remove to_sql from TableDefinition decouple column definition from the database connection stop depending on sql_type in pg remove knowledge of SQL from the column definition object
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/abstract_adapter.rb')
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract_adapter.rb69
1 files changed, 69 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
index 7949bcb5ce..0ebe46be55 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
@@ -100,6 +100,75 @@ module ActiveRecord
@visitor = nil
end
+ class SchemaCreation
+ def initialize(conn)
+ @conn = conn
+ @cache = {}
+ end
+
+ def accept(o)
+ m = @cache[o.class] ||= "visit_#{o.class.name.split('::').last}"
+ send m, o
+ end
+
+ private
+
+ def visit_AlterTable(o)
+ sql = "ALTER TABLE #{quote_table_name(o.name)} "
+ sql << o.adds.map { |col| visit_AddColumn col }.join(' ')
+ end
+
+ def visit_AddColumn(o)
+ sql_type = type_to_sql(o.type.to_sym, o.limit, o.precision, o.scale)
+ sql = "ADD #{quote_column_name(o.name)} #{sql_type}"
+ add_column_options!(sql, column_options(o))
+ end
+
+ def visit_ColumnDefinition(o)
+ sql_type = type_to_sql(o.type.to_sym, o.limit, o.precision, o.scale)
+ column_sql = "#{quote_column_name(o.name)} #{sql_type}"
+ add_column_options!(column_sql, column_options(o)) unless o.primary_key?
+ column_sql
+ end
+
+ def visit_TableDefinition(o)
+ create_sql = "CREATE#{' TEMPORARY' if o.temporary} TABLE "
+ create_sql << "#{quote_table_name(o.name)} ("
+ create_sql << o.columns.map { |c| accept c }.join(', ')
+ create_sql << ") #{o.options}"
+ create_sql
+ end
+
+ def column_options(o)
+ column_options = {}
+ column_options[:null] = o.null unless o.null.nil?
+ column_options[:default] = o.default unless o.default.nil?
+ column_options[:column] = o
+ column_options
+ end
+
+ def quote_column_name(name)
+ @conn.quote_column_name name
+ end
+
+ def quote_table_name(name)
+ @conn.quote_table_name name
+ end
+
+ def type_to_sql(type, limit, precision, scale)
+ @conn.type_to_sql type.to_sym, limit, precision, scale
+ end
+
+ def add_column_options!(column_sql, column_options)
+ @conn.add_column_options! column_sql, column_options
+ column_sql
+ end
+ end
+
+ def schema_creation
+ SchemaCreation.new self
+ end
+
def lease
synchronize do
unless in_use