diff --git a/src/chat.rs b/src/chat.rs index 1f919871a..9961e4c4f 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -531,7 +531,7 @@ impl<'a> sqlx::FromRow<'a, sqlx::sqlite::SqliteRow> for Chat { .unwrap_or_default(), visibility: row.try_get("archived")?, blocked: row.try_get::, _>("blocked")?.unwrap_or_default(), - is_sending_locations: row.try_get("locations_send_until")?, + is_sending_locations: row.try_get::("locations_send_until")? > 0, mute_duration: row.try_get("muted_until")?, }; @@ -2082,6 +2082,7 @@ pub async fn get_gossiped_timestamp(context: &Context, chat_id: ChatId) -> i64 { paramsx![chat_id], ) .await + .map(|v: i32| v as i64) .unwrap_or_default() } diff --git a/src/contact.rs b/src/contact.rs index 794ac6fd0..6ec460538 100644 --- a/src/contact.rs +++ b/src/contact.rs @@ -1,12 +1,14 @@ //! Contacts module #![forbid(clippy::indexing_slicing)] +use std::convert::TryFrom; use async_std::path::PathBuf; use async_std::prelude::*; use itertools::Itertools; use lazy_static::lazy_static; use regex::Regex; +use sqlx::Row; use crate::aheader::EncryptPreference; use crate::chat::ChatId; @@ -135,10 +137,9 @@ impl Default for Origin { } impl<'a> sqlx::FromRow<'a, sqlx::sqlite::SqliteRow> for Contact { fn from_row(row: &sqlx::sqlite::SqliteRow) -> Result { - use sqlx::Row; - let contact = Self { - id: row.try_get::("id")? as u32, + id: u32::try_from(row.try_get::("id")?) + .map_err(|err| sqlx::Error::Decode(err.into()))?, name: row .try_get::, _>("name")? .unwrap_or_default(), @@ -674,7 +675,7 @@ SELECT c.id FROM contacts c .await .unwrap_or_default() .into_iter() - .map(|id: i64| id as u32) + .map(|id: i32| id as u32) .collect() } diff --git a/src/job.rs b/src/job.rs index 3a07748a5..c79a19ba2 100644 --- a/src/job.rs +++ b/src/job.rs @@ -148,7 +148,7 @@ impl fmt::Display for Job { impl<'a> sqlx::FromRow<'a, sqlx::sqlite::SqliteRow> for Job { fn from_row(row: &sqlx::sqlite::SqliteRow) -> Result { use sqlx::Row; - let foreign_id: i64 = row.try_get("foreign_id")?; + let foreign_id: i32 = row.try_get("foreign_id")?; if foreign_id < 0 { return Err(sqlx::Error::Decode( anyhow::anyhow!("invalid foreign_id").into(), @@ -156,12 +156,12 @@ impl<'a> sqlx::FromRow<'a, sqlx::sqlite::SqliteRow> for Job { } Ok(Job { - job_id: row.try_get::("id")? as u32, + job_id: row.try_get::("id")? as u32, action: row.try_get("action")?, foreign_id: foreign_id as u32, - desired_timestamp: row.try_get("desired_timestamp")?, - added_timestamp: row.try_get("added_timestamp")?, - tries: row.try_get::("tries")? as u32, + desired_timestamp: row.try_get_unchecked("desired_timestamp")?, + added_timestamp: row.try_get_unchecked("added_timestamp")?, + tries: row.try_get::("tries")? as u32, param: row .try_get::("param")? .parse() diff --git a/src/message.rs b/src/message.rs index 6096b8208..da1d25224 100644 --- a/src/message.rs +++ b/src/message.rs @@ -238,7 +238,7 @@ impl<'a> sqlx::FromRow<'a, sqlx::sqlite::SqliteRow> for Message { let id = row.try_get("id")?; let text; - if let Some(buf) = row.try_get::, _>("txt")? { + if let Some(buf) = row.try_get_unchecked::, _>("txt")? { if let Ok(t) = String::from_utf8(buf.to_vec()) { text = t; } else { @@ -257,13 +257,13 @@ impl<'a> sqlx::FromRow<'a, sqlx::sqlite::SqliteRow> for Message { rfc724_mid: row.try_get::("rfc724mid")?, in_reply_to: row.try_get::, _>("mime_in_reply_to")?, server_folder: row.try_get::, _>("server_folder")?, - server_uid: row.try_get::("server_uid")? as u32, + server_uid: row.try_get_unchecked::("server_uid")? as u32, chat_id: row.try_get("chat_id")?, - from_id: row.try_get::("from_id")? as u32, - to_id: row.try_get::("to_id")? as u32, - timestamp_sort: row.try_get("timestamp")?, - timestamp_sent: row.try_get("timestamp_sent")?, - timestamp_rcvd: row.try_get("timestamp_rcvd")?, + from_id: row.try_get::("from_id")? as u32, + to_id: row.try_get::("to_id")? as u32, + timestamp_sort: row.try_get_unchecked("timestamp")?, + timestamp_sent: row.try_get_unchecked("timestamp_sent")?, + timestamp_rcvd: row.try_get_unchecked("timestamp_rcvd")?, viewtype: row.try_get("type")?, state: row.try_get("state")?, is_dc_message: row.try_get("msgrmsg")?, @@ -272,9 +272,9 @@ impl<'a> sqlx::FromRow<'a, sqlx::sqlite::SqliteRow> for Message { .try_get::("param")? .parse() .unwrap_or_default(), - starred: row.try_get("starred")?, - hidden: row.try_get("hidden")?, - location_id: row.try_get::("location")? as u32, + starred: row.try_get::("starred")? > 0, + hidden: row.try_get::("hidden")? > 0, + location_id: row.try_get_unchecked::("location")? as u32, chat_blocked: row .try_get::, _>("blocked")? .unwrap_or_default(), @@ -864,9 +864,9 @@ pub async fn get_msg_info(context: &Context, msg_id: MsgId) -> Result sqlx::FromRow<'a, sqlx::sqlite::SqliteRow> for Peerstate { let mut res = Self::new(row.try_get("addr")?); - res.last_seen = row.try_get("last_seen")?; - res.last_seen_autocrypt = row.try_get("last_seen_autocrypt")?; + res.last_seen = row.try_get_unchecked("last_seen")?; + res.last_seen_autocrypt = row.try_get_unchecked("last_seen_autocrypt")?; res.prefer_encrypt = row.try_get("prefer_encrypted")?; - res.gossip_timestamp = row.try_get("gossip_timestamp")?; + res.gossip_timestamp = row.try_get_unchecked("gossip_timestamp")?; res.public_key_fingerprint = row .try_get::, _>("public_key_fingerprint")? diff --git a/src/sql/mod.rs b/src/sql/mod.rs index 3b69ece1f..369adfe6d 100644 --- a/src/sql/mod.rs +++ b/src/sql/mod.rs @@ -375,7 +375,7 @@ impl Sql { field.as_ref(), ); - let res: i64 = self.query_value(&query, paramsx![value.as_ref()]).await?; + let res: i32 = self.query_value(&query, paramsx![value.as_ref()]).await?; Ok(res as u32) } @@ -395,7 +395,7 @@ impl Sql { field2.as_ref(), ); - let res: i64 = self + let res: i32 = self .query_value(query.as_ref(), paramsx![value, value2]) .await?;