#![allow(dead_code)]
use sqlx_cloudflare_do::{Do, DoConnection, DoQueryResult};
#[derive(Debug, sqlx::FromRow)]
struct User {
id: i64,
name: String,
email: Option<String>,
active: bool,
score: f64,
avatar: Vec<u8>,
}
async fn get_user<'e, E>(executor: E, id: i64) -> Result<User, sqlx::Error>
where
E: sqlx::Executor<'e, Database = Do>,
{
sqlx::query_as::<_, User>("SELECT * FROM users WHERE id = ?")
.bind(id)
.fetch_one(executor)
.await
}
async fn rename(conn: &mut DoConnection, id: i64, name: &str) -> Result<u64, sqlx::Error> {
let result: DoQueryResult = sqlx::query("UPDATE users SET name = ? WHERE id = ?")
.bind(name)
.bind(id)
.execute(&mut *conn)
.await?;
Ok(result.rows_affected())
}
async fn count(conn: &DoConnection) -> Result<i64, sqlx::Error> {
sqlx::query_scalar("SELECT COUNT(*) FROM users")
.fetch_one(conn)
.await
}
#[derive(Debug, Clone, Copy, sqlx::Type)]
#[sqlx(transparent)]
struct UserId(i64);
#[derive(Debug, Clone, Copy, sqlx::Type)]
#[repr(i32)]
enum Role {
Reader = 1,
Writer = 2,
}
#[derive(Debug, sqlx::FromRow)]
struct Member {
id: UserId,
role: Role,
}
async fn members(conn: &DoConnection, role: Role) -> Result<Vec<Member>, sqlx::Error> {
sqlx::query_as::<_, Member>("SELECT id, role FROM members WHERE role = ?")
.bind(role)
.fetch_all(conn)
.await
}
async fn insert_members(conn: &DoConnection, ids: &[UserId]) -> Result<u64, sqlx::Error> {
let mut builder = sqlx::QueryBuilder::<Do>::new("INSERT INTO members (id, role) ");
builder.push_values(ids, |mut row, id| {
row.push_bind(*id).push_bind(Role::Reader);
});
Ok(builder.build().execute(conn).await?.rows_affected())
}
fn assert_send<T: Send>(_: T) {}
fn futures_are_send(conn: &mut DoConnection) {
assert_send(get_user(&mut *conn, 1));
assert_send(rename(conn, 1, "x"));
assert_send(count(conn));
assert_send(members(conn, Role::Writer));
assert_send(insert_members(conn, &[UserId(1)]));
assert_send(conn.execute_batch([sqlx::query("DELETE FROM users")]));
assert_send(conn.fetch_batch([sqlx::query("SELECT * FROM users")]));
assert_send(conn.transaction(|tx| async move {
sqlx::query("DELETE FROM users").execute(&tx).await?;
Ok::<_, sqlx::Error>(())
}));
}
#[test]
fn do_is_an_sqlx_database() {
fn assert_database<DB: sqlx::Database>() {}
assert_database::<Do>();
assert_eq!(<Do as sqlx::Database>::NAME, "Do");
}