lib/gdk/postgresql.rb (86 lines of code) (raw):

# frozen_string_literal: true module GDK class Postgresql def self.target_version Gem::Version.new(Asdf::ToolVersions.new.default_version_for('postgres')) end def self.target_version_major target_version.canonical_segments[0] end def initialize(config = GDK.config) @config = config end def psql_cmd(args, database: default_database) pg_cmd(args, database: database).flatten end def current_data_dir @current_data_dir ||= postgresql_config.data_dir end def current_version @current_version ||= begin raise "PG_VERSION not found in #{pg_version_file}. Is PostgreSQL initialized?" unless installed? version = pg_version_file.read.to_f # After PostgreSQL 9.6, PG_VERSION uses a single integer (10, 11, 12, etc.) version >= 10 ? version.to_i : version end end def installed? pg_version_file.exist? end def ready?(try_times: 10, interval: 1, quiet: false) last_error = nil cmd = pg_cmd(database: 'template1') try_times.times do |i| sleep(interval) if i.positive? shellout = Shellout.new(cmd).tap(&:try_run) last_error = shellout.read_stderr return true if shellout.success? end GDK::Output.error(last_error) unless quiet false end def use_tcp? !postgresql_config.host.start_with?('/') end def upgrade_needed?(target_version = self.class.target_version_major) current_version < target_version.to_f end def upgrade cmd = 'support/upgrade-postgresql' Shellout.new(cmd).stream end def db_exists?(dbname) Shellout.new(pg_cmd(database: dbname)).tap(&:try_run).success? end def createdb(*args) cmd = pg_cmd(*args, program: 'createdb') Shellout.new(cmd).run end def in_recovery? cmd = pg_cmd('--no-psqlrc', '--tuples-only', database: 'postgres', command: 'SELECT pg_is_in_recovery();') Shellout.new(cmd).try_run.downcase.strip.chomp == 't' end private attr_reader :config def base_postgresql_config @base_postgresql_config ||= config.postgresql end def postgresql_config @postgresql_config ||= base_postgresql_config end def pg_version_file @pg_version_file ||= current_data_dir.join('PG_VERSION') end def pg_cmd(*args, program: 'psql', database: nil, command: nil) cmd = [base_postgresql_config.bin_dir.join(program).to_s] cmd << "--host=#{postgresql_config.dir}" cmd << "--port=#{postgresql_config.port}" cmd << "--dbname=#{database}" if database cmd << "--command=#{command}" if command cmd + args end def default_database 'gitlabhq_development' end end end