aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record
diff options
context:
space:
mode:
authorTobias Lütke <tobias.luetke@gmail.com>2005-12-24 16:55:55 +0000
committerTobias Lütke <tobias.luetke@gmail.com>2005-12-24 16:55:55 +0000
commit87535f50e92f7567d817b455e4f7f4a44371710f (patch)
treef225d8032f3ef489a7ff84622702488b3fe78cb2 /activerecord/lib/active_record
parentac963f06233d24f26570901a60edabed4792688d (diff)
downloadrails-87535f50e92f7567d817b455e4f7f4a44371710f.tar.gz
rails-87535f50e92f7567d817b455e4f7f4a44371710f.tar.bz2
rails-87535f50e92f7567d817b455e4f7f4a44371710f.zip
SchemaDumper now doesn't fail anymore when there are unknown column types in the schema. Instead the table is ignored and a Comment is left in the schema.rb also added ActiveRecord::Base.schema_ignore_tables for dealing with funky tables like the tesearch2 ones.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3346 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord/lib/active_record')
-rwxr-xr-xactiverecord/lib/active_record/base.rb6
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb3
-rw-r--r--activerecord/lib/active_record/schema_dumper.rb56
3 files changed, 46 insertions, 19 deletions
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb
index a08cd0f2df..3beabda380 100755
--- a/activerecord/lib/active_record/base.rb
+++ b/activerecord/lib/active_record/base.rb
@@ -332,6 +332,12 @@ module ActiveRecord #:nodoc:
cattr_accessor :schema_format
@@schema_format = :sql
+ # A list of tables which should not be dumped to the schema.
+ # Acceptable values are strings as well as regexp.
+ # This setting is only used if schema_format == :ruby
+ cattr_accessor :schema_ignore_tables
+ @@schema_ignore_tables = []
+
class << self # Class methods
# Find operates with three different retrieval approaches:
#
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb
index df79f27576..16a41446a8 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb
@@ -4,7 +4,7 @@ module ActiveRecord
module ConnectionAdapters #:nodoc:
# An abstract definition of a column in a table.
class Column
- attr_reader :name, :default, :type, :limit, :null
+ attr_reader :name, :default, :type, :limit, :null, :sql_type
attr_accessor :primary
# Instantiates a new column in the table.
@@ -15,6 +15,7 @@ module ActiveRecord
# +null+ determines if this column allows +NULL+ values.
def initialize(name, default, sql_type = nil, null = true)
@name, @type, @null = name, simplified_type(sql_type), null
+ @sql_type = sql_type
# have to do this one separately because type_cast depends on #type
@default = type_cast(default)
@limit = extract_limit(sql_type) unless sql_type.nil?
diff --git a/activerecord/lib/active_record/schema_dumper.rb b/activerecord/lib/active_record/schema_dumper.rb
index cd6a665a8c..4898bea203 100644
--- a/activerecord/lib/active_record/schema_dumper.rb
+++ b/activerecord/lib/active_record/schema_dumper.rb
@@ -3,6 +3,7 @@ module ActiveRecord
# output format (i.e., ActiveRecord::Schema).
class SchemaDumper #:nodoc:
private_class_method :new
+
def self.dump(connection=ActiveRecord::Base.connection, stream=STDOUT)
new(connection).dump(stream)
@@ -43,32 +44,51 @@ HEADER
def tables(stream)
@connection.tables.sort.each do |tbl|
- next if tbl == "schema_info"
+ next if ["schema_info", Base.schema_ignore_tables].flatten.any? do |ignored|
+ case ignored
+ when String: tbl == ignored
+ when Regexp: tbl =~ ignored
+ else
+ raise StandardError, 'ActiveRecord::Base.schema_ignore_tables accepts an array of String and / or Regexp values.'
+ end
+ end
table(tbl, stream)
end
end
def table(table, stream)
columns = @connection.columns(table)
-
- stream.print " create_table #{table.inspect}"
- stream.print ", :id => false" if !columns.detect { |c| c.name == "id" }
- stream.print ", :force => true"
- stream.puts " do |t|"
-
- columns.each do |column|
- next if column.name == "id"
- stream.print " t.column #{column.name.inspect}, #{column.type.inspect}"
- stream.print ", :limit => #{column.limit.inspect}" if column.limit != @types[column.type][:limit]
- stream.print ", :default => #{column.default.inspect}" if !column.default.nil?
- stream.print ", :null => false" if !column.null
+ begin
+ tbl = StringIO.new
+ tbl.print " create_table #{table.inspect}"
+ tbl.print ", :id => false" if !columns.detect { |c| c.name == "id" }
+ tbl.print ", :force => true"
+ tbl.puts " do |t|"
+
+ columns.each do |column|
+ raise StandardError, "Unknown type '#{column.sql_type}' for column '#{column.name}'" if @types[column.type].nil?
+ next if column.name == "id"
+ tbl.print " t.column #{column.name.inspect}, #{column.type.inspect}"
+ tbl.print ", :limit => #{column.limit.inspect}" if column.limit != @types[column.type][:limit]
+ tbl.print ", :default => #{column.default.inspect}" if !column.default.nil?
+ tbl.print ", :null => false" if !column.null
+ tbl.puts
+ end
+
+ tbl.puts " end"
+ tbl.puts
+
+ indexes(table, tbl)
+
+ tbl.rewind
+ stream.print tbl.read
+ rescue => e
+ stream.puts "# Could not dump table #{table.inspect} because of following #{e.class}"
+ stream.puts "# #{e.message}"
stream.puts
end
-
- stream.puts " end"
- stream.puts
-
- indexes(table, stream)
+
+ stream
end
def indexes(table, stream)