mirror of
https://github.com/isar/rusqlite.git
synced 2024-11-23 09:09:19 +08:00
Improve error handling.
This commit is contained in:
parent
933000b57a
commit
30d1464e93
@ -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> {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user