use crate::{
AMSQLConnection, IAsyncExecutor, IDbRepo, IExecutor, INewDbRepo, ITable, SStr, SVec,
TableManager,
};
struct Tbl;
impl ITable for Tbl {
const NAME: SStr = "my_table";
const COLUMNS: SVec<(SStr, SStr)> = &[
("id", "INTEGER PRIMARY KEY"),
("key", "TEXT"),
("value", "TEXT"),
];
const INDEXES: SVec<SStr> = &["key"];
const UNIQUE: SVec<SStr> = &["key"];
}
async fn cnn_with_tbl() -> AMSQLConnection {
let cnn = AMSQLConnection::new(":memory:").unwrap();
let lock = cnn.lock().await;
let man = TableManager::<_, Tbl>::create(lock);
man.init().unwrap();
cnn
}
#[tokio::test]
async fn test_no_lock_insert_select() {
let cnn = cnn_with_tbl().await;
cnn.execute(
&format!("INSERT INTO {t} (key, value) VALUES (?, ?)", t = Tbl::NAME,),
&[&"\'", &"\""],
)
.await
.unwrap();
let str_pairs: Vec<(String, String)> = cnn
.get_many(
&format!("SELECT key, value FROM {t}", t = Tbl::NAME),
&[],
|row| Ok((row.get(0)?, row.get(1)?)),
)
.await
.unwrap();
assert_eq!(str_pairs, vec![("\'".to_string(), "\"".to_string())])
}
#[tokio::test]
async fn test_lock_insert_select() {
let cnn = cnn_with_tbl().await;
let lock = cnn.lock().await;
lock.execute(
&format!("INSERT INTO {t} (key, value) VALUES (?, ?)", t = Tbl::NAME,),
&[&"\'", &"\""],
)
.unwrap();
let str_pairs: Vec<(String, String)> = lock
.get_many(
&format!("SELECT key, value FROM {t}", t = Tbl::NAME),
&[],
|row| Ok((row.get(0)?, row.get(1)?)),
)
.unwrap();
assert_eq!(str_pairs, vec![("\'".to_string(), "\"".to_string())])
}