aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorRobert2017-06-08 10:51:27 +0200
committerRobert2017-06-08 10:51:27 +0200
commit38e5a5329541a54f98d771c3aa252b91b823b94f (patch)
treed99a9223a7c58d0c029f6401bde9a2aa69da98bb /lib
parent15b7cf8213d730fa36740a74bc75baa5fc56dd62 (diff)
downloadchouette-core-38e5a5329541a54f98d771c3aa252b91b823b94f.tar.bz2
Refs: #3604 @2h checking sequences as defaults
Diffstat (limited to 'lib')
-rw-r--r--lib/af83/schema_cloner.rb96
1 files changed, 87 insertions, 9 deletions
diff --git a/lib/af83/schema_cloner.rb b/lib/af83/schema_cloner.rb
index 933fffc3d..299e63a82 100644
--- a/lib/af83/schema_cloner.rb
+++ b/lib/af83/schema_cloner.rb
@@ -2,15 +2,34 @@ module AF83
class SchemaCloner
attr_reader :source_schema, :target_schema, :include_records
- def clone_schema(source_schema, target_schema, include_records: true)
- @source_schema = source_schema
- @target_schema = target_schema
- @include_records = include_records
- clone_schema_
+ def clone_schema
+ assure_schema_preconditons
+ create_target_schema
end
private
+
+ def alter_sequence sequence_name
+ seq_props = execute_get_ostruct( "SELECT * FROM #{source_schema}.#{sequence_name}" )
+ cycle_on_off = seq_props.is_cycled == 't' ? '' : 'NO'
+ seq_value = include_records ? seq_props.last_value : seq_props.start_value
+ execute <<-EOSQL
+ ALTER SEQUENCE #{target_schema}.#{sequence_name}
+ INCREMENT BY #{seq_props.increment_by}
+ MINVALUE #{seq_props.min_value}
+ MAXVALUE #{seq_props.max_value}
+ START WITH #{seq_props.start_value}
+ RESTART WITH #{seq_props.last_value}
+ CACHE #{seq_props.cache_value}
+ #{cycle_on_off} CYCLE;
+
+
+ SELECT setval('#{target_schema}.#{sequence_name}', #{seq_value}, '#{seq_props.is_called}');
+
+ EOSQL
+ end
+
def assure_schema_preconditons
raise RuntimeError, "Target Schema #{target_schema} does already exist" unless
execute("SELECT oid FROM pg_namespace WHERE nspname = '#{target_schema}' LIMIT 1").empty?
@@ -18,21 +37,80 @@ module AF83
raise RuntimeError, "Source Schema #{source_schema} does not exist" unless source
end
- def clone_schema_
- assure_schema_preconditons
+ def clone_foreign_keys
+
end
- def connection
- @__connection__ ||= ActiveRecord::Base.connection
+
+ def clone_sequence sequence_name
+ create_sequence sequence_name
+ alter_sequence sequence_name
+ end
+ def clone_sequences
+ source_sequence_names.each(&method(:clone_sequence))
+ end
+
+ def clone_table table_name
+ create_table table_name
+
+ end
+ def clone_tables
+ table_names.each(&method(:clone_table))
+ end
+
+ def create_sequence sequence_name
+ execute "CREATE SEQUENCE #{target_schema}.#{sequence_name}"
+ end
+ def create_table table_name
+ execute "CREATE TABLE #{target_schema}.#{table_name} (LIKE #{source_schema}.#{table_name} INCLUDING ALL)"
+ return unless include_records
+ execute "INSERT INTO #{target_schema}.#{table_name} SELECT * FROM #{source_schema}.#{table_name}"
+ end
+ def create_target_schema
+ execute("CREATE SCHEMA #{target_schema}")
+ clone_sequences
+ clone_tables
+ clone_foreign_keys
end
def execute(str)
connection.execute(str).to_a
end
+ def execute_get_first(str)
+ execute(str).first
+ end
+ def execute_get_ostruct(str)
+ OpenStruct.new(execute_get_first(str))
+ end
+ def execute_get_values(str)
+ execute(str).flat_map(&:values)
+ end
+
+ def initialize(source_schema, target_schema, include_records: true)
+ @source_schema = source_schema
+ @target_schema = target_schema
+ @include_records = include_records
+ end
+
+ #
+ # Memvars
+ # -------
+ def connection
+ @__connection__ ||= ActiveRecord::Base.connection
+ end
def source
@__source__ ||= execute("SELECT oid FROM pg_namespace WHERE nspname = '#{source_schema}' LIMIT 1").first;
end
+ def source_sequence_names
+ @__source_sequence_names__ ||=
+ execute_get_values \
+ "SELECT sequence_name::text FROM information_schema.sequences WHERE sequence_schema = '#{source_schema}'"
+ end
def source_oid
@__source_oid__ ||= source["oid"].to_i;
end
+ def table_names
+ @__table_names__ ||= execute_get_values \
+ "SELECT TABLE_NAME::text FROM information_schema.tables WHERE table_schema = '#{ source_schema }' AND table_type = 'BASE TABLE'"
+ end
end
end