Class: SQLRunner::Adapters::SQLite

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

Direct Known Subclasses

ActiveRecord::SQLite

Constant Summary collapse

InvalidPreparedStatement =
Class.new(StandardError)

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(connection_string) ⇒ SQLite

Returns a new instance of SQLite.



20
21
22
23
24
# File 'lib/sql_runner/adapters/sqlite.rb', line 20

def initialize(connection_string)
  @connection_string = connection_string
  @uri = URI(connection_string)
  connect
end

Class Method Details

.create_connection_pool(timeout:, size:, connection_string:) ⇒ Object



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

def self.create_connection_pool(timeout:, size:, connection_string:)
  ConnectionPool.new(timeout:, size:) do
    new(connection_string)
  end
end

.loadObject



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

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

Instance Method Details

#active?Boolean

Returns:

  • (Boolean)


49
50
51
52
53
# File 'lib/sql_runner/adapters/sqlite.rb', line 49

def active?
  !@connection&.closed?
rescue SQLite3::Exception
  false
end

#connectObject



26
27
28
29
30
31
# File 'lib/sql_runner/adapters/sqlite.rb', line 26

def connect
  @connection = SQLite3::Database.new(
    @uri.hostname || @uri.opaque,
    results_as_hash: true
  )
end

#disconnectObject



33
34
35
# File 'lib/sql_runner/adapters/sqlite.rb', line 33

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

#execute(query, **bind_vars) ⇒ Object



42
43
44
45
46
47
# File 'lib/sql_runner/adapters/sqlite.rb', line 42

def execute(query, **bind_vars)
  _, _, names = parse(query, bind_vars)
  validate_bindings(query, bind_vars, names)

  @connection.execute(query, **bind_vars)
end

#inspectObject



59
60
61
# File 'lib/sql_runner/adapters/sqlite.rb', line 59

def inspect
  to_s
end

#parse(query, bind_vars) ⇒ Object



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

def parse(query, bind_vars)
  bindings = []
  names = []

  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
    names << sym_name
    bindings << bind_vars[sym_name]

    "?"
  end

  [parsed_query, bindings, names]
end

#reconnectObject



37
38
39
40
# File 'lib/sql_runner/adapters/sqlite.rb', line 37

def reconnect
  disconnect
  connect
end

#to_sObject



55
56
57
# File 'lib/sql_runner/adapters/sqlite.rb', line 55

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