class SQLite3::Statement

Public Class Methods

new(db, sql, params) click to toggle source
# File lib/motion-sqlite3/statement.rb, line 3
def initialize(db, sql, params)
  @db = db
  @handle = Pointer.new(::Sqlite3_stmt.type)
  @result = nil

  prepare(sql)
  bind(params)
end

Public Instance Methods

done?() click to toggle source
# File lib/motion-sqlite3/statement.rb, line 12
def done?
  @result == SQLITE_DONE
end
execute() click to toggle source
# File lib/motion-sqlite3/statement.rb, line 16
def execute
  step

  ResultSet.new(self, @handle)
end
finalize() click to toggle source
# File lib/motion-sqlite3/statement.rb, line 22
def finalize
  sqlite3_finalize(@handle.value_with_autorelease)
end
step() click to toggle source
# File lib/motion-sqlite3/statement.rb, line 26
def step
  @result = sqlite3_step(@handle.value_with_autorelease)
  unless @result == SQLITE_DONE || @result == SQLITE_ROW
    raise SQLite3Error, sqlite3_errmsg(@db.value_with_autorelease)
  end
end

Private Instance Methods

bind(params) click to toggle source
# File lib/motion-sqlite3/statement.rb, line 35
def bind(params)
  case params
  when Hash
    params.each { |name, value| bind_parameter(name, value) }
  when Array
    params.each_with_index { |value, i| bind_parameter(i+1, value) }
  when NilClass
  else
    raise ArgumentError, "params must be either a Hash or an Array"
  end
end
bind_parameter(name, value) click to toggle source
# File lib/motion-sqlite3/statement.rb, line 47
def bind_parameter(name, value)
  index = column_index(name)

  case value
  when NilClass
    result = sqlite3_bind_null(@handle.value_with_autorelease, index)
  when String, Symbol
    result = sqlite3_bind_text(@handle.value_with_autorelease, index, value, -1, lambda { |arg| })
  when Integer
    result = sqlite3_bind_int64(@handle.value_with_autorelease, index, value)
  when Float
    result = sqlite3_bind_double(@handle.value_with_autorelease, index, value)
  when NSDatavalue
    result = sqlite3_bind_blob(@handle.value_with_autorelease, index, value.bytes, value.length, lambda { |arg| })
  else
    raise SQLite3Error, "unable to bind #{value} to #{name}: unexpected type #{value.class}"
  end

  raise SQLite3Error, sqlite3_errmsg(@db.value_with_autorelease) if result != SQLITE_OK
end
column_index(name) click to toggle source
# File lib/motion-sqlite3/statement.rb, line 68
def column_index(name)
  index = 0

  case name
  when String, Symbol
    index = sqlite3_bind_parameter_index(@handle.value_with_autorelease, ":#{name}")
    raise SQLite3Error, "couldn't find index for #{name}!" if index == 0

  when Integer
    index = name
  end

  index
end
prepare(sql) click to toggle source
# File lib/motion-sqlite3/statement.rb, line 83
def prepare(sql)
  remainder = Pointer.new(:string)
  result = sqlite3_prepare_v2(@db.value_with_autorelease, sql, -1, @handle, remainder)
  raise SQLite3Error, sqlite3_errmsg(@db.value_with_autorelease) if result != SQLITE_OK
end