diff --git a/src/sql.rs b/src/sql.rs
index 7779b47e6..e722d539c 100644
--- a/src/sql.rs
+++ b/src/sql.rs
@@ -217,20 +217,37 @@ impl Sql {
.unwrap_or_default()
}
- pub fn query_get_value
(&self, context: &Context, query: &str, params: P) -> Option
+ /// Executes a query which is expected to return one row and one
+ /// column. If the query does not return a value or returns SQL
+ /// `NULL`, returns `Ok(None)`.
+ pub fn query_get_value_result(&self, query: &str, params: P) -> Result>
where
P: IntoIterator,
P::Item: rusqlite::ToSql,
T: rusqlite::types::FromSql,
{
match self.query_row(query, params, |row| row.get::<_, T>(0)) {
- Ok(res) => Some(res),
- Err(Error::Sql(rusqlite::Error::QueryReturnedNoRows)) => None,
+ Ok(res) => Ok(Some(res)),
+ Err(Error::Sql(rusqlite::Error::QueryReturnedNoRows)) => Ok(None),
Err(Error::Sql(rusqlite::Error::InvalidColumnType(
_,
_,
rusqlite::types::Type::Null,
- ))) => None,
+ ))) => Ok(None),
+ Err(err) => Err(err),
+ }
+ }
+
+ /// Not resultified version of `query_get_value_result`. Returns
+ /// `None` on error.
+ pub fn query_get_value(&self, context: &Context, query: &str, params: P) -> Option
+ where
+ P: IntoIterator,
+ P::Item: rusqlite::ToSql,
+ T: rusqlite::types::FromSql,
+ {
+ match self.query_get_value_result(query, params) {
+ Ok(res) => res,
Err(err) => {
error!(context, "sql: Failed query_row: {}", err);
None