class TestProf::AnyFixture::Dump::PostgreSQL

Constants

UUID_FUNCTIONS

Attributes

uuid_funcs[R]

Public Instance Methods

compile_sql(sql, binds) click to toggle source
# File lib/test_prof/any_fixture/dump/postgresql.rb, line 25
def compile_sql(sql, binds)
  sql.gsub(/\$\d+/) { binds.shift }
end
import(path) click to toggle source
# File lib/test_prof/any_fixture/dump/postgresql.rb, line 29
def import(path)
  # Test if psql is installed
  `psql --version`

  tasks = ActiveRecord::Tasks::PostgreSQLDatabaseTasks.new(conn.pool.spec.config.with_indifferent_access)

  while_disconnected do
    tasks.structure_load(path, "--output=/dev/null")
  end

  true
rescue Errno::ENOENT
  false
end
reset_sequence!(table_name, start) click to toggle source
# File lib/test_prof/any_fixture/dump/postgresql.rb, line 14
        def reset_sequence!(table_name, start)
          _pk, sequence = conn.pk_and_sequence_for(table_name)
          return unless sequence

          sequence_name = "#{sequence.schema}.#{sequence.identifier}"

          execute <<~SQL
            ALTER SEQUENCE #{sequence_name} RESTART WITH #{start}; -- any_fixture:dump
          SQL
        end
setup_env() click to toggle source
# File lib/test_prof/any_fixture/dump/postgresql.rb, line 44
        def setup_env
          # Mock UUID generating functions to provide consistent results
          quoted_functions = UUID_FUNCTIONS.map { |func| "'#{func}'" }.join(", ")

          @uuid_funcs = execute <<~SQL
            SELECT
              pp.proname, pn.nspname,
              pg_get_functiondef(pp.oid) AS definition
            FROM pg_proc pp
            JOIN pg_namespace pn
              ON pn.oid = pp.pronamespace
            WHERE pp.proname in (#{quoted_functions})
            ORDER BY pp.oid;
          SQL

          uuid_funcs.each do |(func, ns, _)|
            execute <<~SQL
              CREATE OR REPLACE FUNCTION #{ns}.#{func}()
                RETURNS UUID
                LANGUAGE SQL
                AS $$
                  SELECT md5(random()::TEXT)::UUID;
                $$; -- any_fixture:dump
            SQL
          end

          execute <<~SQL
            SELECT setseed(#{rand}); -- any_fixture:dump
          SQL
        end
teardown_env() click to toggle source
# File lib/test_prof/any_fixture/dump/postgresql.rb, line 75
def teardown_env
  uuid_funcs.each do |(func, ns, definition)|
    execute "#{definition}; -- any_fixture:dump"
  end
end

Private Instance Methods

execute(query) click to toggle source
# File lib/test_prof/any_fixture/dump/postgresql.rb, line 85
def execute(query)
  super.values
end