diff --git a/src/functions.rs b/src/functions.rs index 502b83a..196e639 100644 --- a/src/functions.rs +++ b/src/functions.rs @@ -407,26 +407,24 @@ impl InnerConnection { where F: FnMut(&Context) -> Result, T: ToResult { - extern "C" fn call_boxed_closure(ctx: *mut sqlite3_context, - argc: c_int, - argv: *mut *mut sqlite3_value) + unsafe extern "C" fn call_boxed_closure(ctx: *mut sqlite3_context, + argc: c_int, + argv: *mut *mut sqlite3_value) where F: FnMut(&Context) -> Result, T: ToResult { - unsafe { - let ctx = Context { - ctx: ctx, - args: slice::from_raw_parts(argv, argc as usize), - }; - let boxed_f: *mut F = mem::transmute(ffi::sqlite3_user_data(ctx.ctx)); - assert!(!boxed_f.is_null(), "Internal error - null function pointer"); - match (*boxed_f)(&ctx) { - Ok(r) => r.set_result(ctx.ctx), - Err(e) => { - ffi::sqlite3_result_error_code(ctx.ctx, e.code); - if let Ok(cstr) = str_to_cstring(&e.message) { - ffi::sqlite3_result_error(ctx.ctx, cstr.as_ptr(), -1); - } + let ctx = Context { + ctx: ctx, + args: slice::from_raw_parts(argv, argc as usize), + }; + let boxed_f: *mut F = mem::transmute(ffi::sqlite3_user_data(ctx.ctx)); + assert!(!boxed_f.is_null(), "Internal error - null function pointer"); + match (*boxed_f)(&ctx) { + Ok(r) => r.set_result(ctx.ctx), + Err(e) => { + ffi::sqlite3_result_error_code(ctx.ctx, e.code); + if let Ok(cstr) = str_to_cstring(&e.message) { + ffi::sqlite3_result_error(ctx.ctx, cstr.as_ptr(), -1); } } } diff --git a/src/trace.rs b/src/trace.rs index eac7fc3..0c49ce5 100644 --- a/src/trace.rs +++ b/src/trace.rs @@ -67,9 +67,9 @@ impl Connection { /// There can only be a single tracer defined for each database connection. /// Setting a new tracer clears the old one. pub fn trace(&mut self, trace_fn: Option) { - extern "C" fn trace_callback(p_arg: *mut c_void, z_sql: *const c_char) { - let trace_fn: fn(&str) = unsafe { mem::transmute(p_arg) }; - let c_slice = unsafe { CStr::from_ptr(z_sql).to_bytes() }; + unsafe extern "C" fn trace_callback(p_arg: *mut c_void, z_sql: *const c_char) { + let trace_fn: fn(&str) = mem::transmute(p_arg); + let c_slice = CStr::from_ptr(z_sql).to_bytes(); if let Ok(s) = str::from_utf8(c_slice) { trace_fn(s); } @@ -91,11 +91,11 @@ impl Connection { /// There can only be a single profiler defined for each database connection. /// Setting a new profiler clears the old one. pub fn profile(&mut self, profile_fn: Option) { - extern "C" fn profile_callback(p_arg: *mut c_void, - z_sql: *const c_char, - nanoseconds: u64) { - let profile_fn: fn(&str, Duration) = unsafe { mem::transmute(p_arg) }; - let c_slice = unsafe { CStr::from_ptr(z_sql).to_bytes() }; + unsafe extern "C" fn profile_callback(p_arg: *mut c_void, + z_sql: *const c_char, + nanoseconds: u64) { + let profile_fn: fn(&str, Duration) = mem::transmute(p_arg); + let c_slice = CStr::from_ptr(z_sql).to_bytes(); if let Ok(s) = str::from_utf8(c_slice) { const NANOS_PER_SEC: u64 = 1_000_000_000;