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