| 3382 | } |
| 3383 | |
| 3384 | fn value_to_object(val: *mut sqlite3_value, db: *mut sqlite3, vm: &VirtualMachine) -> PyResult { |
| 3385 | let obj = unsafe { |
| 3386 | match sqlite3_value_type(val) { |
| 3387 | SQLITE_INTEGER => vm.ctx.new_int(sqlite3_value_int64(val)).into(), |
| 3388 | SQLITE_FLOAT => vm.ctx.new_float(sqlite3_value_double(val)).into(), |
| 3389 | SQLITE_TEXT => { |
| 3390 | let text = |
| 3391 | ptr_to_vec(sqlite3_value_text(val), sqlite3_value_bytes(val), db, vm)?; |
| 3392 | let text = String::from_utf8(text) |
| 3393 | .map_err(|_| vm.new_value_error("invalid utf-8 with SQLITE_TEXT"))?; |
| 3394 | vm.ctx.new_str(text).into() |
| 3395 | } |
| 3396 | SQLITE_BLOB => { |
| 3397 | let blob = ptr_to_vec( |
| 3398 | sqlite3_value_blob(val).cast(), |
| 3399 | sqlite3_value_bytes(val), |
| 3400 | db, |
| 3401 | vm, |
| 3402 | )?; |
| 3403 | vm.ctx.new_bytes(blob).into() |
| 3404 | } |
| 3405 | _ => vm.ctx.none(), |
| 3406 | } |
| 3407 | }; |
| 3408 | Ok(obj) |
| 3409 | } |
| 3410 | |
| 3411 | fn ptr_to_str<'a>(p: *const libc::c_char, vm: &VirtualMachine) -> PyResult<&'a str> { |
| 3412 | if p.is_null() { |