@@ -7,48 +7,77 @@ use crate::WorkspaceError;
77
88use  super :: async_helper:: run_async; 
99
10- #[ derive( Debug ) ]  
1110pub ( crate )  struct  SchemaCacheHandle < ' a >  { 
12-     inner :  RwLockReadGuard < ' a ,  SchemaCache > , 
11+     inner :  RwLockReadGuard < ' a ,  SchemaCacheManagerInner > , 
1312} 
1413
1514impl < ' a >  SchemaCacheHandle < ' a >  { 
16-     pub ( crate )  fn  new ( cache :  & ' a  RwLock < SchemaCache > )  -> Self  { 
15+     pub ( crate )  fn  new ( cache :  & ' a  RwLock < SchemaCacheManagerInner > )  -> Self  { 
1716        Self  { 
1817            inner :  cache. read ( ) . unwrap ( ) , 
1918        } 
2019    } 
2120
22-     pub ( crate )  fn  wrap ( inner :  RwLockReadGuard < ' a ,  SchemaCache > )  -> Self  { 
21+     pub ( crate )  fn  wrap ( inner :  RwLockReadGuard < ' a ,  SchemaCacheManagerInner > )  -> Self  { 
2322        Self  {  inner } 
2423    } 
2524} 
2625
2726impl  AsRef < SchemaCache >  for  SchemaCacheHandle < ' _ >  { 
2827    fn  as_ref ( & self )  -> & SchemaCache  { 
29-         & self . inner 
28+         & self . inner . cache 
3029    } 
3130} 
3231
32+ #[ derive( Default ) ]  
33+ pub ( crate )  struct  SchemaCacheManagerInner  { 
34+     cache :  SchemaCache , 
35+     conn_str :  String , 
36+ } 
37+ 
3338#[ derive( Default ) ]  
3439pub  struct  SchemaCacheManager  { 
35-     cache :  RwLock < SchemaCache > , 
40+     inner :  RwLock < SchemaCacheManagerInner > , 
3641} 
3742
3843impl  SchemaCacheManager  { 
3944    pub  fn  load ( & self ,  pool :  PgPool )  -> Result < SchemaCacheHandle ,  WorkspaceError >  { 
40-         let  cache_lock  = self . cache . read ( ) . unwrap ( ) ; 
45+         let  inner  = self . inner . read ( ) . unwrap ( ) ; 
4146
42-         if  cache_lock . has_already_cached_connection ( & pool)  { 
43-             Ok ( SchemaCacheHandle :: wrap ( cache_lock ) ) 
47+         if  pool_to_conn_str ( & pool)  == inner . conn_str  { 
48+             Ok ( SchemaCacheHandle :: wrap ( inner ) ) 
4449        }  else  { 
50+             let  new_conn_str = pool_to_conn_str ( & pool) ; 
51+ 
4552            let  maybe_refreshed = run_async ( async  move  {  SchemaCache :: load ( & pool) . await  } ) ?; 
4653            let  refreshed = maybe_refreshed?; 
4754
48-             let  mut  cache = self . cache . write ( ) . unwrap ( ) ; 
49-             * cache = refreshed; 
55+             let  mut  inner = self . inner . write ( ) . unwrap ( ) ; 
56+ 
57+             inner. cache  = refreshed; 
58+             inner. conn_str  = new_conn_str; 
5059
51-             Ok ( SchemaCacheHandle :: new ( & self . cache ) ) 
60+             Ok ( SchemaCacheHandle :: new ( & self . inner ) ) 
5261        } 
5362    } 
5463} 
64+ 
65+ fn  pool_to_conn_str ( pool :  & PgPool )  -> String  { 
66+     let  conn = pool. connect_options ( ) ; 
67+ 
68+     match  conn. get_database ( )  { 
69+         None  => format ! ( 
70+             "postgres://{}:<redacted_pw>@{}:{}" , 
71+             conn. get_username( ) , 
72+             conn. get_host( ) , 
73+             conn. get_port( ) 
74+         ) , 
75+         Some ( db)  => format ! ( 
76+             "postgres://{}:<redacted_pw>@{}:{}/{}" , 
77+             conn. get_username( ) , 
78+             conn. get_host( ) , 
79+             conn. get_port( ) , 
80+             db
81+         ) , 
82+     } 
83+ } 
0 commit comments