The backend of a gist server written in Rust
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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. }