mirror of https://github.com/rwf2/Rocket.git
Improve database config errors.
This commit is contained in:
parent
aabbfcfe94
commit
491b229582
|
@ -394,7 +394,7 @@ use self::r2d2::ManageConnection;
|
||||||
#[cfg(feature = "memcache_pool")] pub extern crate memcache;
|
#[cfg(feature = "memcache_pool")] pub extern crate memcache;
|
||||||
#[cfg(feature = "memcache_pool")] pub extern crate r2d2_memcache;
|
#[cfg(feature = "memcache_pool")] pub extern crate r2d2_memcache;
|
||||||
|
|
||||||
/// A default, helper `Config` for any `Poolable` type.
|
/// A base `Config` for any `Poolable` type.
|
||||||
///
|
///
|
||||||
/// For the following configuration:
|
/// For the following configuration:
|
||||||
///
|
///
|
||||||
|
@ -419,6 +419,7 @@ use self::r2d2::ManageConnection;
|
||||||
/// If you want to implement your own custom database adapter (or other
|
/// If you want to implement your own custom database adapter (or other
|
||||||
/// database-like struct that can be pooled by `r2d2`) and need some more
|
/// database-like struct that can be pooled by `r2d2`) and need some more
|
||||||
/// configurations options, you may need to define a custom `Config` struct.
|
/// configurations options, you may need to define a custom `Config` struct.
|
||||||
|
/// Note, however, that the configuration values in `Config` are required.
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
/// Connection URL specified in the Rocket configuration.
|
/// Connection URL specified in the Rocket configuration.
|
||||||
|
@ -748,35 +749,33 @@ async fn run_blocking<F, R>(job: F) -> R
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! dberr {
|
||||||
|
($msg:literal, $db_name:expr, $efmt:literal, $error:expr, $rocket:expr) => ({
|
||||||
|
rocket::error!(concat!("database ", $msg, " error for pool named `{}`"), $db_name);
|
||||||
|
error_!($efmt, $error);
|
||||||
|
return Err($rocket);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
impl<K: 'static, C: Poolable> ConnectionPool<K, C> {
|
impl<K: 'static, C: Poolable> ConnectionPool<K, C> {
|
||||||
pub fn fairing(fairing_name: &'static str, db_name: &'static str) -> impl Fairing {
|
pub fn fairing(fairing_name: &'static str, db: &'static str) -> impl Fairing {
|
||||||
AdHoc::on_attach(fairing_name, move |mut rocket| async move {
|
AdHoc::on_attach(fairing_name, move |mut rocket| async move {
|
||||||
let cargo = rocket.inspect().await;
|
let cargo = rocket.inspect().await;
|
||||||
let config = match Config::from(db_name, cargo) {
|
let config = match Config::from(db, cargo) {
|
||||||
Ok(config) => config,
|
Ok(config) => config,
|
||||||
Err(config_error) => {
|
Err(e) => dberr!("config", db, "{}", e, rocket),
|
||||||
rocket::error!("database configuration error for '{}'", db_name);
|
|
||||||
error_!("{}", config_error);
|
|
||||||
return Err(rocket);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
match C::pool(db_name, cargo) {
|
let pool_size = config.pool_size;
|
||||||
Ok(pool) => {
|
match C::pool(db, cargo) {
|
||||||
let pool_size = config.pool_size;
|
Ok(pool) => Ok(rocket.manage(ConnectionPool::<K, C> {
|
||||||
let managed = ConnectionPool::<K, C> {
|
pool, config,
|
||||||
config, pool,
|
semaphore: Arc::new(Semaphore::new(pool_size as usize)),
|
||||||
semaphore: Arc::new(Semaphore::new(pool_size as usize)),
|
_marker: PhantomData,
|
||||||
_marker: PhantomData,
|
})),
|
||||||
};
|
Err(Error::Config(e)) => dberr!("config", db, "{}", e, rocket),
|
||||||
|
Err(Error::Pool(e)) => dberr!("pool init", db, "{}", e, rocket),
|
||||||
Ok(rocket.manage(managed))
|
Err(Error::Custom(e)) => dberr!("pool manager", db, "{:?}", e, rocket),
|
||||||
},
|
|
||||||
Err(pool_error) => {
|
|
||||||
rocket::error!("failed to initialize pool for '{}'", db_name);
|
|
||||||
error_!("{:?}", pool_error);
|
|
||||||
Err(rocket)
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue