use crate::models::game::equip_storage_info::EquipStorageInfo; use serde_json::Value; use sqlx::SqlitePool; /// Insert a full JSON array of EquipStorageInfo records for a UID. pub async fn insert_equip_storage_info( pool: &SqlitePool, data: &Value, uid: i64, ) -> sqlx::Result<()> { let arr = match data.get("equipStorageInfo").and_then(|v| v.as_array()) { Some(a) => a, None => { eprintln!("insert_equip_storage_info: missing or invalid 'equipStorageInfo' array"); return Ok(()); } }; for entry in arr { // Handle repeated nested EquipInfo - extract InvenIndex values let equip_info_index = if let Some(nested_arr) = entry.get("equipInfo").and_then(|v| v.as_array()) { let index: Vec = nested_arr .iter() .filter_map(|item| item.get("invenIndex").and_then(|v| v.as_i64())) .collect(); if index.is_empty() { None } else { Some(serde_json::to_string(&index).unwrap()) } } else { None }; sqlx::query( r#" INSERT INTO EquipStorageInfo ( Uid, EquipInfoIndex ) VALUES ( ?, ? ) "#, ) .bind(uid) .bind(&equip_info_index) .execute(pool) .await?; } Ok(()) } /// Add a single EquipStorageInfo record from a Rust struct. pub async fn add_equip_storage_info( pool: &SqlitePool, data: &EquipStorageInfo, ) -> sqlx::Result<()> { sqlx::query( r#" INSERT INTO EquipStorageInfo ( Uid, EquipInfoIndex ) VALUES ( ?, ? ) "#, ) .bind(&data.uid) .bind(&data.equip_info_index) .execute(pool) .await?; Ok(()) } /// Fetch all records for a given UID. pub async fn get_equip_storage_info( pool: &SqlitePool, uid: i64, ) -> sqlx::Result> { sqlx::query_as::<_, EquipStorageInfo>("SELECT * FROM EquipStorageInfo WHERE Uid = ?") .bind(uid) .fetch_all(pool) .await } /// Delete all EquipStorageInfo rows for a UID. pub async fn delete_equip_storage_info(pool: &SqlitePool, uid: i64) -> sqlx::Result<()> { sqlx::query("DELETE FROM EquipStorageInfo WHERE Uid = ?") .bind(uid) .execute(pool) .await?; Ok(()) }