aboutsummaryrefslogtreecommitdiff
path: root/src/vtab/csvtab.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/vtab/csvtab.rs')
-rw-r--r--src/vtab/csvtab.rs31
1 files changed, 10 insertions, 21 deletions
diff --git a/src/vtab/csvtab.rs b/src/vtab/csvtab.rs
index df3529a..a65db05 100644
--- a/src/vtab/csvtab.rs
+++ b/src/vtab/csvtab.rs
@@ -11,7 +11,7 @@
//! // Note: This should be done once (usually when opening the DB).
//! let db = Connection::open_in_memory()?;
//! rusqlite::vtab::csvtab::load_module(&db)?;
-//! // Assum3e my_csv.csv
+//! // Assume my_csv.csv
//! let schema = "
//! CREATE VIRTUAL TABLE my_csv_data
//! USING csv(filename = 'my_csv.csv')
@@ -30,8 +30,8 @@ use std::str;
use crate::ffi;
use crate::types::Null;
use crate::vtab::{
- dequote, escape_double_quote, parse_boolean, read_only_module, Context, CreateVTab, IndexInfo,
- VTab, VTabConnection, VTabCursor, Values,
+ escape_double_quote, parse_boolean, read_only_module, Context, CreateVTab, IndexInfo, VTab,
+ VTabConfig, VTabConnection, VTabCursor, VTabKind, Values,
};
use crate::{Connection, Error, Result};
@@ -74,19 +74,6 @@ impl CsvTab {
.from_path(&self.filename)
}
- fn parameter(c_slice: &[u8]) -> Result<(&str, &str)> {
- let arg = str::from_utf8(c_slice)?.trim();
- let mut split = arg.split('=');
- if let Some(key) = split.next() {
- if let Some(value) = split.next() {
- let param = key.trim();
- let value = dequote(value);
- return Ok((param, value));
- }
- }
- Err(Error::ModuleError(format!("illegal argument: '{}'", arg)))
- }
-
fn parse_byte(arg: &str) -> Option<u8> {
if arg.len() == 1 {
arg.bytes().next()
@@ -101,7 +88,7 @@ unsafe impl<'vtab> VTab<'vtab> for CsvTab {
type Cursor = CsvTabCursor<'vtab>;
fn connect(
- _: &mut VTabConnection,
+ db: &mut VTabConnection,
_aux: Option<&()>,
args: &[&[u8]],
) -> Result<(String, CsvTab)> {
@@ -122,7 +109,7 @@ unsafe impl<'vtab> VTab<'vtab> for CsvTab {
let args = &args[3..];
for c_slice in args {
- let (param, value) = CsvTab::parameter(c_slice)?;
+ let (param, value) = super::parameter(c_slice)?;
match param {
"filename" => {
if !Path::new(value).exists() {
@@ -249,7 +236,7 @@ unsafe impl<'vtab> VTab<'vtab> for CsvTab {
}
schema = Some(sql);
}
-
+ db.config(VTabConfig::DirectOnly)?;
Ok((schema.unwrap(), vtab))
}
@@ -259,12 +246,14 @@ unsafe impl<'vtab> VTab<'vtab> for CsvTab {
Ok(())
}
- fn open(&self) -> Result<CsvTabCursor<'_>> {
+ fn open(&mut self) -> Result<CsvTabCursor<'_>> {
Ok(CsvTabCursor::new(self.reader()?))
}
}
-impl CreateVTab<'_> for CsvTab {}
+impl CreateVTab<'_> for CsvTab {
+ const KIND: VTabKind = VTabKind::Default;
+}
/// A cursor for the CSV virtual table
#[repr(C)]