Method: Blazer::DataSource#bind_params

Defined in:
lib/blazer/data_source.rb

#bind_params(statement, variables) ⇒ Object



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
# File 'lib/blazer/data_source.rb', line 176

def bind_params(statement, variables)
  if parameter_binding == :positional
    locations = []
    variables.each do |k, v|
      i = 0
      while (idx = statement.index("{#{k}}", i))
        locations << [v, idx]
        i = idx + 1
      end
    end
    variables.each do |k, v|
      statement = statement.gsub("{#{k}}", "?")
    end
    [statement, locations.sort_by(&:last).map(&:first)]
  elsif parameter_binding == :numeric
    variables.each_with_index do |(k, v), i|
      # add trailing space if followed by digit
      # try to keep minimal to avoid fixing invalid queries like SELECT{var}
      statement = statement.gsub(/#{Regexp.escape("{#{k}}")}(\d)/, "$#{i + 1} \\1").gsub("{#{k}}", "$#{i + 1}")
    end
    [statement, variables.values]
  elsif parameter_binding.respond_to?(:call)
    parameter_binding.call(statement, variables)
  elsif parameter_binding.nil?
    [sub_variables(statement, variables), []]
  else
    raise Blazer::Error, "Unknown bind parameters"
  end
end