From 69ef76a6f8b1fbfdee81e753d6e50c3c0396d47c Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 15 Mar 2013 19:22:07 -0700 Subject: remove knowledge of SQL from the column definition object --- .../connection_adapters/abstract_adapter.rb | 41 ++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'activerecord/lib/active_record/connection_adapters/abstract_adapter.rb') diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index 7949bcb5ce..41ccaf8e58 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -100,6 +100,47 @@ 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_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}" + column_options = {} + column_options[:null] = o.null unless o.null.nil? + column_options[:default] = o.default unless o.default.nil? + column_options[:column] = o + add_column_options!(column_sql, column_options) unless o.primary_key? + column_sql + end + + def quote_column_name(name) + @conn.quote_column_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 + end + end + + def schema_creation + SchemaCreation.new self + end + def lease synchronize do unless in_use -- cgit v1.2.3 From 1c9f7fa6e17d3b026ad6e0bc1f07a9dd47d8a360 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 15 Mar 2013 19:37:44 -0700 Subject: remove to_sql from TableDefinition --- .../lib/active_record/connection_adapters/abstract_adapter.rb | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'activerecord/lib/active_record/connection_adapters/abstract_adapter.rb') diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index 41ccaf8e58..781ba6a733 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -124,6 +124,10 @@ module ActiveRecord column_sql end + def visit_TableDefinition(o) + o.columns.map { |c| accept c }.join ', ' + end + def quote_column_name(name) @conn.quote_column_name name end -- cgit v1.2.3 From 14d7dc0811fc946ffb63ceed7e0389ed14b50800 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Fri, 15 Mar 2013 20:20:35 -0700 Subject: push SQL generation inside the schema creation object --- .../lib/active_record/connection_adapters/abstract_adapter.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'activerecord/lib/active_record/connection_adapters/abstract_adapter.rb') diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index 781ba6a733..b3c55dfbbb 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -125,13 +125,21 @@ module ActiveRecord end def visit_TableDefinition(o) - o.columns.map { |c| accept c }.join ', ' + 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 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 -- cgit v1.2.3 From f20b2f4e54d27f7f98ca537ac69b1be8f88fc2a5 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Sat, 16 Mar 2013 16:01:03 -0700 Subject: push alter table add column sql in to the schema modification visitor --- .../connection_adapters/abstract_adapter.rb | 26 +++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'activerecord/lib/active_record/connection_adapters/abstract_adapter.rb') diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index b3c55dfbbb..5d38b45a5b 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -113,14 +113,22 @@ module ActiveRecord private + def visit_AlterTable(o) + sql = "ALTER TABLE #{quote_table_name(o.name)} " + + if col = o.add + sql_type = type_to_sql(col.type.to_sym, col.limit, col.precision, col.scale) + sql << "ADD #{quote_column_name(col.name)} #{sql_type}" + add_column_options!(sql, column_options(col)) + end + + sql + 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}" - column_options = {} - column_options[:null] = o.null unless o.null.nil? - column_options[:default] = o.default unless o.default.nil? - column_options[:column] = o - add_column_options!(column_sql, column_options) unless o.primary_key? + add_column_options!(column_sql, column_options(o)) unless o.primary_key? column_sql end @@ -132,6 +140,14 @@ module ActiveRecord 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 -- cgit v1.2.3 From 739a72036162b4057ceb4de6950624c0c0ed93b4 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Sat, 16 Mar 2013 16:41:14 -0700 Subject: allow multiple add columns --- activerecord/lib/active_record/connection_adapters/abstract_adapter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'activerecord/lib/active_record/connection_adapters/abstract_adapter.rb') diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index 5d38b45a5b..3dc284b4ce 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -116,7 +116,7 @@ module ActiveRecord def visit_AlterTable(o) sql = "ALTER TABLE #{quote_table_name(o.name)} " - if col = o.add + o.adds.each do |col| sql_type = type_to_sql(col.type.to_sym, col.limit, col.precision, col.scale) sql << "ADD #{quote_column_name(col.name)} #{sql_type}" add_column_options!(sql, column_options(col)) -- cgit v1.2.3 From 2ac300ba7cd867c6606b7d7fb458b4a0412c766d Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Sat, 16 Mar 2013 17:04:04 -0700 Subject: push the mysql add_column up to the abstract adapter --- .../active_record/connection_adapters/abstract_adapter.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'activerecord/lib/active_record/connection_adapters/abstract_adapter.rb') diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb index 3dc284b4ce..0ebe46be55 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb @@ -115,14 +115,13 @@ module ActiveRecord def visit_AlterTable(o) sql = "ALTER TABLE #{quote_table_name(o.name)} " + sql << o.adds.map { |col| visit_AddColumn col }.join(' ') + end - o.adds.each do |col| - sql_type = type_to_sql(col.type.to_sym, col.limit, col.precision, col.scale) - sql << "ADD #{quote_column_name(col.name)} #{sql_type}" - add_column_options!(sql, column_options(col)) - end - - sql + 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) @@ -162,6 +161,7 @@ module ActiveRecord def add_column_options!(column_sql, column_options) @conn.add_column_options! column_sql, column_options + column_sql end end -- cgit v1.2.3