From 07d67d31e3d0f2584719924df5ca20622d6600a0 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Sat, 1 Oct 2022 22:46:47 +0200
Subject: [PATCH] DB: Run migrations when opening the database

---
 src/rust/liblektor-rs/Cargo.toml          |  6 ++++--
 src/rust/liblektor-rs/src/database/mod.rs | 20 ++++++++++++++++++++
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/rust/liblektor-rs/Cargo.toml b/src/rust/liblektor-rs/Cargo.toml
index 7e9d12c7..16435bdb 100644
--- a/src/rust/liblektor-rs/Cargo.toml
+++ b/src/rust/liblektor-rs/Cargo.toml
@@ -7,5 +7,7 @@ edition = "2021"
 crate-type = [ "staticlib" ]
 
 [dependencies]
-libc   = "0.2.0"
-diesel = { version = "2", default-features = false, features = [ "sqlite" ] }
+log               = "0.4"
+libc              = "0.2.0"
+diesel_migrations = "2"
+diesel            = { version = "2", default-features = false, features = [ "sqlite" ] }
diff --git a/src/rust/liblektor-rs/src/database/mod.rs b/src/rust/liblektor-rs/src/database/mod.rs
index 8ea4ab39..bf76fec2 100644
--- a/src/rust/liblektor-rs/src/database/mod.rs
+++ b/src/rust/liblektor-rs/src/database/mod.rs
@@ -1,4 +1,24 @@
 pub(self) use diesel::prelude::*;
+use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness};
+pub(self) use log::*;
 
 pub mod models;
 pub mod schema;
+
+/// The migrations!
+const MIGRATIONS: EmbeddedMigrations = embed_migrations!();
+
+/// Run migrations in a connexion!
+fn run_migration(conn: &mut SqliteConnection) -> Result<(), String> {
+    conn.run_pending_migrations(MIGRATIONS)
+        .map_err(|err| err.to_string())
+        .map(|_| ())
+}
+
+/// Create a connexion to a database and run automatically the migrations.
+pub fn establish_connection(path: impl AsRef<str>) -> Result<SqliteConnection, String> {
+    let mut conn = SqliteConnection::establish(path.as_ref())
+        .map_err(|err| format!("error connecting to {}: {}", path.as_ref(), err))?;
+    self::run_migration(&mut conn)?;
+    Ok(conn)
+}
-- 
GitLab