summaryrefslogtreecommitdiff
path: root/src/db.rs
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-10-02 01:10:09 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-10-02 01:10:09 -0400
commit6f07e6869bbf62903ac83c9bc061e7bde997e6a8 (patch)
tree75fa34f83ccf207db83d3d0a34ff9963927fadf8 /src/db.rs
parent5d3392799f88c5a3d3f9c656c73d6e8ac5c4d793 (diff)
Retire top-level `repo`.
This helped me discover an organizational scheme I like more.
Diffstat (limited to 'src/db.rs')
-rw-r--r--src/db.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/db.rs b/src/db.rs
new file mode 100644
index 0000000..93a1169
--- /dev/null
+++ b/src/db.rs
@@ -0,0 +1,42 @@
+use std::str::FromStr;
+
+use sqlx::sqlite::{SqliteConnectOptions, SqlitePool, SqlitePoolOptions};
+
+pub async fn prepare(url: &str) -> sqlx::Result<SqlitePool> {
+ let pool = create(url).await?;
+ sqlx::migrate!().run(&pool).await?;
+ Ok(pool)
+}
+
+async fn create(database_url: &str) -> sqlx::Result<SqlitePool> {
+ let options = SqliteConnectOptions::from_str(database_url)?
+ .create_if_missing(true)
+ .optimize_on_close(true, /* analysis_limit */ None);
+
+ let pool = SqlitePoolOptions::new().connect_with(options).await?;
+ Ok(pool)
+}
+
+pub trait NotFound {
+ type Ok;
+ fn not_found<E, F>(self, map: F) -> Result<Self::Ok, E>
+ where
+ E: From<sqlx::Error>,
+ F: FnOnce() -> E;
+}
+
+impl<T> NotFound for Result<T, sqlx::Error> {
+ type Ok = T;
+
+ fn not_found<E, F>(self, map: F) -> Result<T, E>
+ where
+ E: From<sqlx::Error>,
+ F: FnOnce() -> E,
+ {
+ match self {
+ Err(sqlx::Error::RowNotFound) => Err(map()),
+ Err(other) => Err(other.into()),
+ Ok(value) => Ok(value),
+ }
+ }
+}