The backend of a gist server written in Rust
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

connection.rs 1.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. use diesel::pg::PgConnection;
  2. use r2d2;
  3. use r2d2_diesel::ConnectionManager;
  4. use rocket::http::Status;
  5. use rocket::request::{self, FromRequest};
  6. use rocket::{Outcome, Request, State};
  7. use std::env;
  8. use std::ops::Deref;
  9. type Pool = r2d2::Pool<ConnectionManager<PgConnection>>;
  10. pub fn init_pool() -> Pool {
  11. let manager = ConnectionManager::<PgConnection>::new(database_url());
  12. Pool::new(manager).expect("db pool")
  13. }
  14. fn database_url() -> String {
  15. env::var("DATABASE_URL").expect("DATABASE_URL must be set")
  16. }
  17. pub struct DbConn(pub r2d2::PooledConnection<ConnectionManager<PgConnection>>);
  18. impl<'a, 'r> FromRequest<'a, 'r> for DbConn {
  19. type Error = ();
  20. fn from_request(request: &'a Request<'r>) -> request::Outcome<DbConn, Self::Error> {
  21. let pool = request.guard::<State<Pool>>()?;
  22. match pool.get() {
  23. Ok(conn) => Outcome::Success(DbConn(conn)),
  24. Err(_) => Outcome::Failure((Status::ServiceUnavailable, ())),
  25. }
  26. }
  27. }
  28. impl Deref for DbConn {
  29. type Target = PgConnection;
  30. fn deref(&self) -> &Self::Target {
  31. &self.0
  32. }
  33. }