musicus/crates/database/src/lib.rs

67 lines
1.5 KiB
Rust
Raw Normal View History

2021-02-04 21:47:22 +01:00
// Required for schema.rs
#[macro_use]
extern crate diesel;
// Required for embed_migrations macro in database.rs
#[macro_use]
extern crate diesel_migrations;
2020-11-17 15:52:47 +01:00
use diesel::prelude::*;
2021-04-25 23:12:19 +02:00
use log::info;
2020-11-17 15:52:47 +01:00
pub mod ensembles;
pub use ensembles::*;
pub mod error;
pub use error::*;
2020-11-17 15:52:47 +01:00
pub mod instruments;
pub use instruments::*;
2020-12-20 11:47:27 +01:00
pub mod medium;
pub use medium::*;
2020-11-17 15:52:47 +01:00
pub mod persons;
pub use persons::*;
pub mod recordings;
pub use recordings::*;
pub mod works;
pub use works::*;
mod schema;
// This makes the SQL migration scripts accessible from the code.
embed_migrations!();
2020-11-28 21:45:22 +01:00
/// Generate a random string suitable as an item ID.
pub fn generate_id() -> String {
2022-05-01 18:38:40 +02:00
uuid::Uuid::new_v4().simple().to_string()
2020-11-28 21:45:22 +01:00
}
2020-11-17 15:52:47 +01:00
/// Interface to a Musicus database.
pub struct Database {
connection: SqliteConnection,
}
impl Database {
/// Create a new database interface and run migrations if necessary.
2021-02-04 21:47:22 +01:00
pub fn new(file_name: &str) -> Result<Database> {
2021-04-25 23:12:19 +02:00
info!("Opening database file '{}'", file_name);
2020-11-17 15:52:47 +01:00
let connection = SqliteConnection::establish(file_name)?;
diesel::sql_query("PRAGMA foreign_keys = ON").execute(&connection)?;
2021-04-25 23:12:19 +02:00
info!("Running migrations if necessary");
2020-11-17 15:52:47 +01:00
embedded_migrations::run(&connection)?;
Ok(Database { connection })
}
/// Defer all foreign keys for the next transaction.
2021-02-04 21:47:22 +01:00
fn defer_foreign_keys(&self) -> Result<()> {
2020-11-17 15:52:47 +01:00
diesel::sql_query("PRAGMA defer_foreign_keys = ON").execute(&self.connection)?;
Ok(())
}
}