Sha256: 67d5cf1285f469d7b3bcc5a96f621515a551b4ee544b083d8653fcce083e786b

Contents?: true

Size: 1.83 KB

Versions: 1

Compression:

Stored size: 1.83 KB

Contents

module SqlMigrations
  # SqlScript class
  #
  class SqlScript < ScriptFile
    def initialize(path, database_name, type)
      super
      @datetime = (@date.to_s + @time.to_s).to_i
    end

    def execute(db)
      @database = db
      return false unless new?
      driver = @database.driver
      begin
        driver.transaction do
          @benchmark = Benchmark.measure do
            statements.each { |query| driver.run(query) }
          end
        end
      rescue
        puts "[-] Error while executing #{@type} #{@name} !"
        raise
      else
        true & on_success
      end
    end

    def statements
      separator = Config.options[:separator]
      if separator
        statements = content.split(separator)
        statements.collect!(&:strip)
        statements.reject(&:empty?)
      else
        [content]
      end
    end

    def self.find(database_name, type)
      scripts = []
      Find.find(Dir.pwd) do |path|
        candidate = new(path, database_name, type)
        scripts << candidate if candidate.valid?
      end
      scripts.sort_by { |file| (file.date + file.time).to_i }
    end

    private

    def new?
      schema = @database.schema_dataset
      last = schema.order(Sequel.asc(:time)).where(type: @type).last
      is_new = schema.where(time: @datetime, type: @type).count == 0
      if is_new && !last.nil?
        if last[:time] > @datetime
          raise "#{@type.capitalize} #{@name} has time BEFORE last one recorded !"
        end
      end
      is_new
    end

    def on_success
      puts "[+] Successfully executed #{@type}, name: #{@name}"
      puts "    #{@type.capitalize} file: #{@date}_#{@time}_#{@name}.sql"
      puts "    Benchmark: #{@benchmark}"
      schema = @database.schema_dataset
      schema.insert(time: @datetime, name: @name, type: @type, executed: DateTime.now)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
sql_migrations-2.2.1 lib/sql_migrations/sql_script.rb