2021-04-14 01:19:14 +00:00
|
|
|
use rocket::{Rocket, Build};
|
|
|
|
use rocket::figment::{self, Figment, providers::Serialized};
|
|
|
|
|
|
|
|
use serde::{Serialize, Deserialize};
|
|
|
|
|
2021-03-12 23:44:19 +00:00
|
|
|
/// A base `Config` for any `Poolable` type.
|
|
|
|
///
|
|
|
|
/// For the following configuration:
|
|
|
|
///
|
|
|
|
/// ```toml
|
|
|
|
/// [global.databases.my_database]
|
|
|
|
/// url = "postgres://root:root@localhost/my_database"
|
|
|
|
/// pool_size = 10
|
|
|
|
/// timeout = 5
|
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// ...`Config::from("my_database", rocket)` would return the following struct:
|
|
|
|
///
|
|
|
|
/// ```rust
|
2021-05-25 01:58:05 +00:00
|
|
|
/// # use rocket_sync_db_pools::Config;
|
2021-03-12 23:44:19 +00:00
|
|
|
/// Config {
|
|
|
|
/// url: "postgres://root:root@localhost/my_database".into(),
|
|
|
|
/// pool_size: 10,
|
|
|
|
/// timeout: 5
|
|
|
|
/// };
|
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// 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
|
|
|
|
/// 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)]
|
|
|
|
pub struct Config {
|
|
|
|
/// Connection URL specified in the Rocket configuration.
|
|
|
|
pub url: String,
|
2021-04-14 01:19:14 +00:00
|
|
|
/// Initial pool size. Defaults to the number of Rocket workers * 4.
|
2021-03-12 23:44:19 +00:00
|
|
|
pub pool_size: u32,
|
|
|
|
/// How long to wait, in seconds, for a new connection before timing out.
|
|
|
|
/// Defaults to `5`.
|
|
|
|
// FIXME: Use `time`.
|
|
|
|
pub timeout: u8,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Config {
|
|
|
|
/// Retrieves the database configuration for the database named `name`.
|
|
|
|
///
|
|
|
|
/// This function is primarily used by the generated code from the
|
|
|
|
/// `#[database]` attribute.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// # #[cfg(feature = "diesel_sqlite_pool")] {
|
|
|
|
/// # use rocket::figment::{Figment, providers::{Format, Toml}};
|
|
|
|
/// // Assume that these are the contents of `Rocket.toml`:
|
|
|
|
/// # let toml = Toml::string(r#"
|
2021-04-28 08:13:11 +00:00
|
|
|
/// [default.databases]
|
2021-03-12 23:44:19 +00:00
|
|
|
/// my_db = { url = "db/db.sqlite", pool_size = 25 }
|
|
|
|
/// my_other_db = { url = "mysql://root:root@localhost/database" }
|
|
|
|
/// # "#).nested();
|
|
|
|
///
|
Introduce statically-enforced 'Rocket' phasing.
The core 'Rocket' type is parameterized: 'Rocket<P: Phase>', where
'Phase' is a newly introduced, sealed marker trait. The trait is
implemented by three new marker types representing the three launch
phases: 'Build', 'Ignite', and 'Orbit'. Progression through these three
phases, in order, is enforced, as are the invariants guaranteed by each
phase. In particular, an instance of 'Rocket' is guaranteed to be in its
final configuration after the 'Build' phase and represent a running
local or public server in the 'Orbit' phase. The 'Ignite' phase serves
as an intermediate, enabling inspection of a finalized but stationary
instance. Transition between phases validates the invariants required
by the transition.
All APIs have been adjusted appropriately, requiring either an instance
of 'Rocket' in a particular phase ('Rocket<Build>', 'Rocket<Ignite>', or
'Rocket<Orbit>') or operating generically on a 'Rocket<P>'.
Documentation is also updated and substantially improved to mention
required and guaranteed invariants.
Additionally, this commit makes the following relevant changes:
* 'Rocket::ignite()' is now a public interface.
* 'Rocket::{build,custom}' methods can no longer panic.
* 'Launch' fairings are now 'ignite' fairings.
* 'Liftoff' fairings are always run, even in local mode.
* All 'ignite' fairings run concurrently at ignition.
* Launch logging occurs on launch, not any point prior.
* Launch log messages have improved formatting.
* A new launch error kind, 'Config', was added.
* A 'fairing::Result' type alias was introduced.
* 'Shutdown::shutdown()' is now 'Shutdown::notify()'.
Some internal changes were also introduced:
* Fairing 'Info' name for 'Templates' is now 'Templating'.
* Shutdown is implemented using 'tokio::sync::Notify'.
* 'Client::debug()' is used nearly universally in tests.
Resolves #1154.
Resolves #1136.
2021-04-14 02:26:45 +00:00
|
|
|
/// use rocket::{Rocket, Build};
|
2021-05-25 01:58:05 +00:00
|
|
|
/// use rocket_sync_db_pools::Config;
|
2021-03-12 23:44:19 +00:00
|
|
|
///
|
Introduce statically-enforced 'Rocket' phasing.
The core 'Rocket' type is parameterized: 'Rocket<P: Phase>', where
'Phase' is a newly introduced, sealed marker trait. The trait is
implemented by three new marker types representing the three launch
phases: 'Build', 'Ignite', and 'Orbit'. Progression through these three
phases, in order, is enforced, as are the invariants guaranteed by each
phase. In particular, an instance of 'Rocket' is guaranteed to be in its
final configuration after the 'Build' phase and represent a running
local or public server in the 'Orbit' phase. The 'Ignite' phase serves
as an intermediate, enabling inspection of a finalized but stationary
instance. Transition between phases validates the invariants required
by the transition.
All APIs have been adjusted appropriately, requiring either an instance
of 'Rocket' in a particular phase ('Rocket<Build>', 'Rocket<Ignite>', or
'Rocket<Orbit>') or operating generically on a 'Rocket<P>'.
Documentation is also updated and substantially improved to mention
required and guaranteed invariants.
Additionally, this commit makes the following relevant changes:
* 'Rocket::ignite()' is now a public interface.
* 'Rocket::{build,custom}' methods can no longer panic.
* 'Launch' fairings are now 'ignite' fairings.
* 'Liftoff' fairings are always run, even in local mode.
* All 'ignite' fairings run concurrently at ignition.
* Launch logging occurs on launch, not any point prior.
* Launch log messages have improved formatting.
* A new launch error kind, 'Config', was added.
* A 'fairing::Result' type alias was introduced.
* 'Shutdown::shutdown()' is now 'Shutdown::notify()'.
Some internal changes were also introduced:
* Fairing 'Info' name for 'Templates' is now 'Templating'.
* Shutdown is implemented using 'tokio::sync::Notify'.
* 'Client::debug()' is used nearly universally in tests.
Resolves #1154.
Resolves #1136.
2021-04-14 02:26:45 +00:00
|
|
|
/// fn pool(rocket: &Rocket<Build>) {
|
2021-03-12 23:44:19 +00:00
|
|
|
/// let config = Config::from("my_db", rocket).unwrap();
|
|
|
|
/// assert_eq!(config.url, "db/db.sqlite");
|
|
|
|
/// assert_eq!(config.pool_size, 25);
|
|
|
|
///
|
|
|
|
/// let config = Config::from("my_other_db", rocket).unwrap();
|
|
|
|
/// assert_eq!(config.url, "mysql://root:root@localhost/database");
|
2021-04-14 01:19:14 +00:00
|
|
|
///
|
|
|
|
/// let workers = rocket.figment().extract_inner::<u32>(rocket::Config::WORKERS);
|
|
|
|
/// assert_eq!(config.pool_size, (workers.unwrap() * 4));
|
2021-03-12 23:44:19 +00:00
|
|
|
///
|
|
|
|
/// let config = Config::from("unknown_db", rocket);
|
|
|
|
/// assert!(config.is_err())
|
|
|
|
/// }
|
|
|
|
/// #
|
|
|
|
/// # let config = Figment::from(rocket::Config::default()).merge(toml);
|
|
|
|
/// # let rocket = rocket::custom(config);
|
|
|
|
/// # pool(&rocket);
|
|
|
|
/// # }
|
|
|
|
/// ```
|
Introduce statically-enforced 'Rocket' phasing.
The core 'Rocket' type is parameterized: 'Rocket<P: Phase>', where
'Phase' is a newly introduced, sealed marker trait. The trait is
implemented by three new marker types representing the three launch
phases: 'Build', 'Ignite', and 'Orbit'. Progression through these three
phases, in order, is enforced, as are the invariants guaranteed by each
phase. In particular, an instance of 'Rocket' is guaranteed to be in its
final configuration after the 'Build' phase and represent a running
local or public server in the 'Orbit' phase. The 'Ignite' phase serves
as an intermediate, enabling inspection of a finalized but stationary
instance. Transition between phases validates the invariants required
by the transition.
All APIs have been adjusted appropriately, requiring either an instance
of 'Rocket' in a particular phase ('Rocket<Build>', 'Rocket<Ignite>', or
'Rocket<Orbit>') or operating generically on a 'Rocket<P>'.
Documentation is also updated and substantially improved to mention
required and guaranteed invariants.
Additionally, this commit makes the following relevant changes:
* 'Rocket::ignite()' is now a public interface.
* 'Rocket::{build,custom}' methods can no longer panic.
* 'Launch' fairings are now 'ignite' fairings.
* 'Liftoff' fairings are always run, even in local mode.
* All 'ignite' fairings run concurrently at ignition.
* Launch logging occurs on launch, not any point prior.
* Launch log messages have improved formatting.
* A new launch error kind, 'Config', was added.
* A 'fairing::Result' type alias was introduced.
* 'Shutdown::shutdown()' is now 'Shutdown::notify()'.
Some internal changes were also introduced:
* Fairing 'Info' name for 'Templates' is now 'Templating'.
* Shutdown is implemented using 'tokio::sync::Notify'.
* 'Client::debug()' is used nearly universally in tests.
Resolves #1154.
Resolves #1136.
2021-04-14 02:26:45 +00:00
|
|
|
pub fn from(db_name: &str, rocket: &Rocket<Build>) -> Result<Config, figment::Error> {
|
2021-04-08 06:06:44 +00:00
|
|
|
Config::figment(db_name, rocket).extract::<Self>()
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Returns a `Figment` focused on the configuration for the database with
|
|
|
|
/// name `db_name`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```rust
|
Introduce statically-enforced 'Rocket' phasing.
The core 'Rocket' type is parameterized: 'Rocket<P: Phase>', where
'Phase' is a newly introduced, sealed marker trait. The trait is
implemented by three new marker types representing the three launch
phases: 'Build', 'Ignite', and 'Orbit'. Progression through these three
phases, in order, is enforced, as are the invariants guaranteed by each
phase. In particular, an instance of 'Rocket' is guaranteed to be in its
final configuration after the 'Build' phase and represent a running
local or public server in the 'Orbit' phase. The 'Ignite' phase serves
as an intermediate, enabling inspection of a finalized but stationary
instance. Transition between phases validates the invariants required
by the transition.
All APIs have been adjusted appropriately, requiring either an instance
of 'Rocket' in a particular phase ('Rocket<Build>', 'Rocket<Ignite>', or
'Rocket<Orbit>') or operating generically on a 'Rocket<P>'.
Documentation is also updated and substantially improved to mention
required and guaranteed invariants.
Additionally, this commit makes the following relevant changes:
* 'Rocket::ignite()' is now a public interface.
* 'Rocket::{build,custom}' methods can no longer panic.
* 'Launch' fairings are now 'ignite' fairings.
* 'Liftoff' fairings are always run, even in local mode.
* All 'ignite' fairings run concurrently at ignition.
* Launch logging occurs on launch, not any point prior.
* Launch log messages have improved formatting.
* A new launch error kind, 'Config', was added.
* A 'fairing::Result' type alias was introduced.
* 'Shutdown::shutdown()' is now 'Shutdown::notify()'.
Some internal changes were also introduced:
* Fairing 'Info' name for 'Templates' is now 'Templating'.
* Shutdown is implemented using 'tokio::sync::Notify'.
* 'Client::debug()' is used nearly universally in tests.
Resolves #1154.
Resolves #1136.
2021-04-14 02:26:45 +00:00
|
|
|
/// use rocket::{Rocket, Build};
|
2021-05-25 01:58:05 +00:00
|
|
|
/// use rocket_sync_db_pools::Config;
|
2021-04-08 06:06:44 +00:00
|
|
|
///
|
Introduce statically-enforced 'Rocket' phasing.
The core 'Rocket' type is parameterized: 'Rocket<P: Phase>', where
'Phase' is a newly introduced, sealed marker trait. The trait is
implemented by three new marker types representing the three launch
phases: 'Build', 'Ignite', and 'Orbit'. Progression through these three
phases, in order, is enforced, as are the invariants guaranteed by each
phase. In particular, an instance of 'Rocket' is guaranteed to be in its
final configuration after the 'Build' phase and represent a running
local or public server in the 'Orbit' phase. The 'Ignite' phase serves
as an intermediate, enabling inspection of a finalized but stationary
instance. Transition between phases validates the invariants required
by the transition.
All APIs have been adjusted appropriately, requiring either an instance
of 'Rocket' in a particular phase ('Rocket<Build>', 'Rocket<Ignite>', or
'Rocket<Orbit>') or operating generically on a 'Rocket<P>'.
Documentation is also updated and substantially improved to mention
required and guaranteed invariants.
Additionally, this commit makes the following relevant changes:
* 'Rocket::ignite()' is now a public interface.
* 'Rocket::{build,custom}' methods can no longer panic.
* 'Launch' fairings are now 'ignite' fairings.
* 'Liftoff' fairings are always run, even in local mode.
* All 'ignite' fairings run concurrently at ignition.
* Launch logging occurs on launch, not any point prior.
* Launch log messages have improved formatting.
* A new launch error kind, 'Config', was added.
* A 'fairing::Result' type alias was introduced.
* 'Shutdown::shutdown()' is now 'Shutdown::notify()'.
Some internal changes were also introduced:
* Fairing 'Info' name for 'Templates' is now 'Templating'.
* Shutdown is implemented using 'tokio::sync::Notify'.
* 'Client::debug()' is used nearly universally in tests.
Resolves #1154.
Resolves #1136.
2021-04-14 02:26:45 +00:00
|
|
|
/// fn pool(rocket: &Rocket<Build>) {
|
2021-04-08 06:06:44 +00:00
|
|
|
/// let my_db_figment = Config::figment("my_db", rocket);
|
|
|
|
/// let mysql_prod_figment = Config::figment("mysql_prod", rocket);
|
|
|
|
/// }
|
|
|
|
/// ```
|
Introduce statically-enforced 'Rocket' phasing.
The core 'Rocket' type is parameterized: 'Rocket<P: Phase>', where
'Phase' is a newly introduced, sealed marker trait. The trait is
implemented by three new marker types representing the three launch
phases: 'Build', 'Ignite', and 'Orbit'. Progression through these three
phases, in order, is enforced, as are the invariants guaranteed by each
phase. In particular, an instance of 'Rocket' is guaranteed to be in its
final configuration after the 'Build' phase and represent a running
local or public server in the 'Orbit' phase. The 'Ignite' phase serves
as an intermediate, enabling inspection of a finalized but stationary
instance. Transition between phases validates the invariants required
by the transition.
All APIs have been adjusted appropriately, requiring either an instance
of 'Rocket' in a particular phase ('Rocket<Build>', 'Rocket<Ignite>', or
'Rocket<Orbit>') or operating generically on a 'Rocket<P>'.
Documentation is also updated and substantially improved to mention
required and guaranteed invariants.
Additionally, this commit makes the following relevant changes:
* 'Rocket::ignite()' is now a public interface.
* 'Rocket::{build,custom}' methods can no longer panic.
* 'Launch' fairings are now 'ignite' fairings.
* 'Liftoff' fairings are always run, even in local mode.
* All 'ignite' fairings run concurrently at ignition.
* Launch logging occurs on launch, not any point prior.
* Launch log messages have improved formatting.
* A new launch error kind, 'Config', was added.
* A 'fairing::Result' type alias was introduced.
* 'Shutdown::shutdown()' is now 'Shutdown::notify()'.
Some internal changes were also introduced:
* Fairing 'Info' name for 'Templates' is now 'Templating'.
* Shutdown is implemented using 'tokio::sync::Notify'.
* 'Client::debug()' is used nearly universally in tests.
Resolves #1154.
Resolves #1136.
2021-04-14 02:26:45 +00:00
|
|
|
pub fn figment(db_name: &str, rocket: &Rocket<Build>) -> Figment {
|
2021-03-12 23:44:19 +00:00
|
|
|
let db_key = format!("databases.{}", db_name);
|
2021-04-14 01:19:14 +00:00
|
|
|
let default_pool_size = rocket.figment()
|
|
|
|
.extract_inner::<u32>(rocket::Config::WORKERS)
|
|
|
|
.map(|workers| workers * 4)
|
|
|
|
.ok();
|
|
|
|
|
|
|
|
let figment = Figment::from(rocket.figment())
|
2021-04-08 06:06:44 +00:00
|
|
|
.focus(&db_key)
|
2021-04-14 01:19:14 +00:00
|
|
|
.join(Serialized::default("timeout", 5));
|
|
|
|
|
|
|
|
match default_pool_size {
|
|
|
|
Some(pool_size) => figment.join(Serialized::default("pool_size", pool_size)),
|
|
|
|
None => figment
|
|
|
|
}
|
2021-03-12 23:44:19 +00:00
|
|
|
}
|
|
|
|
}
|