@@ -112,7 +112,7 @@ pub async fn load<R: Runtime>(
112112 // Wait for migrations to complete if registered for this database
113113 await_migrations ( & migration_states, & db) . await ?;
114114
115- let instances = db_instances. 0 . read ( ) . await ;
115+ let instances = db_instances. inner . read ( ) . await ;
116116
117117 // Return cached if db was already loaded
118118 if instances. contains_key ( & db) {
@@ -121,7 +121,14 @@ pub async fn load<R: Runtime>(
121121
122122 drop ( instances) ; // Release read lock before acquiring write lock
123123
124- let mut instances = db_instances. 0 . write ( ) . await ;
124+ let mut instances = db_instances. inner . write ( ) . await ;
125+
126+ // Check database count limit before creating a new connection.
127+ // This check is before entry() to avoid borrow conflicts, and the write lock
128+ // prevents races between the len() check and the insert.
129+ if !instances. contains_key ( & db) && instances. len ( ) >= db_instances. max {
130+ return Err ( Error :: TooManyDatabases ( db_instances. max ) ) ;
131+ }
125132
126133 // Use entry API to atomically check and insert, avoiding race conditions
127134 // where two callers could both create wrappers
@@ -187,7 +194,7 @@ pub async fn execute(
187194 values : Vec < JsonValue > ,
188195 attached : Option < Vec < AttachedDatabaseSpec > > ,
189196) -> Result < ( u64 , i64 ) > {
190- let instances = db_instances. 0 . read ( ) . await ;
197+ let instances = db_instances. inner . read ( ) . await ;
191198
192199 let wrapper = instances
193200 . get ( & db)
@@ -214,7 +221,7 @@ pub async fn execute_transaction(
214221 statements : Vec < Statement > ,
215222 attached : Option < Vec < AttachedDatabaseSpec > > ,
216223) -> Result < Vec < WriteQueryResult > > {
217- let instances = db_instances. 0 . read ( ) . await ;
224+ let instances = db_instances. inner . read ( ) . await ;
218225
219226 let wrapper = instances
220227 . get ( & db)
@@ -292,7 +299,7 @@ pub async fn fetch_all(
292299 values : Vec < JsonValue > ,
293300 attached : Option < Vec < AttachedDatabaseSpec > > ,
294301) -> Result < Vec < IndexMap < String , JsonValue > > > {
295- let instances = db_instances. 0 . read ( ) . await ;
302+ let instances = db_instances. inner . read ( ) . await ;
296303
297304 let wrapper = instances
298305 . get ( & db)
@@ -319,7 +326,7 @@ pub async fn fetch_one(
319326 values : Vec < JsonValue > ,
320327 attached : Option < Vec < AttachedDatabaseSpec > > ,
321328) -> Result < Option < IndexMap < String , JsonValue > > > {
322- let instances = db_instances. 0 . read ( ) . await ;
329+ let instances = db_instances. inner . read ( ) . await ;
323330
324331 let wrapper = instances
325332 . get ( & db)
@@ -357,7 +364,7 @@ pub async fn fetch_page(
357364 ) ) ;
358365 }
359366
360- let instances = db_instances. 0 . read ( ) . await ;
367+ let instances = db_instances. inner . read ( ) . await ;
361368
362369 let wrapper = instances
363370 . get ( & db)
@@ -394,7 +401,7 @@ pub async fn close(
394401) -> Result < bool > {
395402 active_subs. remove_for_db ( & db) . await ;
396403
397- let mut instances = db_instances. 0 . write ( ) . await ;
404+ let mut instances = db_instances. inner . write ( ) . await ;
398405
399406 if let Some ( wrapper) = instances. remove ( & db) {
400407 wrapper. close ( ) . await ?;
@@ -415,7 +422,7 @@ pub async fn close_all(
415422) -> Result < ( ) > {
416423 active_subs. abort_all ( ) . await ;
417424
418- let mut instances = db_instances. 0 . write ( ) . await ;
425+ let mut instances = db_instances. inner . write ( ) . await ;
419426
420427 // Collect all wrappers to close
421428 let wrappers: Vec < DatabaseWrapper > = instances. drain ( ) . map ( |( _, v) | v) . collect ( ) ;
@@ -447,7 +454,7 @@ pub async fn remove(
447454) -> Result < bool > {
448455 active_subs. remove_for_db ( & db) . await ;
449456
450- let mut instances = db_instances. 0 . write ( ) . await ;
457+ let mut instances = db_instances. inner . write ( ) . await ;
451458
452459 if let Some ( wrapper) = instances. remove ( & db) {
453460 wrapper. remove ( ) . await ?;
@@ -489,7 +496,7 @@ pub async fn begin_interruptible_transaction(
489496 initial_statements : Vec < Statement > ,
490497 attached : Option < Vec < AttachedDatabaseSpec > > ,
491498) -> Result < TransactionToken > {
492- let instances = db_instances. 0 . read ( ) . await ;
499+ let instances = db_instances. inner . read ( ) . await ;
493500
494501 let wrapper = instances
495502 . get ( & db)
@@ -641,7 +648,7 @@ pub async fn observe(
641648 // enable_observation() drops the old broker
642649 active_subs. remove_for_db ( & db) . await ;
643650
644- let mut instances = db_instances. 0 . write ( ) . await ;
651+ let mut instances = db_instances. inner . write ( ) . await ;
645652
646653 let wrapper = instances
647654 . get_mut ( & db)
@@ -683,7 +690,7 @@ pub async fn subscribe(
683690 tables : Vec < String > ,
684691 on_event : Channel < TableChangePayload > ,
685692) -> Result < String > {
686- let instances = db_instances. 0 . read ( ) . await ;
693+ let instances = db_instances. inner . read ( ) . await ;
687694
688695 let wrapper = instances
689696 . get ( & db)
@@ -747,7 +754,7 @@ pub async fn unobserve(
747754 // Abort all subscriptions for this database first
748755 active_subs. remove_for_db ( & db) . await ;
749756
750- let mut instances = db_instances. 0 . write ( ) . await ;
757+ let mut instances = db_instances. inner . write ( ) . await ;
751758
752759 let wrapper = instances
753760 . get_mut ( & db)
0 commit comments