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> {
let mut raw = 0 as *mut _;
unsafe {
ok!(ffi::sqlite3_open_v2(
let ret = ffi::sqlite3_open_v2(
path_to_cstr!(path.as_ref()).as_ptr(),
&mut raw,
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 {
raw: raw,
@ -101,7 +114,7 @@ impl Connection {
where
F: FnMut(usize) -> bool + Send + 'static,
{
try!(self.remove_busy_handler());
self.remove_busy_handler()?;
unsafe {
let callback = Box::new(callback);
let result = ffi::sqlite3_busy_handler(

View File

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

View File

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