mirror of
https://github.com/isar/rusqlite.git
synced 2024-11-23 09:09:19 +08:00
Change VTab::create signature
This commit is contained in:
parent
3f55a4583c
commit
59ad638875
@ -1,6 +1,5 @@
|
||||
//! CSV Virtual Table
|
||||
extern crate csv;
|
||||
use std::ffi::CStr;
|
||||
use std::fs::File;
|
||||
use std::path::Path;
|
||||
use std::result;
|
||||
@ -32,14 +31,17 @@ init_module!(CSV_MODULE,
|
||||
csv_column,
|
||||
csv_rowid);
|
||||
|
||||
/// An instance of the CSV virtual table
|
||||
#[repr(C)]
|
||||
struct CSVTab {
|
||||
/// Base class
|
||||
/// Base class. Must be first
|
||||
base: ffi::sqlite3_vtab,
|
||||
/// Name of the CSV file
|
||||
filename: String,
|
||||
has_headers: bool,
|
||||
delimiter: u8,
|
||||
quote: u8,
|
||||
/// Offset to start of data
|
||||
offset_first_row: u64,
|
||||
}
|
||||
|
||||
@ -56,13 +58,13 @@ impl CSVTab {
|
||||
impl VTab<CSVTabCursor> for CSVTab {
|
||||
fn create(db: *mut ffi::sqlite3,
|
||||
_aux: *mut libc::c_void,
|
||||
args: &[*const libc::c_char])
|
||||
args: &[&[u8]])
|
||||
-> Result<CSVTab> {
|
||||
if args.len() < 4 {
|
||||
return Err(Error::ModuleError("no CSV file specified".to_owned()));
|
||||
}
|
||||
// pull out name of csv file (remove quotes)
|
||||
let mut c_filename = unsafe { CStr::from_ptr(args[3]).to_bytes() };
|
||||
let mut c_filename = args[3];
|
||||
if c_filename[0] == b'\'' {
|
||||
c_filename = &c_filename[1..c_filename.len() - 1];
|
||||
}
|
||||
@ -81,8 +83,7 @@ impl VTab<CSVTabCursor> for CSVTab {
|
||||
let mut cols: Vec<String> = Vec::new();
|
||||
|
||||
let args = &args[4..];
|
||||
for c_arg in args {
|
||||
let c_slice = unsafe { CStr::from_ptr(*c_arg).to_bytes() };
|
||||
for c_slice in args {
|
||||
if c_slice.len() == 1 {
|
||||
vtab.delimiter = c_slice[0];
|
||||
} else if c_slice.len() == 3 && c_slice[0] == b'\'' {
|
||||
@ -121,7 +122,7 @@ impl VTab<CSVTabCursor> for CSVTab {
|
||||
}
|
||||
sql.push('"');
|
||||
sql.push_str(col);
|
||||
sql.push('"');
|
||||
sql.push_str("\" TEXT");
|
||||
if i == cols.len() - 1 {
|
||||
sql.push_str(");");
|
||||
} else {
|
||||
@ -140,11 +141,12 @@ impl VTab<CSVTabCursor> for CSVTab {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// A cursor for the CSV virtual table
|
||||
#[repr(C)]
|
||||
struct CSVTabCursor {
|
||||
/// Base class
|
||||
/// Base class. Must be first
|
||||
base: ffi::sqlite3_vtab_cursor,
|
||||
/// The CSV reader object
|
||||
reader: csv::Reader<File>,
|
||||
/// Current cursor position
|
||||
row_number: usize,
|
||||
|
@ -60,7 +60,7 @@ struct IntArrayVTab {
|
||||
impl VTab<IntArrayVTabCursor> for IntArrayVTab {
|
||||
fn create(db: *mut ffi::sqlite3,
|
||||
aux: *mut libc::c_void,
|
||||
_args: &[*const libc::c_char])
|
||||
_args: &[&[u8]])
|
||||
-> Result<IntArrayVTab> {
|
||||
let array = unsafe { mem::transmute(aux) };
|
||||
let vtab = IntArrayVTab {
|
||||
|
@ -1,7 +1,6 @@
|
||||
//! Create virtual tables.
|
||||
//! (See http://sqlite.org/vtab.html)
|
||||
use std::borrow::Cow;
|
||||
use std::borrow::Cow::{Borrowed, Owned};
|
||||
use std::borrow::Cow::{self, Borrowed, Owned};
|
||||
use std::ffi::CString;
|
||||
use std::mem;
|
||||
use std::ptr;
|
||||
@ -45,7 +44,7 @@ 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.
|
||||
fn create(db: *mut ffi::sqlite3,
|
||||
aux: *mut libc::c_void,
|
||||
args: &[*const libc::c_char])
|
||||
args: &[&[u8]])
|
||||
-> Result<Self>;
|
||||
/// Determine the best way to access the virtual table.
|
||||
fn best_index(&self, info: *mut ffi::sqlite3_index_info);
|
||||
@ -186,10 +185,14 @@ unsafe extern "C" fn $create(db: *mut ffi::sqlite3,
|
||||
err_msg: *mut *mut libc::c_char)
|
||||
-> libc::c_int {
|
||||
use std::error::Error as StdError;
|
||||
use std::ffi::CStr;
|
||||
use std::slice;
|
||||
use vtab::mprintf;
|
||||
let args = slice::from_raw_parts(argv, argc as usize);
|
||||
match $vtab::create(db, aux, args) {
|
||||
let vec = args.iter().map(|cs| {
|
||||
CStr::from_ptr(*cs).to_bytes()
|
||||
}).collect::<Vec<_>>();
|
||||
match $vtab::create(db, aux, &vec[..]) {
|
||||
Ok(vtab) => {
|
||||
let boxed_vtab: *mut $vtab = Box::into_raw(Box::new(vtab));
|
||||
*pp_vtab = boxed_vtab as *mut ffi::sqlite3_vtab;
|
||||
|
Loading…
Reference in New Issue
Block a user