class PgSqlCaller::Base

Constants

CONNECTION_SQL_METHODS

Public Class Methods

define_sql_methods(*names) click to toggle source
# File lib/pg_sql_caller/base.rb, line 39
def define_sql_methods(*names)
  names.each do |name|
    define_method(name) do |sql, *bindings|
      sql = sanitize_sql_array(sql, *bindings) if bindings.any?
      connection.send(name, sql)
    end
  end
end
delegate(*names, **options) click to toggle source

@names [Array] method names

# File lib/pg_sql_caller/base.rb, line 25
def delegate(*names, **options)
  raise ArgumentError, 'provide at least one method name' if names.empty?

  target = options.fetch(:to)
  type = options.fetch(:type, :instance)
  raise ArgumentError, ':type can be :single or :instance' unless [:single, :instance].include?(type)

  if type == :instance
    instance_delegate names => target
  else
    single_delegate names => target
  end
end
model_class(klass) click to toggle source

@param klass [Class<ActiveRecord::Base>, String] class or class name

# File lib/pg_sql_caller/base.rb, line 49
def model_class(klass)
  self._model_class = klass
end

Public Instance Methods

current_database_name() click to toggle source
# File lib/pg_sql_caller/base.rb, line 137
def current_database_name
  select_value('SELECT current_database();')
end
explain_analyze(sql) click to toggle source
# File lib/pg_sql_caller/base.rb, line 122
def explain_analyze(sql)
  result = select_values("EXPLAIN ANALYZE #{sql}")
  ['QUERY_PLAN', *result].join("\n")
end
next_sequence_value(table_name) click to toggle source
# File lib/pg_sql_caller/base.rb, line 100
def next_sequence_value(table_name)
  select_value("SELECT last_value FROM #{table_name}_id_seq") + 1
end
sanitize_sql_array(sql, *bindings) click to toggle source
# File lib/pg_sql_caller/base.rb, line 133
def sanitize_sql_array(sql, *bindings)
  model_class.send :sanitize_sql_array, bindings.unshift(sql)
end
select_all_serialized(sql, *bindings) click to toggle source
# File lib/pg_sql_caller/base.rb, line 79
def select_all_serialized(sql, *bindings)
  result = select_all(sql, *bindings)
  result.map do |row|
    row.map { |key, value| [key.to_sym, deserialize_result(result, key, value)] }.to_h
  end
end
select_row(sql, *bindings) click to toggle source
# File lib/pg_sql_caller/base.rb, line 112
def select_row(sql, *bindings)
  select_rows(sql, *bindings)[0]
end
select_value_serialized(sql, *bindings) click to toggle source
# File lib/pg_sql_caller/base.rb, line 86
def select_value_serialized(sql, *bindings)
  result = select_all(sql, *bindings)
  key = result.first.keys.first
  value = result.first.values.first
  deserialize_result(result, key, value)
end
select_values_serialized(sql, *bindings) click to toggle source
# File lib/pg_sql_caller/base.rb, line 93
def select_values_serialized(sql, *bindings)
  result = select_all(sql, *bindings)
  result.map do |row|
    row.map { |key, value| deserialize_result(result, key, value) }
  end
end
table_data_size(table_name) click to toggle source
# File lib/pg_sql_caller/base.rb, line 108
def table_data_size(table_name)
  select_value('SELECT pg_relation_size(?)', table_name)
end
table_full_size(table_name) click to toggle source
# File lib/pg_sql_caller/base.rb, line 104
def table_full_size(table_name)
  select_value('SELECT pg_total_relation_size(?)', table_name)
end
transaction() { || ... } click to toggle source
# File lib/pg_sql_caller/base.rb, line 116
def transaction
  raise ArgumentError, 'block must be given' unless block_given?

  connection.transaction { yield }
end
transaction_open?() click to toggle source
# File lib/pg_sql_caller/base.rb, line 75
def transaction_open?
  connection.send(:transaction_open?)
end
typecast_array(values, type:) click to toggle source
# File lib/pg_sql_caller/base.rb, line 127
def typecast_array(values, type:)
  type = ActiveRecord::Type.lookup(type, array: true)
  data = type.serialize(values)
  data.encoder.encode(data.values)
end

Private Instance Methods

deserialize_result(result, column_name, raw_value) click to toggle source
# File lib/pg_sql_caller/base.rb, line 145
def deserialize_result(result, column_name, raw_value)
  column_type = result.column_types[column_name]
  return raw_value if column_type.nil?

  column_type.deserialize(raw_value)
end
model_class() click to toggle source
# File lib/pg_sql_caller/base.rb, line 152
def model_class
  return @model_class if defined?(@model_class)

  raise NotImplementedError, "define model_class in #{self.class}" if _model_class.nil?

  @model_class = _model_class.is_a?(String) ? _model_class.constantize : _model_class
end