From 1e6e8115bb8939ec863609639ff5d6fd6f688e0c Mon Sep 17 00:00:00 2001 From: gwenn Date: Wed, 10 Feb 2016 18:15:46 +0100 Subject: [PATCH] Introduce VTab and VTabCursor traits. --- src/vtab/csvtab.rs | 6 ++++-- src/vtab/int_array.rs | 9 +++++---- src/vtab/mod.rs | 21 ++++++++++++++++++++- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/vtab/csvtab.rs b/src/vtab/csvtab.rs index 5361491..e2304cd 100644 --- a/src/vtab/csvtab.rs +++ b/src/vtab/csvtab.rs @@ -7,7 +7,7 @@ use libc; use {Connection, Error, Result}; use ffi; use types::Null; -use vtab::declare_vtab; +use vtab::{declare_vtab, VTab, VTabCursor}; use self::csv::Reader; @@ -31,7 +31,7 @@ struct CSVTab { cols: Vec, } -impl CSVTab { +impl VTab for CSVTab { fn create(db: *mut ffi::sqlite3, aux: *mut libc::c_void, argc: libc::c_int, @@ -76,7 +76,9 @@ impl CSVTabCursor { row_number: 0, } } +} +impl VTabCursor for CSVTabCursor { fn vtab(&self) -> &mut CSVTab { unsafe { &mut *(self.base.pVtab as *mut CSVTab) } } diff --git a/src/vtab/int_array.rs b/src/vtab/int_array.rs index 17409b7..00b1d06 100644 --- a/src/vtab/int_array.rs +++ b/src/vtab/int_array.rs @@ -7,7 +7,7 @@ use libc; use {Connection, Error, Result}; use ffi; -use vtab::declare_vtab; +use vtab::{declare_vtab, VTab, VTabCursor}; pub fn create_int_array(conn: &Connection, name: &str) -> Result>>> { let array = Rc::new(RefCell::new(Vec::new())); @@ -24,7 +24,7 @@ pub fn drop_int_array(conn: &Connection, name: &str) -> Result<()> { fn escape_quote(identifier: String) -> String { if identifier.contains('"') { // escape quote by doubling them - identifier.replace('"', "\"\"") + identifier.replace("\"", "\"\"") } else { identifier } @@ -43,7 +43,7 @@ struct IntArrayVTab { array: *const Rc>>, } -impl IntArrayVTab { +impl VTab for IntArrayVTab { fn create(db: *mut ffi::sqlite3, aux: *mut libc::c_void, _argc: libc::c_int, @@ -80,11 +80,12 @@ impl IntArrayVTabCursor { i: 0, } } +} +impl VTabCursor for IntArrayVTabCursor { fn vtab(&self) -> &mut IntArrayVTab { unsafe { &mut *(self.base.pVtab as *mut IntArrayVTab) } } - fn filter(&mut self) -> Result<()> { self.i = 0; Ok(()) diff --git a/src/vtab/mod.rs b/src/vtab/mod.rs index 6b33959..5d7bd3a 100644 --- a/src/vtab/mod.rs +++ b/src/vtab/mod.rs @@ -37,6 +37,25 @@ use ffi; // \-> if not eof { cursor.column or xrowid } else { cursor.xclose } // +pub trait VTab>: Sized { + fn create(db: *mut ffi::sqlite3, + aux: *mut libc::c_void, + _argc: libc::c_int, + _argv: *const *const libc::c_char) + -> Result; + fn best_index(&self, _info: *mut ffi::sqlite3_index_info); + fn open(&self) -> Result; +} + +pub trait VTabCursor>: Sized { + fn vtab(&self) -> &mut V; + fn filter(&mut self) -> Result<()>; + fn next(&mut self) -> Result<()>; + fn eof(&self) -> bool; + fn column(&self, ctx: *mut ffi::sqlite3_context, _i: libc::c_int) -> Result<()>; + fn rowid(&self) -> Result; +} + impl Connection { /// Register a virtual table implementation. pub fn create_module(&self, @@ -261,7 +280,7 @@ pub unsafe fn cursor_error(cursor: *mut ffi::sqlite3_vtab_cursor, } } -unsafe fn set_err_msg(vtab: *mut ffi::sqlite3_vtab, err_msg: &str) { +pub unsafe fn set_err_msg(vtab: *mut ffi::sqlite3_vtab, err_msg: &str) { if !(*vtab).zErrMsg.is_null() { ffi::sqlite3_free((*vtab).zErrMsg as *mut libc::c_void); }