lib/roomer/schema_dumper.rb in roomer-0.0.11 vs lib/roomer/schema_dumper.rb in roomer-1.0.0
- old
+ new
@@ -1,8 +1,16 @@
module Roomer
class SchemaDumper < ActiveRecord::SchemaDumper
+ def dump(stream)
+ header(stream)
+ tables(stream)
+ views(stream)
+ trailer(stream)
+ stream
+ end
+
protected
def header(stream)
define_params = @version ? ":version => #{@version}" : ""
stream.puts <<HEADER
# It's strongly recommended to check this file into your version control system.
@@ -10,15 +18,51 @@
Roomer::Schema.define(#{define_params}) do
HEADER
end
+ def views(stream)
+ stream.puts <<VIEWS
+ # Database Views
+ # The following statements persist database views across tenants
+
+VIEWS
+ # Make sure search_path is public so schema name gets dumped
+ # along with table names.
+ current_schema = @connection.schema_search_path
+ @connection.schema_search_path = "public"
+ views = @connection.select_all(%{
+ SELECT *
+ FROM pg_views
+ WHERE schemaname = '#{current_schema}';
+ })
+ # Reinstating previous search path to make sure nothing breaks
+ @connection.schema_search_path = current_schema
+ unless views.empty?
+ views.each do |view|
+ stream.puts <<VIEWS
+ execute("CREATE OR REPLACE VIEW \#{ActiveRecord::Base.table_name_prefix}#{view['viewname']} AS #{view['definition'].gsub(/#{current_schema}\./, '#{ActiveRecord::Base.table_name_prefix}')}")
+VIEWS
+ end
+ end
+ end
+
+ def roomer_index_name(index_name)
+ sections = index_name.split(".")
+ if sections.length > 1
+ if sections[0].split("_")[0] == "index"
+ sections[0] = "index"
+ end
+ end
+ sections.join(".")
+ end
+
def indexes(table, stream)
if (indexes = @connection.indexes(table)).any?
add_index_statements = indexes.map do |index|
statement_parts = [ ('add_index ' + index.table.inspect) ]
statement_parts << index.columns.inspect
- statement_parts << (':name => "' + index.name + '"')
+ statement_parts << (':name => "' + roomer_index_name(index.name) + '"')
statement_parts << ':unique => true' if index.unique
index_lengths = index.lengths.compact if index.lengths.is_a?(Array)
if index_lengths.present?
statement_parts << (':length => ' + Hash[*index.columns.zip(index.lengths).flatten].inspect)