#[macro_use] extern crate diesel; #[macro_use] extern crate diesel_migrations; use crate::error::{DatabaseError, DatabaseResult}; use diesel::prelude::*; use diesel::r2d2::{ConnectionManager, ManageConnection, Pool}; use std::env; pub mod database; pub mod error; pub mod models; pub mod schema; pub static VERSION: &str = env!("CARGO_PKG_VERSION"); pub use database::Database; type PoolConnection = Pool>; embed_migrations!("../bot-database/migrations"); fn get_connection() -> DatabaseResult { let database_url = env::var("DATABASE_URL").expect("No DATABASE_URL in path"); log::debug!("Establishing database connection..."); let manager = ConnectionManager::::new(database_url); log::trace!("Connecting..."); manager .connect() .map_err(|e| DatabaseError::Msg(format!("{:?}", e)))?; log::trace!("Creating pool..."); let pool = Pool::builder().max_size(16).build(manager)?; log::trace!("Getting one connection to run migrations..."); let connection = pool.get()?; log::debug!("Running migrations..."); embedded_migrations::run(&connection)?; log::debug!("Migrations finished"); log::info!("Database connection initialized"); Ok(pool) } pub fn get_database() -> DatabaseResult { let conn = get_connection()?; Ok(Database::new(conn)) }