Class: SQLRunner::Adapters::PostgreSQL

Inherits:
Object
  • Object
show all
Defined in:
lib/sql_runner/adapters/postgresql.rb

Constant Summary collapse

InvalidPreparedStatement =
Class.new(StandardError)

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(connection_string) ⇒ PostgreSQL

Returns a new instance of PostgreSQL.



14
15
16
17
# File 'lib/sql_runner/adapters/postgresql.rb', line 14

def initialize(connection_string)
  @connection_string = connection_string
  connect
end

Class Method Details

.loadObject



8
9
10
11
12
# File 'lib/sql_runner/adapters/postgresql.rb', line 8

def self.load
  require "pg"
rescue LoadError
  raise MissingDependency, "make sure the `pg` gem is available"
end

Instance Method Details

#active?Boolean

Returns:

  • (Boolean)


48
49
50
51
52
# File 'lib/sql_runner/adapters/postgresql.rb', line 48

def active?
  @connection && @connection.status == PG::Connection::CONNECTION_OK
rescue PGError
  false
end

#connect(started = Process.clock_gettime(Process::CLOCK_MONOTONIC)) ⇒ Object



19
20
21
22
23
24
25
26
27
28
# File 'lib/sql_runner/adapters/postgresql.rb', line 19

def connect(started = Process.clock_gettime(Process::CLOCK_MONOTONIC))
  @connection = PG.connect(@connection_string)
rescue PG::ConnectionBad
  ended = Process.clock_gettime(Process::CLOCK_MONOTONIC)

  raise unless ended - started < SQLRunner.timeout

  sleep 0.1
  connect(started)
end

#disconnectObject



30
31
32
# File 'lib/sql_runner/adapters/postgresql.rb', line 30

def disconnect
  @connection&.close && (@connection = nil)
end

#execute(query, **bind_vars) ⇒ Object



39
40
41
42
43
44
45
46
# File 'lib/sql_runner/adapters/postgresql.rb', line 39

def execute(query, **bind_vars)
  bound_query, bindings = parse(query)
  args = extract_args(query, bindings, bind_vars)
  @connection.exec_params(bound_query, args)
rescue PG::ConnectionBad
  reconnect
  execute(query, **bind_vars)
end

#inspectObject



58
59
60
# File 'lib/sql_runner/adapters/postgresql.rb', line 58

def inspect
  to_s
end

#parse(query) ⇒ Object

rubocop:disable Metrics/MethodLength



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/sql_runner/adapters/postgresql.rb', line 62

def parse(query) # rubocop:disable Metrics/MethodLength
  bindings = {}
  count = 0

  parsed_query = query.gsub(/(:?):([a-zA-Z]\w*)/) do |match|
    next match if Regexp.last_match(1) == ":" # skip type casting

    name = match[1..-1]
    sym_name = name.to_sym

    unless (index = bindings[sym_name])
      index = (count += 1)
      bindings[sym_name] = index
    end

    "$#{index}"
  end

  [parsed_query, bindings]
end

#reconnectObject



34
35
36
37
# File 'lib/sql_runner/adapters/postgresql.rb', line 34

def reconnect
  disconnect
  connect
end

#to_sObject



54
55
56
# File 'lib/sql_runner/adapters/postgresql.rb', line 54

def to_s
  %[#<#{self.class.name} #{format('0x00%x', (object_id << 1))}>]
end