mirror of
https://github.com/fluencelabs/sqlite-wasm-connector
synced 2025-04-25 08:42:14 +00:00
Merge branch 'smklein-leak'
This commit is contained in:
commit
d396509611
@ -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(
|
||||||
|
@ -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()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user