#[macro_use] extern crate diesel_codegen; pub mod models; pub mod schema; #[macro_use] extern crate diesel; extern crate dotenv; extern crate r2d2_diesel; extern crate r2d2; extern crate rocket; use diesel::pg::PgConnection; use r2d2_diesel::ConnectionManager; use dotenv::dotenv; use std::env; // An alias to the type for a pool of Diesel PostgreSql connections. type Pool = r2d2::Pool>; /// Initializes a database pool. pub fn init_db_pool() -> Pool { dotenv().ok(); let config = r2d2::Config::default(); let dburl = env::var("DATABASE_URL") .expect("DATABASE_URL environment variable must be set"); let manager = ConnectionManager::::new(dburl); r2d2::Pool::new(config, manager).expect("db pool") } use std::ops::Deref; use rocket::http::Status; use rocket::request::{self, FromRequest}; use rocket::{Request, State, Outcome}; // Connection request guard type: a wrapper around an r2d2 pooled connection. pub struct DbConn(pub r2d2::PooledConnection>); /// Attempts to retrieve a single connection from the managed database pool. If /// no pool is currently managed, fails with an `InternalServerError` status. If /// no connections are available, fails with a `ServiceUnavailable` status. impl<'a, 'r> FromRequest<'a, 'r> for DbConn { type Error = (); fn from_request(request: &'a Request<'r>) -> request::Outcome { let pool = request.guard::>()?; match pool.get() { Ok(conn) => Outcome::Success(DbConn(conn)), Err(_) => Outcome::Failure((Status::ServiceUnavailable, ())) } } } // For the convenience of using an &DbConn as an &SqliteConnection. impl Deref for DbConn { type Target = PgConnection; fn deref(&self) -> &Self::Target { &self.0 } }