Skip to content

Commit 4563689

Browse files
committed
feat(core): expose acquired pool connections
1 parent 75bc048 commit 4563689

3 files changed

Lines changed: 51 additions & 0 deletions

File tree

sqlx-core/src/pool/inner.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ impl<DB: Database> PoolInner<DB> {
8484
self.num_idle.load(Ordering::Acquire)
8585
}
8686

87+
pub(super) fn num_acquired(&self) -> u32 {
88+
self.size()
89+
.saturating_sub(u32::try_from(self.num_idle()).unwrap_or(u32::MAX))
90+
}
91+
8792
pub(super) fn is_closed(&self) -> bool {
8893
self.is_closed.load(Ordering::Acquire)
8994
}

sqlx-core/src/pool/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,14 @@ impl<DB: Database> Pool<DB> {
541541
self.0.num_idle()
542542
}
543543

544+
/// Returns the number of connections currently checked out from the pool.
545+
///
546+
/// This is an instantaneous snapshot. The value may change immediately as
547+
/// tasks acquire or release connections.
548+
pub fn num_acquired(&self) -> u32 {
549+
self.0.num_acquired()
550+
}
551+
544552
/// Gets a clone of the connection options for this pool
545553
pub fn connect_options(&self) -> Arc<<DB::Connection as Connection>::Options> {
546554
self.0
@@ -581,6 +589,7 @@ impl<DB: Database> fmt::Debug for Pool<DB> {
581589
fmt.debug_struct("Pool")
582590
.field("size", &self.0.size())
583591
.field("num_idle", &self.0.num_idle())
592+
.field("num_acquired", &self.0.num_acquired())
584593
.field("is_closed", &self.0.is_closed())
585594
.field("options", &self.0.options)
586595
.finish()

tests/any/pool.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,43 @@ async fn pool_should_be_returned_failed_transactions() -> anyhow::Result<()> {
7171
Ok(())
7272
}
7373

74+
#[sqlx_macros::test]
75+
async fn pool_should_report_acquired_connections() -> anyhow::Result<()> {
76+
sqlx::any::install_default_drivers();
77+
78+
let pool = AnyPoolOptions::new()
79+
.max_connections(2)
80+
.connect(&dotenvy::var("DATABASE_URL")?)
81+
.await?;
82+
83+
assert_eq!(pool.size(), 1);
84+
assert_eq!(pool.num_idle(), 1);
85+
assert_eq!(pool.num_acquired(), 0);
86+
87+
let mut conn1 = pool.acquire().await?;
88+
89+
assert_eq!(pool.size(), 1);
90+
assert_eq!(pool.num_idle(), 0);
91+
assert_eq!(pool.num_acquired(), 1);
92+
93+
let mut conn2 = pool.acquire().await?;
94+
95+
assert_eq!(pool.size(), 2);
96+
assert_eq!(pool.num_idle(), 0);
97+
assert_eq!(pool.num_acquired(), 2);
98+
99+
conn2.return_to_pool().await;
100+
conn1.return_to_pool().await;
101+
102+
assert_eq!(pool.size(), 2);
103+
assert_eq!(pool.num_idle(), 2);
104+
assert_eq!(pool.num_acquired(), 0);
105+
106+
pool.close().await;
107+
108+
Ok(())
109+
}
110+
74111
#[sqlx_macros::test]
75112
async fn test_pool_callbacks() -> anyhow::Result<()> {
76113
sqlx::any::install_default_drivers();

0 commit comments

Comments
 (0)