#rusqlite
https://github.com/rusqlite/rusqlite/blob/master/src/vtab/array.rs
[[rusqlite]]のfeature `array`を使う。具体的には[[table valued function]]の[[rarray]]を使う。
## crateのfeature追加
`cargo.toml`で`bundled`と一緒に指定する。
```toml
[dependencies]
rusqlite = { version = "0.24.2", features = ["bundled", "array"] }
```
## moduleの読みこみ
Connectionを開いたあとに`array`モジュールを読み込む。
```rust
let conn = Connection::open(db)?;
rusqlite::vtab::array::load_module(&conn)?; // <- 追加
```
これを忘れると[[rarray]]が認識されない。
```console
Rusqlite error: no such table: rarray
```
## [[Prepared statement]]の定義
ここでは[[named_params!]]を使うケースを想定する。[[rarray]]に`Rc<Vec<Value>>`を渡す。
```rust
use rusqlite::{named_params, types::Value};
use serde_rusqlite::from_rows;
let mut stmt = conn.prepare("SELECT * from table WHERE stt.trip_id in rarray(:ids)");
let ids = Rc::new(
vec![
String::from("id1"),
String::from("id2"),
]
.into_iter()
.map(Value::from)
.collect_vec(),
);
let result = from_rows(stmt.query_named(named_params! {
":ids": ids
})?)
.collect();
```
ポイント。
- `ToSql`は`Rc<Vec<Value>>`に対して実装されているため`Rc::new`が必要
- https://github.com/rusqlite/rusqlite/blob/master/src/vtab/array.rs#L51
- `Value`は`&str`または`&str`からの変換実装がないため`String`が必要
- [`impl From<&str>`は存在しない](https://docs.rs/rusqlite/0.24.2/rusqlite/types/enum.Value.html#impl-From%3CValueRef%3C%27_%3E%3E)
- [`impl From<ValueRef>`はあるがEnum ValueRefに`&str`は含まれない](https://docs.rs/rusqlite/0.24.2/rusqlite/types/enum.ValueRef.html)
- [`0.20.0`より前のバージョンでは`&str`が含まれていたので注意](https://docs.rs/rusqlite/0.19.0/rusqlite/types/enum.ValueRef.html)
## 関連
- https://github.com/rusqlite/rusqlite/issues/345
- https://github.com/rusqlite/rusqlite/pull/130
- https://github.com/rusqlite/rusqlite/issues/607