diff --git a/diesel/src/connection/sqlite/raw.rs b/diesel/src/connection/sqlite/raw.rs index 5cfca558eb60..afcb0d15ca69 100644 --- a/diesel/src/connection/sqlite/raw.rs +++ b/diesel/src/connection/sqlite/raw.rs @@ -2,6 +2,7 @@ extern crate libsqlite3_sys as ffi; extern crate libc; use std::ffi::{CString, CStr}; +use std::io::{stderr, Write}; use std::{ptr, str}; use result::*; @@ -33,22 +34,20 @@ impl RawConnection { pub fn exec(&self, query: &str) -> QueryResult<()> { let mut err_msg = ptr::null_mut(); let query = try!(CString::new(query)); + let callback_fn = None; + let callback_arg = ptr::null_mut(); unsafe { ffi::sqlite3_exec( self.internal_connection, query.as_ptr(), - None, - ptr::null_mut(), + callback_fn, + callback_arg, &mut err_msg, ); } if !err_msg.is_null() { - let msg = unsafe { - let bytes = CStr::from_ptr(err_msg).to_bytes(); - str::from_utf8_unchecked(bytes).into() - }; - unsafe { ffi::sqlite3_free(err_msg as *mut libc::c_void) }; + let msg = convert_to_string_and_free(err_msg); Err(DatabaseError(msg)) } else { Ok(()) @@ -69,3 +68,12 @@ impl Drop for RawConnection { } } } + +fn convert_to_string_and_free(err_msg: *const libc::c_char) -> String { + let msg = unsafe { + let bytes = CStr::from_ptr(err_msg).to_bytes(); + str::from_utf8_unchecked(bytes).into() + }; + unsafe { ffi::sqlite3_free(err_msg as *mut libc::c_void) }; + msg +}