(
self,
pos: c_int,
parameter: &PyObject,
vm: &VirtualMachine,
)
| 3064 | } |
| 3065 | |
| 3066 | fn bind_parameter( |
| 3067 | self, |
| 3068 | pos: c_int, |
| 3069 | parameter: &PyObject, |
| 3070 | vm: &VirtualMachine, |
| 3071 | ) -> PyResult<()> { |
| 3072 | let adapted; |
| 3073 | let obj = if need_adapt(parameter, vm) { |
| 3074 | adapted = _adapt( |
| 3075 | parameter, |
| 3076 | PrepareProtocol::class(&vm.ctx).to_owned(), |
| 3077 | |x| Ok(x.to_owned()), |
| 3078 | vm, |
| 3079 | )?; |
| 3080 | &adapted |
| 3081 | } else { |
| 3082 | parameter |
| 3083 | }; |
| 3084 | |
| 3085 | let ret = if vm.is_none(obj) { |
| 3086 | unsafe { sqlite3_bind_null(self.st, pos) } |
| 3087 | } else if let Some(val) = obj.downcast_ref::<PyInt>() { |
| 3088 | let val = val.try_to_primitive::<i64>(vm).map_err(|_| { |
| 3089 | vm.new_overflow_error("Python int too large to convert to SQLite INTEGER") |
| 3090 | })?; |
| 3091 | unsafe { sqlite3_bind_int64(self.st, pos, val) } |
| 3092 | } else if let Some(val) = obj.downcast_ref::<PyFloat>() { |
| 3093 | let val = val.to_f64(); |
| 3094 | unsafe { sqlite3_bind_double(self.st, pos, val) } |
| 3095 | } else if let Some(val) = obj.downcast_ref::<PyStr>() { |
| 3096 | let val = val.try_as_utf8(vm)?; |
| 3097 | let (ptr, len) = str_to_ptr_len(val, vm)?; |
| 3098 | unsafe { sqlite3_bind_text(self.st, pos, ptr, len, SQLITE_TRANSIENT()) } |
| 3099 | } else if let Ok(buffer) = PyBuffer::try_from_borrowed_object(vm, obj) { |
| 3100 | let (ptr, len) = buffer_to_ptr_len(&buffer, vm)?; |
| 3101 | unsafe { sqlite3_bind_blob(self.st, pos, ptr, len, SQLITE_TRANSIENT()) } |
| 3102 | } else { |
| 3103 | return Err(new_programming_error( |
| 3104 | vm, |
| 3105 | format!( |
| 3106 | "Error binding parameter {}: type '{}' is not supported", |
| 3107 | pos, |
| 3108 | obj.class() |
| 3109 | ), |
| 3110 | )); |
| 3111 | }; |
| 3112 | |
| 3113 | if ret == SQLITE_OK { |
| 3114 | Ok(()) |
| 3115 | } else { |
| 3116 | let db = SqliteRaw::from(self); |
| 3117 | db.check(ret, vm) |
| 3118 | } |
| 3119 | } |
| 3120 | |
| 3121 | fn bind_parameters(self, parameters: &PyObject, vm: &VirtualMachine) -> PyResult<()> { |
| 3122 | if let Some(dict) = parameters.downcast_ref::<PyDict>() { |
no test coverage detected