Fix escape_double_quote

This commit is contained in:
gwenn 2016-02-11 21:19:18 +01:00
parent 38209ffef3
commit 1dd5c49937
3 changed files with 9 additions and 7 deletions

View File

@ -47,7 +47,7 @@ impl VTab<CSVTabCursor> for CSVTab {
} }
let filename = try!(str::from_utf8(c_filename)); let filename = try!(str::from_utf8(c_filename));
let mut reader = try!(csv::Reader::from_file(filename)).has_headers(false); // TODO flexible ? let mut reader = try!(csv::Reader::from_file(filename)).has_headers(false); // TODO flexible ?
let mut cols = Vec::new(); let mut cols: Vec<String> = Vec::new();
let args = &args[4..]; let args = &args[4..];
for c_arg in args { for c_arg in args {
@ -64,7 +64,7 @@ impl VTab<CSVTabCursor> for CSVTab {
} else if uc.contains("NO_QUOTE") { } else if uc.contains("NO_QUOTE") {
reader = reader.quote(0); reader = reader.quote(0);
} else { } else {
cols.push(escape_double_quote(String::from(arg))); cols.push(escape_double_quote(arg).into_owned());
} }
} }
} }

View File

@ -13,13 +13,13 @@ pub fn create_int_array(conn: &Connection, name: &str) -> Result<Rc<RefCell<Vec<
let array = Rc::new(RefCell::new(Vec::new())); let array = Rc::new(RefCell::new(Vec::new()));
try!(conn.create_module(name, &INT_ARRAY_MODULE, Some(array.clone()))); try!(conn.create_module(name, &INT_ARRAY_MODULE, Some(array.clone())));
try!(conn.execute_batch(&format!("CREATE VIRTUAL TABLE temp.\"{0}\" USING \"{0}\"", try!(conn.execute_batch(&format!("CREATE VIRTUAL TABLE temp.\"{0}\" USING \"{0}\"",
escape_double_quote(name.to_string())))); escape_double_quote(name))));
Ok(array) Ok(array)
} }
pub fn drop_int_array(conn: &Connection, name: &str) -> Result<()> { pub fn drop_int_array(conn: &Connection, name: &str) -> Result<()> {
conn.execute_batch(&format!("DROP TABLE temp.\"{0}\"", conn.execute_batch(&format!("DROP TABLE temp.\"{0}\"",
escape_double_quote(name.to_string()))) escape_double_quote(name)))
} }
init_module!(INT_ARRAY_MODULE, IntArrayVTab, IntArrayVTabCursor, init_module!(INT_ARRAY_MODULE, IntArrayVTab, IntArrayVTabCursor,

View File

@ -1,5 +1,7 @@
//! Create virtual tables. //! Create virtual tables.
//! (See http://sqlite.org/vtab.html) //! (See http://sqlite.org/vtab.html)
use std::borrow::Cow;
use std::borrow::Cow::{Borrowed, Owned};
use std::ffi::CString; use std::ffi::CString;
use std::mem; use std::mem;
use std::ptr; use std::ptr;
@ -128,12 +130,12 @@ pub fn declare_vtab(db: *mut ffi::sqlite3, sql: &str) -> Result<()> {
} }
/// Escape double-quote (`"`) character occurences by doubling them (`""`). /// Escape double-quote (`"`) character occurences by doubling them (`""`).
pub fn escape_double_quote(identifier: String) -> String { pub fn escape_double_quote<'a>(identifier: &'a str) -> Cow<'a, str> {
if identifier.contains('"') { if identifier.contains('"') {
// escape quote by doubling them // escape quote by doubling them
identifier.replace("\"", "\"\"") Owned(identifier.replace("\"", "\"\""))
} else { } else {
identifier Borrowed(identifier)
} }
} }