Merge branch 'smklein-leak'

This commit is contained in:
Ivan Ukhov 2020-05-26 20:04:30 +02:00
commit d396509611
No known key found for this signature in database
GPG Key ID: 00F6548B9D0C1F0A
3 changed files with 27 additions and 14 deletions

View File

@ -28,12 +28,25 @@ impl Connection {
pub fn open_with_flags<T: AsRef<Path>>(path: T, flags: OpenFlags) -> Result<Connection> { pub fn open_with_flags<T: AsRef<Path>>(path: T, flags: OpenFlags) -> Result<Connection> {
let mut raw = 0 as *mut _; let mut raw = 0 as *mut _;
unsafe { unsafe {
ok!(ffi::sqlite3_open_v2( let ret = ffi::sqlite3_open_v2(
path_to_cstr!(path.as_ref()).as_ptr(), path_to_cstr!(path.as_ref()).as_ptr(),
&mut raw, &mut raw,
flags.0, flags.0,
0 as *const _, 0 as *const _ );
));
// Explicitly close the connection on error.
// This is a quirk of the C API, where the database handle
// (raw) is unconditionally allocated.
match ret {
ffi::SQLITE_OK => {},
code => {
ffi::sqlite3_close(raw);
return Err(::Error {
code: Some(code as isize),
message: None
});
},
}
} }
Ok(Connection { Ok(Connection {
raw: raw, raw: raw,
@ -101,7 +114,7 @@ impl Connection {
where where
F: FnMut(usize) -> bool + Send + 'static, F: FnMut(usize) -> bool + Send + 'static,
{ {
try!(self.remove_busy_handler()); self.remove_busy_handler()?;
unsafe { unsafe {
let callback = Box::new(callback); let callback = Box::new(callback);
let result = ffi::sqlite3_busy_handler( let result = ffi::sqlite3_busy_handler(

View File

@ -13,9 +13,9 @@ impl<'l> Cursor<'l> {
/// Bind values to all parameters. /// Bind values to all parameters.
pub fn bind(&mut self, values: &[Value]) -> Result<()> { pub fn bind(&mut self, values: &[Value]) -> Result<()> {
self.state = None; self.state = None;
try!(self.statement.reset()); self.statement.reset()?;
for (i, value) in values.iter().enumerate() { for (i, value) in values.iter().enumerate() {
try!(self.statement.bind(i + 1, value)); self.statement.bind(i + 1, value)?;
} }
Ok(()) Ok(())
} }
@ -32,14 +32,14 @@ impl<'l> Cursor<'l> {
Some(State::Row) => {} Some(State::Row) => {}
Some(State::Done) => return Ok(None), Some(State::Done) => return Ok(None),
_ => { _ => {
self.state = Some(try!(self.statement.next())); self.state = Some(self.statement.next()?);
return self.next(); return self.next();
} }
} }
self.values = match self.values.take() { self.values = match self.values.take() {
Some(mut values) => { Some(mut values) => {
for (i, value) in values.iter_mut().enumerate() { for (i, value) in values.iter_mut().enumerate() {
*value = try!(self.statement.read(i)); *value = self.statement.read(i)?;
} }
Some(values) Some(values)
} }
@ -47,12 +47,12 @@ impl<'l> Cursor<'l> {
let count = self.statement.count(); let count = self.statement.count();
let mut values = Vec::with_capacity(count); let mut values = Vec::with_capacity(count);
for i in 0..count { for i in 0..count {
values.push(try!(self.statement.read(i))); values.push(self.statement.read(i)?);
} }
Some(values) Some(values)
} }
}; };
self.state = Some(try!(self.statement.next())); self.state = Some(self.statement.next()?);
Ok(Some(self.values.as_ref().unwrap())) Ok(Some(self.values.as_ref().unwrap()))
} }

View File

@ -232,10 +232,10 @@ impl Bindable for () {
impl Readable for Value { impl Readable for Value {
fn read(statement: &Statement, i: usize) -> Result<Self> { fn read(statement: &Statement, i: usize) -> Result<Self> {
Ok(match statement.kind(i) { Ok(match statement.kind(i) {
Type::Binary => Value::Binary(try!(Readable::read(statement, i))), Type::Binary => Value::Binary(Readable::read(statement, i)?),
Type::Float => Value::Float(try!(Readable::read(statement, i))), Type::Float => Value::Float(Readable::read(statement, i)?),
Type::Integer => Value::Integer(try!(Readable::read(statement, i))), Type::Integer => Value::Integer(Readable::read(statement, i)?),
Type::String => Value::String(try!(Readable::read(statement, i))), Type::String => Value::String(Readable::read(statement, i)?),
Type::Null => Value::Null, Type::Null => Value::Null,
}) })
} }