Class: SQLite3::Driver::FFI::Driver

Inherits:
Object
  • Object
show all
Defined in:
lib/sqlite3/driver/ffi/driver.rb

Constant Summary collapse

TRANSIENT =
::FFI::Pointer.new(-1)

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.api_delegate(name) ⇒ Object



135
136
137
# File 'lib/sqlite3/driver/ffi/driver.rb', line 135

def self.api_delegate(name)
  define_method(name) { |*args| API.send("sqlite3_#{name}", *args) }
end

Instance Method Details

#bind_string(stmt, index, value) ⇒ Object

def aggregate_context(context)

ptr = API.sqlite3_aggregate_context(context, 4)
ptr.free = nil
obj = (ptr ? ptr.to_object : nil)
if obj.nil?
  obj = Hash.new
  ptr.set_object obj
end
obj

end



107
108
109
110
111
112
113
114
115
116
117
# File 'lib/sqlite3/driver/ffi/driver.rb', line 107

def bind_string(stmt, index, value)
  case value.encoding
  when Encoding.utf_8, Encoding.us_ascii
    API.sqlite3_bind_text(stmt, index, value, value.bytesize, TRANSIENT)
  when Encoding.utf_16le, Encoding.utf_16be
    value = add_byte_order_mask(value)
    API.sqlite3_bind_text16(stmt, index, value, value.bytesize, TRANSIENT)
  else
    API.sqlite3_bind_blob(stmt, index, value, value.bytesize, TRANSIENT)
  end
end

#column_blob(stmt, column) ⇒ Object



119
120
121
122
123
# File 'lib/sqlite3/driver/ffi/driver.rb', line 119

def column_blob(stmt, column)
  blob = API.sqlite3_column_blob(stmt, column)
  length = API.sqlite3_column_bytes(stmt, column)
  blob.get_bytes(0, length) # free?
end

#column_text(stmt, column, utf_16 = false) ⇒ Object



125
126
127
128
129
130
131
132
133
# File 'lib/sqlite3/driver/ffi/driver.rb', line 125

def column_text(stmt, column, utf_16 = false)
  if utf_16
    ptr = API.sqlite3_column_text16(stmt, column)
    length = API.sqlite3_column_bytes16(stmt, column)
    ptr.get_bytes(0, length).force_encoding(Encoding.utf_16native) # free?
  else
    API.sqlite3_column_text(stmt, column).force_encoding(Encoding.utf_8)
  end
end

#errmsg(db, utf_16 = false) ⇒ Object



22
23
24
25
26
27
28
29
# File 'lib/sqlite3/driver/ffi/driver.rb', line 22

def errmsg(db, utf_16 = false)
  if utf_16
    ptr = API.sqlite3_errmsg16(db)
    get_string_utf_16(ptr).force_encoding(Encoding.utf_16native)
  else
    API.sqlite3_errmsg(db).force_encoding(Encoding.utf_8)
  end
end

#open(filename, utf_16 = false) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
# File 'lib/sqlite3/driver/ffi/driver.rb', line 10

def open(filename, utf_16 = false)
  handle = ::FFI::MemoryPointer.new(:pointer)
  if utf_16
    filename = filename.encode(Encoding.utf_16native)
    result = API.sqlite3_open16(c_string(filename), handle)
  else
    filename = filename.encode(Encoding.utf_8)
    result = API.sqlite3_open(filename, handle)
  end
  [result, handle.get_pointer(0)]
end

#prepare(db, sql) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/sqlite3/driver/ffi/driver.rb', line 31

def prepare(db, sql)
  handle = ::FFI::MemoryPointer.new(:pointer)
  remainder = ::FFI::MemoryPointer.new(:pointer)

  if Encoding.utf_16?(sql)
    str = c_string(sql)
    result = API.sqlite3_prepare16(db, str, str.bytesize, handle, remainder)
    remainder_string = get_string_utf_16(remainder.get_pointer(0))
  else
    result = API.sqlite3_prepare(db, sql, sql.bytesize, handle, remainder)
    remainder_string = remainder.get_pointer(0).get_string(0)
  end

  [result, handle.get_pointer(0), remainder_string]
end