Class: SQLite3::Driver::FFI::Driver
- Inherits:
-
Object
- Object
- SQLite3::Driver::FFI::Driver
- Defined in:
- lib/sqlite3/driver/ffi/driver.rb
Constant Summary collapse
- TRANSIENT =
::FFI::Pointer.new(-1)
Class Method Summary collapse
Instance Method Summary collapse
-
#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.
- #column_blob(stmt, column) ⇒ Object
- #column_text(stmt, column, utf_16 = false) ⇒ Object
- #errmsg(db, utf_16 = false) ⇒ Object
- #open(filename, utf_16 = false) ⇒ Object
- #prepare(db, sql) ⇒ Object
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 |