diff options
| author | Robert | 2017-06-08 10:51:27 +0200 | 
|---|---|---|
| committer | Robert | 2017-06-08 10:51:27 +0200 | 
| commit | 38e5a5329541a54f98d771c3aa252b91b823b94f (patch) | |
| tree | d99a9223a7c58d0c029f6401bde9a2aa69da98bb /lib/af83/schema_cloner.rb | |
| parent | 15b7cf8213d730fa36740a74bc75baa5fc56dd62 (diff) | |
| download | chouette-core-38e5a5329541a54f98d771c3aa252b91b823b94f.tar.bz2 | |
Refs: #3604 @2h  checking sequences as defaults
Diffstat (limited to 'lib/af83/schema_cloner.rb')
| -rw-r--r-- | lib/af83/schema_cloner.rb | 96 | 
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  | 
