Module: Aikido::Zen::SQL::Dialects

Defined in:
lib/aikido/zen/sql.rb

Defined Under Namespace

Classes: Dialect

Constant Summary collapse

DIALECTS =

Maps easy-to-use Symbols to a struct that keeps both the name and the internal identifier used by libzen.

{
  common: Dialect.new(
    name: "SQL",
    internals_key: 0,
    placeholder_resolver: method(:common_placeholder_resolver)
  ),
  mysql: Dialect.new(
    name: "MySQL",
    internals_key: 8,
    placeholder_resolver: method(:common_placeholder_resolver)
  ),
  postgresql: Dialect.new(
    name: "PostgreSQL",
    internals_key: 9,
    placeholder_resolver: method(:postgresql_placeholder_resolver)
  ),
  sqlite: Dialect.new(
    name: "SQLite",
    internals_key: 12,
    placeholder_resolver: method(:sqlite_placeholder_resolver)
  )
}.freeze

Class Method Summary collapse

Class Method Details

.common_placeholder_resolver(value, placeholder_number, params) ⇒ Object

Parameters:

  • value (String)
  • placeholder_number (Integer, nil)
  • params (Array<Object>, nil)

Returns:

  • (Object)


20
21
22
23
24
# File 'lib/aikido/zen/sql.rb', line 20

def self.common_placeholder_resolver(value, placeholder_number, params)
  return nil unless params

  params[placeholder_number] unless placeholder_number.nil?
end

.fetch(dialect) ⇒ Aikido::Zen::SQL::Dialects::Dialect

Parameters:

  • dialect (Symbol)

Returns:



103
104
105
# File 'lib/aikido/zen/sql.rb', line 103

def self.fetch(dialect)
  DIALECTS.fetch(dialect, DIALECTS[:common])
end

.postgresql_placeholder_resolver(value, placeholder_number, params) ⇒ Object

Parameters:

  • value (String)
  • placeholder_number (Integer, nil)
  • params (Array<Object>, nil)

Returns:

  • (Object)


30
31
32
33
34
35
36
37
38
39
40
# File 'lib/aikido/zen/sql.rb', line 30

def self.postgresql_placeholder_resolver(value, placeholder_number, params)
  return nil unless params

  match = value.match(/^\$(\d+)$/)
  if match
    index = match[1].to_i - 1
    return if index < 0

    params[index]
  end
end

.sqlite_placeholder_resolver(value, placeholder_number, params) ⇒ Object

Parameters:

  • value (String)
  • placeholder_number (Integer, nil)
  • params (Array<Object>, nil)

Returns:

  • (Object)


46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/aikido/zen/sql.rb', line 46

def self.sqlite_placeholder_resolver(value, placeholder_number, params)
  return nil unless params

  return params[placeholder_number] unless placeholder_number.nil?

  case value
  when /^\?(\d+)$/
    match = Regexp.last_match

    index = match[1].to_i - 1
    return if index < 0

    params[index]
  when /^[:@$]([A-Za-z_][A-Za-z0-9_]*)$/
    match = Regexp.last_match

    key = match[1]

    params.flatten.each do |param|
      if Hash === param
        param.each do |param_key, param_value|
          return param_value if param_key.to_s == key
        end
      end
    end
  end
end