Class: SQLite3::Driver::FFI::Driver
- Inherits:
-
Object
- Object
- SQLite3::Driver::FFI::Driver
- Defined in:
- lib/sqlite3/driver/ffi/driver.rb
Constant Summary collapse
- STATIC =
0
- TRANSIENT =
-1
Class Method Summary collapse
Instance Method Summary collapse
- #aggregate_context(context) ⇒ Object
- #bind_blob(stmt, index, value) ⇒ Object
- #bind_text(stmt, index, value, utf16 = false) ⇒ Object
- #busy_handler(db, data = nil, &block) ⇒ Object
- #column_blob(stmt, column) ⇒ Object
- #column_decltype(stmt, column) ⇒ Object
- #column_name(stmt, column) ⇒ Object
- #column_text(stmt, column) ⇒ Object
- #complete?(sql, utf16 = false) ⇒ Boolean
- #create_function(db, name, args, text, cookie, func, step, final) ⇒ Object
- #errmsg(db, utf16 = false) ⇒ Object
- #open(filename, utf16 = false) ⇒ Object
- #prepare(db, sql, utf16 = false) ⇒ Object
- #result_text(func, text, utf16 = false) ⇒ Object
- #set_authorizer(db, data = nil, &block) ⇒ Object
- #trace(db, data = nil, &block) ⇒ Object
- #value_blob(value) ⇒ Object
- #value_text(value, utf16 = false) ⇒ Object
Class Method Details
.api_delegate(name) ⇒ Object
203 204 205 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 203 def self.api_delegate(name) define_method(name) { |*args| API.send("sqlite3_#{name}", *args) } end |
Instance Method Details
#aggregate_context(context) ⇒ Object
166 167 168 169 170 171 172 173 174 175 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 166 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 |
#bind_blob(stmt, index, value) ⇒ Object
177 178 179 180 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 177 def bind_blob(stmt, index, value) s = value.to_s API.sqlite3_bind_blob(stmt, index, s, s.length, TRANSIENT) end |
#bind_text(stmt, index, value, utf16 = false) ⇒ Object
182 183 184 185 186 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 182 def bind_text(stmt, index, value, utf16 = false) s = value.to_s method = (utf16 ? :sqlite3_bind_text16 : :sqlite3_bind_text) API.send(method, stmt, index, s, s.length, TRANSIENT) end |
#busy_handler(db, data = nil, &block) ⇒ Object
94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 94 def busy_handler(db, data = nil, &block) @busy_handler = block unless @busy_handler_callback @busy_handler_callback = ::DL.callback("IPI") do |, timeout| @busy_handler.call(, timeout) || 0 end end API.sqlite3_busy_handler(db, block&&@busy_handler_callback, data) end |
#column_blob(stmt, column) ⇒ Object
72 73 74 75 76 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 72 def column_blob(stmt, column) blob = API.sqlite3_column_blob(stmt, column) blob.free = nil blob.to_s(API.sqlite3_column_bytes(stmt, column)) end |
#column_decltype(stmt, column) ⇒ Object
198 199 200 201 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 198 def column_decltype(stmt, column) result = API.sqlite3_column_decltype(stmt, column) result ? result.to_s : nil end |
#column_name(stmt, column) ⇒ Object
193 194 195 196 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 193 def column_name(stmt, column) result = API.sqlite3_column_name(stmt, column) result ? result.to_s : nil end |
#column_text(stmt, column) ⇒ Object
188 189 190 191 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 188 def column_text(stmt, column) result = API.sqlite3_column_text(stmt, column) result ? result.to_s : nil end |
#complete?(sql, utf16 = false) ⇒ Boolean
40 41 42 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 40 def complete?(sql, utf16 = false) API.send(utf16 ? :sqlite3_complete16 : :sqlite3_complete, sql) end |
#create_function(db, name, args, text, cookie, func, step, final) ⇒ Object
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 130 def create_function(db, name, args, text, , func, step, final) # begin if @func_handler_callback.nil? && func @func_handler_callback = ::DL.callback("0PIP") do |context,nargs,args| args = args.to_s(nargs*4).unpack("L*").map {|i| ::FFI::MemoryPointer.new(i)} data = API.sqlite3_user_data(context).to_object data[:func].call(context, *args) end end if @step_handler_callback.nil? && step @step_handler_callback = ::DL.callback("0PIP") do |context,nargs,args| args = args.to_s(nargs*4).unpack("L*").map {|i| ::FFI::MemoryPointer.new(i)} data = API.sqlite3_user_data(context).to_object data[:step].call(context, *args) end end if @final_handler_callback.nil? && final @final_handler_callback = ::DL.callback("0P") do |context| data = API.sqlite3_user_data(context).to_object data[:final].call(context) end end data = { :cookie => , :name => name, :func => func, :step => step, :final => final } API.sqlite3_create_function(db, name, args, text, data, (func ? @func_handler_callback : nil), (step ? @step_handler_callback : nil), (final ? @final_handler_callback : nil)) end |
#errmsg(db, utf16 = false) ⇒ Object
17 18 19 20 21 22 23 24 25 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 17 def errmsg(db, utf16 = false) if utf16 msg = API.sqlite3_errmsg16(db) msg.free = nil msg.to_s(utf16_length(msg)) else API.sqlite3_errmsg(db) end end |
#open(filename, utf16 = false) ⇒ Object
11 12 13 14 15 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 11 def open(filename, utf16 = false) handle = ::FFI::MemoryPointer.new(:pointer) result = API.send((utf16 ? :sqlite3_open16 : :sqlite3_open), filename, handle) [result, handle.get_pointer(0)] end |
#prepare(db, sql, utf16 = false) ⇒ Object
27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 27 def prepare(db, sql, utf16 = false) handle = ::FFI::MemoryPointer.new(:pointer) remainder = ::FFI::MemoryPointer.new(:pointer) result = API.send((utf16 ? :sqlite3_prepare16 : :sqlite3_prepare), db, sql, sql.length, handle, remainder) # TODO: UTF-16 # args = utf16 ? [utf16_length(remainder)] : [] # remainder = remainder.to_s(*args) [result, handle.get_pointer(0), remainder.get_pointer(0).get_string(0)] end |
#result_text(func, text, utf16 = false) ⇒ Object
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 78 def result_text(func, text, utf16 = false) method = case utf16 when false, nil :sqlite3_result_text when :le :sqlite3_result_text16le when :be :sqlite3_result_text16be else :sqlite3_result_text16 end s = text.to_s API.send(method, func, s, s.length, TRANSIENT) end |
#set_authorizer(db, data = nil, &block) ⇒ Object
106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 106 def (db, data = nil, &block) @authorizer_handler = block unless @authorizer_handler_callback @authorizer_handler_callback = ::DL.callback("IPIPPPP") do |,mode,a,b,c,d| @authorizer_handler.call(, mode, a&&a.to_s, b&&b.to_s, c&&c.to_s, d&&d.to_s) || 0 end end API.(db, block&&@authorizer_handler_callback, data) end |
#trace(db, data = nil, &block) ⇒ Object
118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 118 def trace(db, data = nil, &block) @trace_handler = block unless @trace_handler_callback @trace_handler_callback = ::DL.callback("IPS") do |,sql| @trace_handler.call( ? .to_object : nil, sql) || 0 end end API.sqlite3_trace(db, block&&@trace_handler_callback, data) end |
#value_blob(value) ⇒ Object
44 45 46 47 48 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 44 def value_blob(value) blob = API.sqlite3_value_blob(value) blob.free = nil blob.to_s(API.sqlite3_value_bytes(value)) end |
#value_text(value, utf16 = false) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/sqlite3/driver/ffi/driver.rb', line 50 def value_text(value, utf16 = false) method = case utf16 when nil, false :sqlite3_value_text when :le :sqlite3_value_text16le when :be :sqlite3_value_text16be else :sqlite3_value_text16 end result = API.send(method, value) if utf16 result.free = nil size = API.sqlite3_value_bytes(value) result = result.to_s(size) end result end |