use crate::models::game::char::char_info::CharInfo; use sqlx::SqlitePool; /// Add a single CharInfo record from a Rust struct. pub async fn add_char_info(pool: &SqlitePool, data: &CharInfo) -> sqlx::Result<()> { sqlx::query( r#" INSERT INTO CharInfo ( Uid, InvenIndex, Id, Hp, Level, CostumeId, Exp, UseCostume, TalentLevel, TalentExp, SolidarityReward, ExpiryTime, PictorialbookInfoIndex, ConnectPotentialCostume ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) "#, ) .bind(&data.uid) .bind(&data.inven_index) .bind(&data.id) .bind(&data.hp) .bind(&data.level) .bind(&data.costume_id) .bind(&data.exp) .bind(&data.use_costume) .bind(&data.talent_level) .bind(&data.talent_exp) .bind(&data.solidarity_reward) .bind(&data.expiry_time) .bind(&data.pictorialbook_info_index) .bind(&data.connect_potential_costume) .execute(pool) .await?; Ok(()) } /// Fetch all records for a given UID. pub async fn get_char_info(pool: &SqlitePool, uid: i64) -> sqlx::Result> { sqlx::query_as::<_, CharInfo>("SELECT * FROM CharInfo WHERE Uid = ?") .bind(uid) .fetch_all(pool) .await } /// Delete all CharInfo rows for a UID. pub async fn delete_char_info(pool: &SqlitePool, uid: i64) -> sqlx::Result<()> { sqlx::query("DELETE FROM CharInfo WHERE Uid = ?") .bind(uid) .execute(pool) .await?; Ok(()) } /// Get a single record by Index (rowid) pub async fn get_by_index(pool: &SqlitePool, uid: i64, index: i64) -> sqlx::Result { sqlx::query_as::<_, CharInfo>("SELECT * FROM CharInfo WHERE Uid = ? AND Index = ?") .bind(uid) .bind(index) .fetch_one(pool) .await } /// Get multiple records by their Index (rowids) pub async fn get_all_by_index( pool: &SqlitePool, uid: i64, index: &[i64], ) -> sqlx::Result> { if index.is_empty() { return Ok(vec![]); } let placeholders = index.iter().map(|_| "?").collect::>().join(","); let query = format!( "SELECT * FROM CharInfo WHERE Uid = ? AND Index IN ({})", placeholders ); let mut query = sqlx::query_as::<_, CharInfo>(&query).bind(uid); for idx in index { query = query.bind(idx); } query.fetch_all(pool).await } /// Insert and return the rowid (Index) pub async fn insert(pool: &SqlitePool, data: &CharInfo) -> sqlx::Result { let result = sqlx::query( r#" INSERT INTO CharInfo ( Uid, InvenIndex, Id, Hp, Level, CostumeId, Exp, UseCostume, TalentLevel, TalentExp, SolidarityReward, ExpiryTime, PictorialbookInfoIndex, ConnectPotentialCostume ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) "#, ) .bind(&data.uid) .bind(&data.inven_index) .bind(&data.id) .bind(&data.hp) .bind(&data.level) .bind(&data.costume_id) .bind(&data.exp) .bind(&data.use_costume) .bind(&data.talent_level) .bind(&data.talent_exp) .bind(&data.solidarity_reward) .bind(&data.expiry_time) .bind(&data.pictorialbook_info_index) .bind(&data.connect_potential_costume) .execute(pool) .await?; Ok(result.last_insert_rowid()) }