Change signature of VTab::best_index

This commit is contained in:
gwenn 2016-08-14 09:08:42 +02:00
parent c8b09e2ee7
commit a90388e6bf
3 changed files with 14 additions and 6 deletions

View File

@ -9,7 +9,7 @@ use libc;
use {Connection, Error, Result}; use {Connection, Error, Result};
use ffi; use ffi;
use types::Null; use types::Null;
use vtab::{declare_vtab, escape_double_quote, Context, VTab, VTabCursor}; use vtab::{declare_vtab, escape_double_quote, Context, IndexInfo, VTab, VTabCursor};
/// Register the "csv" module. /// Register the "csv" module.
pub fn load_module(conn: &Connection) -> Result<()> { pub fn load_module(conn: &Connection) -> Result<()> {
@ -131,7 +131,7 @@ impl VTab<CSVTabCursor> for CSVTab {
Ok(vtab) Ok(vtab)
} }
fn best_index(&self, _info: *mut ffi::sqlite3_index_info) {} fn best_index(&self, _info: &mut IndexInfo) {}
fn open(&self) -> Result<CSVTabCursor> { fn open(&self) -> Result<CSVTabCursor> {
Ok(CSVTabCursor::new(try!(self.reader()))) Ok(CSVTabCursor::new(try!(self.reader())))

View File

@ -7,7 +7,7 @@ use libc;
use {Connection, Error, Result}; use {Connection, Error, Result};
use ffi; use ffi;
use vtab::{declare_vtab, escape_double_quote, Context, VTab, VTabCursor}; use vtab::{declare_vtab, escape_double_quote, Context, IndexInfo, VTab, VTabCursor};
/// Create a specific instance of an intarray object. /// Create a specific instance of an intarray object.
/// The new intarray object is returned. /// The new intarray object is returned.
@ -71,7 +71,7 @@ impl VTab<IntArrayVTabCursor> for IntArrayVTab {
Ok(vtab) Ok(vtab)
} }
fn best_index(&self, _info: *mut ffi::sqlite3_index_info) {} fn best_index(&self, _info: &mut IndexInfo) {}
fn open(&self) -> Result<IntArrayVTabCursor> { fn open(&self) -> Result<IntArrayVTabCursor> {
Ok(IntArrayVTabCursor::new()) Ok(IntArrayVTabCursor::new())

View File

@ -45,11 +45,17 @@ pub trait VTab<C: VTabCursor<Self>>: Sized {
/// The `db` parameter is a pointer to the SQLite database connection that is executing the CREATE VIRTUAL TABLE statement. /// The `db` parameter is a pointer to the SQLite database connection that is executing the CREATE VIRTUAL TABLE statement.
fn create(db: *mut ffi::sqlite3, aux: *mut libc::c_void, args: &[&[u8]]) -> Result<Self>; fn create(db: *mut ffi::sqlite3, aux: *mut libc::c_void, args: &[&[u8]]) -> Result<Self>;
/// Determine the best way to access the virtual table. /// Determine the best way to access the virtual table.
fn best_index(&self, info: *mut ffi::sqlite3_index_info); fn best_index(&self, info: &mut IndexInfo);
/// Create a new cursor used for accessing a virtual table. /// Create a new cursor used for accessing a virtual table.
fn open(&self) -> Result<C>; fn open(&self) -> Result<C>;
} }
pub struct IndexInfo(*mut ffi::sqlite3_index_info);
impl IndexInfo {
// TODO
}
/// Virtual table cursor trait. /// Virtual table cursor trait.
pub trait VTabCursor<V: VTab<Self>>: Sized { pub trait VTabCursor<V: VTab<Self>>: Sized {
/// Accessor to the associated virtual table. /// Accessor to the associated virtual table.
@ -71,6 +77,7 @@ pub trait VTabCursor<V: VTab<Self>>: Sized {
fn rowid(&self) -> Result<i64>; fn rowid(&self) -> Result<i64>;
} }
// FIXME clash with functions::Context
pub struct Context(*mut ffi::sqlite3_context); pub struct Context(*mut ffi::sqlite3_context);
impl Context { impl Context {
@ -221,7 +228,8 @@ unsafe extern "C" fn $best_index(vtab: *mut ffi::sqlite3_vtab,
info: *mut ffi::sqlite3_index_info) info: *mut ffi::sqlite3_index_info)
-> libc::c_int { -> libc::c_int {
let vtab = vtab as *mut $vtab; let vtab = vtab as *mut $vtab;
(*vtab).best_index(info); let mut idx_info = IndexInfo(info);
(*vtab).best_index(&mut idx_info);
ffi::SQLITE_OK ffi::SQLITE_OK
} }
unsafe extern "C" fn $destroy(vtab: *mut ffi::sqlite3_vtab) -> libc::c_int { unsafe extern "C" fn $destroy(vtab: *mut ffi::sqlite3_vtab) -> libc::c_int {