DbRelay: add 2 fields

This commit is contained in:
Mike Dilger 2022-12-28 08:37:59 +13:00
parent 6be709a9ed
commit 70b161fd7e

View File

@ -10,6 +10,8 @@ pub struct DbRelay {
pub success_count: u64, pub success_count: u64,
pub failure_count: u64, pub failure_count: u64,
pub rank: Option<u64>, pub rank: Option<u64>,
pub last_success_at: Option<u64>,
pub post: bool,
} }
impl DbRelay { impl DbRelay {
@ -21,11 +23,15 @@ impl DbRelay {
success_count: 0, success_count: 0,
failure_count: 0, failure_count: 0,
rank: Some(3), rank: Some(3),
last_success_at: None,
post: false,
}) })
} }
pub async fn fetch(criteria: Option<&str>) -> Result<Vec<DbRelay>, Error> { pub async fn fetch(criteria: Option<&str>) -> Result<Vec<DbRelay>, Error> {
let sql = "SELECT url, success_count, failure_count, rank FROM relay".to_owned(); let sql =
"SELECT url, success_count, failure_count, rank, last_success_at, post FROM relay"
.to_owned();
let sql = match criteria { let sql = match criteria {
None => sql, None => sql,
Some(crit) => format!("{} WHERE {}", sql, crit), Some(crit) => format!("{} WHERE {}", sql, crit),
@ -37,11 +43,14 @@ impl DbRelay {
let mut stmt = db.prepare(&sql)?; let mut stmt = db.prepare(&sql)?;
let rows = stmt.query_map([], |row| { let rows = stmt.query_map([], |row| {
let postint: u32 = row.get(5)?;
Ok(DbRelay { Ok(DbRelay {
url: row.get(0)?, url: row.get(0)?,
success_count: row.get(1)?, success_count: row.get(1)?,
failure_count: row.get(2)?, failure_count: row.get(2)?,
rank: row.get(3)?, rank: row.get(3)?,
last_success_at: row.get(4)?,
post: (postint > 0),
}) })
})?; })?;
@ -69,19 +78,22 @@ impl DbRelay {
pub async fn insert(relay: DbRelay) -> Result<(), Error> { pub async fn insert(relay: DbRelay) -> Result<(), Error> {
let _ = Url::new_validated(&relay.url)?; let _ = Url::new_validated(&relay.url)?;
let sql = "INSERT OR IGNORE INTO relay (url, success_count, failure_count, rank) \ let sql = "INSERT OR IGNORE INTO relay (url, success_count, failure_count, rank, last_success_at, post) \
VALUES (?1, ?2, ?3, ?4)"; VALUES (?1, ?2, ?3, ?4, ?5, ?6)";
spawn_blocking(move || { spawn_blocking(move || {
let maybe_db = GLOBALS.db.blocking_lock(); let maybe_db = GLOBALS.db.blocking_lock();
let db = maybe_db.as_ref().unwrap(); let db = maybe_db.as_ref().unwrap();
let mut stmt = db.prepare(sql)?; let mut stmt = db.prepare(sql)?;
let postint = i32::from(relay.post);
stmt.execute(( stmt.execute((
&relay.url, &relay.url,
&relay.success_count, &relay.success_count,
&relay.failure_count, &relay.failure_count,
&relay.rank, &relay.rank,
&relay.last_success_at,
&postint,
))?; ))?;
Ok::<(), Error>(()) Ok::<(), Error>(())
}) })
@ -91,17 +103,20 @@ impl DbRelay {
} }
pub async fn update(relay: DbRelay) -> Result<(), Error> { pub async fn update(relay: DbRelay) -> Result<(), Error> {
let sql = "UPDATE relay SET success_count=?, failure_count=?, rank=? WHERE url=?"; let sql = "UPDATE relay SET success_count=?, failure_count=?, rank=?, last_success_at=?, post=? WHERE url=?";
spawn_blocking(move || { spawn_blocking(move || {
let maybe_db = GLOBALS.db.blocking_lock(); let maybe_db = GLOBALS.db.blocking_lock();
let db = maybe_db.as_ref().unwrap(); let db = maybe_db.as_ref().unwrap();
let mut stmt = db.prepare(sql)?; let mut stmt = db.prepare(sql)?;
let postint = i32::from(relay.post);
stmt.execute(( stmt.execute((
&relay.success_count, &relay.success_count,
&relay.failure_count, &relay.failure_count,
&relay.rank, &relay.rank,
&relay.last_success_at,
&postint,
&relay.url, &relay.url,
))?; ))?;
Ok::<(), Error>(()) Ok::<(), Error>(())