aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/schema_dumper.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib/active_record/schema_dumper.rb')
-rw-r--r--activerecord/lib/active_record/schema_dumper.rb87
1 files changed, 87 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/schema_dumper.rb b/activerecord/lib/active_record/schema_dumper.rb
new file mode 100644
index 0000000000..e086c17841
--- /dev/null
+++ b/activerecord/lib/active_record/schema_dumper.rb
@@ -0,0 +1,87 @@
+module ActiveRecord
+
+ # This class is used to dump the database schema for some connection to some
+ # output format (i.e., ActiveRecord::Schema).
+ class SchemaDumper
+ private_class_method :new
+
+ def self.dump(connection=ActiveRecord::Base.connection, stream=STDOUT)
+ new(connection).dump(stream)
+ stream
+ end
+
+ def dump(stream)
+ header(stream)
+ tables(stream)
+ trailer(stream)
+ stream
+ end
+
+ private
+
+ def initialize(connection)
+ @connection = connection
+ @types = @connection.native_database_types
+ @info = @connection.select_one("SELECT * FROM schema_info") rescue nil
+ end
+
+ def header(stream)
+ define_params = @info ? ":version => #{@info['version']}" : ""
+
+ stream.puts <<HEADER
+# This file is autogenerated. Instead of editing this file, please use the
+# migrations feature of ActiveRecord to incrementally modify your database, and
+# then regenerate this schema definition.
+
+require 'active_record/schema'
+
+ActiveRecord::Schema.define(#{define_params}) do
+
+HEADER
+ end
+
+ def trailer(stream)
+ stream.puts "end"
+ end
+
+ def tables(stream)
+ @connection.tables.sort.each do |tbl|
+ next if tbl == "schema_info"
+ 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.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
+ stream.print ", :null => false" if !column.null
+ stream.puts
+ end
+
+ stream.puts " end"
+ stream.puts
+
+ indexes(table, stream)
+ end
+
+ def indexes(table, stream)
+ indexes = @connection.indexes(table)
+ indexes.each do |index|
+ stream.print " add_index #{index.table.inspect}, #{index.columns.inspect}, :name => #{index.name.inspect}"
+ stream.print ", :unique => true" if index.unique
+ stream.puts
+ end
+ stream.puts unless indexes.empty?
+ end
+ end
+
+end