use rusqlite::{OptionalExtension, params};
use super::Storage;
use super::decode::decode_json_row;
use crate::bridge_protocol::{BridgeManagementStatus, BridgeManagementTask};
impl Storage {
pub fn upsert_bridge_management_task(&self, task: &BridgeManagementTask) -> anyhow::Result<()> {
let conn = self.connect()?;
conn.execute(
"INSERT INTO bridge_management_tasks (
task_id, status, updated_at_ms, raw_json
)
VALUES (?1, ?2, ?3, ?4)
ON CONFLICT(task_id) DO UPDATE SET
status = excluded.status,
updated_at_ms = excluded.updated_at_ms,
raw_json = excluded.raw_json",
params![
task.task_id,
serde_json::to_string(&task.status)?,
task.updated_at_ms,
serde_json::to_string(task)?,
],
)?;
Ok(())
}
pub fn get_bridge_management_task(
&self,
task_id: &str,
) -> anyhow::Result<Option<BridgeManagementTask>> {
let conn = self.connect()?;
let task = conn
.query_row(
"SELECT raw_json FROM bridge_management_tasks WHERE task_id = ?1",
params![task_id],
|row| {
let raw: String = row.get(0)?;
decode_json_row(raw)
},
)
.optional()?;
Ok(task)
}
pub fn latest_bridge_management_task(&self) -> anyhow::Result<Option<BridgeManagementTask>> {
let conn = self.connect()?;
let task = conn
.query_row(
"SELECT raw_json
FROM bridge_management_tasks
ORDER BY updated_at_ms DESC
LIMIT 1",
[],
|row| {
let raw: String = row.get(0)?;
decode_json_row(raw)
},
)
.optional()?;
Ok(task)
}
pub fn active_bridge_management_task(&self) -> anyhow::Result<Option<BridgeManagementTask>> {
let conn = self.connect()?;
let task = conn
.query_row(
"SELECT raw_json
FROM bridge_management_tasks
WHERE status IN (?1, ?2, ?3)
ORDER BY updated_at_ms DESC
LIMIT 1",
params![
serde_json::to_string(&BridgeManagementStatus::Queued)?,
serde_json::to_string(&BridgeManagementStatus::Running)?,
serde_json::to_string(&BridgeManagementStatus::Reconnecting)?,
],
|row| {
let raw: String = row.get(0)?;
decode_json_row(raw)
},
)
.optional()?;
Ok(task)
}
}