mirror of
https://github.com/isar/rusqlite.git
synced 2025-08-19 20:39:44 +08:00
Support Rust expression like {x.y}
in SQL strings
This commit is contained in:
@@ -12,5 +12,5 @@ categories = ["database"]
|
||||
proc-macro = true
|
||||
|
||||
[dependencies]
|
||||
sqlite3-parser = { version = "0.9", default-features = false, features = ["YYNOERRORRECOVERY"] }
|
||||
sqlite3-parser = { version = "0.10.0", default-features = false, features = ["YYNOERRORRECOVERY", "rust_variable"] }
|
||||
fallible-iterator = "0.3"
|
||||
|
@@ -58,11 +58,15 @@ fn try_bind(input: TokenStream) -> Result<TokenStream> {
|
||||
let mut res = TokenStream::new();
|
||||
for (i, name) in info.names.iter().enumerate() {
|
||||
res.extend(Some(stmt.clone()));
|
||||
let offset = match name.as_bytes()[0] {
|
||||
b'$' | b'@' | b'#' | b':' => 1,
|
||||
_ => 0, // captured identifier: {...}
|
||||
};
|
||||
res.extend(respan(
|
||||
parse_ts(&format!(
|
||||
".raw_bind_parameter({}, &{})?;",
|
||||
i + 1,
|
||||
&name[1..]
|
||||
&name[offset..]
|
||||
)),
|
||||
call_site,
|
||||
));
|
||||
|
@@ -16,7 +16,30 @@ fn test_literal() -> Result {
|
||||
let first_name = "El";
|
||||
let last_name = "Barto";
|
||||
let mut stmt = Stmt;
|
||||
__bind!(stmt "SELECT $first_name, $last_name");
|
||||
__bind!(stmt "SELECT $first_name, {last_name}");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_tuple() -> Result {
|
||||
let names = ("El", "Barto");
|
||||
let mut stmt = Stmt;
|
||||
__bind!(stmt "SELECT {names.0}, {names.1}");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_struct() -> Result {
|
||||
struct Person<'s> {
|
||||
first_name: &'s str,
|
||||
last_name: &'s str,
|
||||
}
|
||||
let p = Person {
|
||||
first_name: "El",
|
||||
last_name: "Barto",
|
||||
};
|
||||
let mut stmt = Stmt;
|
||||
__bind!(stmt "SELECT {p.first_name}, {p.last_name}");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user