class TestProf::AnyFixture::Dump::Subscriber
def commit
def commit return unless defined?(:@file) file.close FileUtils.mv(tmp_path, path) end
def file
def file @file ||= File.open(tmp_path, "w") end
def finish(_event, _id, payload)
def finish(_event, _id, payload) sql = payload.fetch(:sql) return unless trackable_sql?(sql) sql = payload[:binds].any? ? adapter.compile_sql(sql, quoted(payload[:binds])) : +sql sql.tr!("\n", " ") file.write(sql + ";\n") end
def initialize(path, adapter)
def initialize(path, adapter) @path = path @adapter = adapter @tmp_path = path + ".tmp" @reset_pk = Set.new end
def quoted(val)
def quoted(val) if val.is_a?(Array) val.map { |v| quoted(v) } elsif val.is_a?(ActiveModel::Attribute) quoted(val.value_for_database) else ActiveRecord::Base.connection.quote(val) end end
def reset_pk!(table_name)
def reset_pk!(table_name) return if /sqlite_sequence/.match?(table_name) return if reset_pk.include?(table_name) adapter.reset_sequence!(table_name, AnyFixture.config.dump_sequence_random_start) reset_pk << table_name end
def start(_event, _id, payload)
def start(_event, _id, payload) sql = payload.fetch(:sql) return if sql.match?(ANY_FIXTURE_IGNORE_RXP) matches = sql.match(MODIFY_RXP) return unless matches reset_pk!(matches[2]) if /insert/i.match?(matches[1]) end
def trackable_sql?(sql)
def trackable_sql?(sql) return false if sql.match?(ANY_FIXTURE_IGNORE_RXP) sql.match?(MODIFY_RXP) || sql.match?(ANY_FIXTURE_RXP) || sql.match?(AnyFixture.config.dump_matching_queries) end