mirror of
https://github.com/isar/rusqlite.git
synced 2024-11-26 19:41:37 +08:00
Change VTabCursor::column signature
This commit is contained in:
parent
8f079819f7
commit
c8b09e2ee7
@ -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, VTab, VTabCursor};
|
use vtab::{declare_vtab, escape_double_quote, Context, VTab, VTabCursor};
|
||||||
|
|
||||||
/// Register the "csv" module.
|
/// Register the "csv" module.
|
||||||
pub fn load_module(conn: &Connection) -> Result<()> {
|
pub fn load_module(conn: &Connection) -> Result<()> {
|
||||||
@ -199,17 +199,16 @@ impl VTabCursor<CSVTab> for CSVTabCursor {
|
|||||||
fn eof(&self) -> bool {
|
fn eof(&self) -> bool {
|
||||||
self.eof
|
self.eof
|
||||||
}
|
}
|
||||||
fn column(&self, ctx: *mut ffi::sqlite3_context, col: libc::c_int) -> Result<()> {
|
fn column(&self, ctx: &mut Context, col: libc::c_int) -> Result<()> {
|
||||||
use functions::ToResult;
|
|
||||||
if col < 0 || col as usize >= self.cols.len() {
|
if col < 0 || col as usize >= self.cols.len() {
|
||||||
return Err(Error::ModuleError(format!("column index out of bounds: {}", col)));
|
return Err(Error::ModuleError(format!("column index out of bounds: {}", col)));
|
||||||
}
|
}
|
||||||
if self.cols.is_empty() {
|
if self.cols.is_empty() {
|
||||||
unsafe { Null.set_result(ctx) };
|
ctx.set_result(&Null);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
// TODO Affinity
|
// TODO Affinity
|
||||||
unsafe { self.cols[col as usize].set_result(ctx) };
|
ctx.set_result(&self.cols[col as usize]);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
fn rowid(&self) -> Result<i64> {
|
fn rowid(&self) -> Result<i64> {
|
||||||
|
@ -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, VTab, VTabCursor};
|
use vtab::{declare_vtab, escape_double_quote, Context, 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.
|
||||||
@ -119,12 +119,11 @@ impl VTabCursor<IntArrayVTab> for IntArrayVTabCursor {
|
|||||||
self.i >= array.len()
|
self.i >= array.len()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn column(&self, ctx: *mut ffi::sqlite3_context, _i: libc::c_int) -> Result<()> {
|
fn column(&self, ctx: &mut Context, _i: libc::c_int) -> Result<()> {
|
||||||
use functions::ToResult;
|
|
||||||
let vtab = self.vtab();
|
let vtab = self.vtab();
|
||||||
unsafe {
|
unsafe {
|
||||||
let array = (*vtab.array).borrow();
|
let array = (*vtab.array).borrow();
|
||||||
array[self.i].set_result(ctx);
|
ctx.set_result(&array[self.i]);
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ use libc;
|
|||||||
use {Connection, Error, Result, InnerConnection, str_to_cstring};
|
use {Connection, Error, Result, InnerConnection, str_to_cstring};
|
||||||
use error::error_from_sqlite_code;
|
use error::error_from_sqlite_code;
|
||||||
use ffi;
|
use ffi;
|
||||||
|
use functions::ToResult;
|
||||||
|
|
||||||
// let conn: Connection = ...;
|
// let conn: Connection = ...;
|
||||||
// let mod: Module = ...; // VTab builder
|
// let mod: Module = ...; // VTab builder
|
||||||
@ -65,11 +66,21 @@ pub trait VTabCursor<V: VTab<Self>>: Sized {
|
|||||||
fn eof(&self) -> bool;
|
fn eof(&self) -> bool;
|
||||||
/// Find the value for the `i`-th column of the current row. `i` is zero-based so the first column is numbered 0.
|
/// Find the value for the `i`-th column of the current row. `i` is zero-based so the first column is numbered 0.
|
||||||
/// May return its result back to SQLite using one of the specified `ctx`.
|
/// May return its result back to SQLite using one of the specified `ctx`.
|
||||||
fn column(&self, ctx: *mut ffi::sqlite3_context, i: libc::c_int) -> Result<()>;
|
fn column(&self, ctx: &mut Context, i: libc::c_int) -> Result<()>;
|
||||||
/// Return the rowid of row that the cursor is currently pointing at.
|
/// Return the rowid of row that the cursor is currently pointing at.
|
||||||
fn rowid(&self) -> Result<i64>;
|
fn rowid(&self) -> Result<i64>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct Context(*mut ffi::sqlite3_context);
|
||||||
|
|
||||||
|
impl Context {
|
||||||
|
pub fn set_result(&mut self, value: &ToResult) {
|
||||||
|
unsafe {
|
||||||
|
value.set_result(self.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Connection {
|
impl Connection {
|
||||||
/// Register a virtual table implementation.
|
/// Register a virtual table implementation.
|
||||||
pub fn create_module<A>(&self,
|
pub fn create_module<A>(&self,
|
||||||
@ -282,9 +293,10 @@ unsafe extern "C" fn $column(cursor: *mut ffi::sqlite3_vtab_cursor,
|
|||||||
ctx: *mut ffi::sqlite3_context,
|
ctx: *mut ffi::sqlite3_context,
|
||||||
i: libc::c_int)
|
i: libc::c_int)
|
||||||
-> libc::c_int {
|
-> libc::c_int {
|
||||||
use vtab::result_error;
|
use vtab::{result_error, Context};
|
||||||
let cr = cursor as *mut $cursor;
|
let cr = cursor as *mut $cursor;
|
||||||
result_error(ctx, (*cr).column(ctx, i))
|
let mut ctxt = Context(ctx);
|
||||||
|
result_error(ctx, (*cr).column(&mut ctxt, i))
|
||||||
}
|
}
|
||||||
unsafe extern "C" fn $rowid(cursor: *mut ffi::sqlite3_vtab_cursor,
|
unsafe extern "C" fn $rowid(cursor: *mut ffi::sqlite3_vtab_cursor,
|
||||||
p_rowid: *mut ffi::sqlite3_int64)
|
p_rowid: *mut ffi::sqlite3_int64)
|
||||||
|
Loading…
Reference in New Issue
Block a user