Improve error handling.

This commit is contained in:
gwenn 2016-02-10 18:07:58 +01:00
parent 933000b57a
commit 30d1464e93
2 changed files with 27 additions and 9 deletions

View File

@ -6,6 +6,7 @@ use libc;
use {Connection, Error, Result}; use {Connection, Error, Result};
use ffi; use ffi;
use types::Null;
use vtab::declare_vtab; use vtab::declare_vtab;
use self::csv::Reader; use self::csv::Reader;
@ -27,19 +28,25 @@ struct CSVTab {
base: ffi::sqlite3_vtab, base: ffi::sqlite3_vtab,
reader: csv::Reader<File>, reader: csv::Reader<File>,
offset_first_row: u64, offset_first_row: u64,
cols: Vec<String>,
} }
impl CSVTab { impl CSVTab {
fn create(db: *mut ffi::sqlite3, fn create(db: *mut ffi::sqlite3,
aux: *mut libc::c_void, aux: *mut libc::c_void,
_argc: libc::c_int, argc: libc::c_int,
_argv: *const *const libc::c_char) _argv: *const *const libc::c_char)
-> Result<CSVTab> { -> Result<CSVTab> {
if argc < 4 {
return Err(Error::ModuleError(format!("no CSV file specified")));
}
//let filename = ;
let reader = try!(csv::Reader::from_file("FIXME")); let reader = try!(csv::Reader::from_file("FIXME"));
let vtab = CSVTab { let vtab = CSVTab {
base: Default::default(), base: Default::default(),
reader: reader, reader: reader,
offset_first_row: 0, offset_first_row: 0,
cols: vec![], // FIXME
}; };
unimplemented!(); unimplemented!();
try!(declare_vtab(db, "CREATE TABLE x FIXME")); try!(declare_vtab(db, "CREATE TABLE x FIXME"));
@ -77,7 +84,7 @@ impl CSVTabCursor {
fn filter(&mut self) -> Result<()> { fn filter(&mut self) -> Result<()> {
{ {
let vtab = self.vtab(); let vtab = self.vtab();
vtab.reader.seek(vtab.offset_first_row); // FIXME Result ignore try!(vtab.reader.seek(vtab.offset_first_row));
} }
self.row_number = 0; self.row_number = 0;
self.next() self.next()
@ -85,7 +92,7 @@ impl CSVTabCursor {
fn next(&mut self) -> Result<()> { fn next(&mut self) -> Result<()> {
let vtab = self.vtab(); let vtab = self.vtab();
if vtab.reader.done() { if vtab.reader.done() {
return Err(Error::SqliteFailure(ffi::Error::new(ffi::SQLITE_ERROR), None)); return Err(Error::ModuleError(format!("eof")));
} }
unimplemented!(); unimplemented!();
// self.row_number = self.row_number + 1; // self.row_number = self.row_number + 1;
@ -95,10 +102,18 @@ impl CSVTabCursor {
let vtab = self.vtab(); let vtab = self.vtab();
unsafe { (*vtab).reader.done() } unsafe { (*vtab).reader.done() }
} }
fn column(&self, ctx: *mut ffi::sqlite3_context, _i: libc::c_int) -> Result<()> { fn column(&self, ctx: *mut ffi::sqlite3_context, col: libc::c_int) -> Result<()> {
use functions::ToResult;
let vtab = self.vtab(); let vtab = self.vtab();
unimplemented!(); if col < 0 || col as usize >= vtab.cols.len() {
// TODO.set_result(ctx); return Err(Error::ModuleError(format!("column index out of bounds: {}", col)));
}
if vtab.cols.is_empty() {
unsafe { Null.set_result(ctx) };
return Ok(());
}
// TODO Affinity
unsafe { vtab.cols[col as usize].set_result(ctx) };
Ok(()) Ok(())
} }
fn rowid(&self) -> Result<i64> { fn rowid(&self) -> Result<i64> {

View File

@ -172,6 +172,7 @@ unsafe extern "C" fn $destroy(vtab: *mut ffi::sqlite3_vtab) -> libc::c_int {
unsafe extern "C" fn $open(vtab: *mut ffi::sqlite3_vtab, unsafe extern "C" fn $open(vtab: *mut ffi::sqlite3_vtab,
pp_cursor: *mut *mut ffi::sqlite3_vtab_cursor) pp_cursor: *mut *mut ffi::sqlite3_vtab_cursor)
-> libc::c_int { -> libc::c_int {
use std::error::Error as StdError;
use vtab::set_err_msg; use vtab::set_err_msg;
let vt = vtab as *mut $vtab; let vt = vtab as *mut $vtab;
match (*vt).open() { match (*vt).open() {
@ -186,7 +187,8 @@ unsafe extern "C" fn $open(vtab: *mut ffi::sqlite3_vtab,
} }
err.extended_code err.extended_code
} }
Err(_) => { Err(err) => {
set_err_msg(vtab, err.description());
ffi::SQLITE_ERROR ffi::SQLITE_ERROR
} }
} }
@ -243,6 +245,7 @@ unsafe extern "C" fn $rowid(cursor: *mut ffi::sqlite3_vtab_cursor,
pub unsafe fn cursor_error<T>(cursor: *mut ffi::sqlite3_vtab_cursor, pub unsafe fn cursor_error<T>(cursor: *mut ffi::sqlite3_vtab_cursor,
result: Result<T>) result: Result<T>)
-> libc::c_int { -> libc::c_int {
use std::error::Error as StdError;
match result { match result {
Ok(_) => ffi::SQLITE_OK, Ok(_) => ffi::SQLITE_OK,
Err(Error::SqliteFailure(err, s)) => { Err(Error::SqliteFailure(err, s)) => {
@ -251,8 +254,8 @@ pub unsafe fn cursor_error<T>(cursor: *mut ffi::sqlite3_vtab_cursor,
} }
err.extended_code err.extended_code
} }
Err(_) => { Err(err) => {
// TODO errMsg set_err_msg((*cursor).pVtab, err.description());
ffi::SQLITE_ERROR ffi::SQLITE_ERROR
} }
} }