@@ -253,6 +253,81 @@ impl ChromaHttpClient {
253253 * lock = Some ( database_name. as_ref ( ) . to_string ( ) ) ;
254254 }
255255
256+ /// Resolves the database name for collection operations.
257+ ///
258+ /// Returns the cached database name if available, otherwise fetches and caches the user's
259+ /// identity information. Uses a lock to prevent concurrent resolution attempts.
260+ pub async fn get_database_name ( & self ) -> Result < String , ChromaHttpClientError > {
261+ {
262+ let database_name_lock = self . database_name . lock ( ) ;
263+ if let Some ( database_name) = & * database_name_lock {
264+ return Ok ( database_name. clone ( ) ) ;
265+ }
266+ }
267+
268+ let _guard = self . resolve_tenant_or_database_lock . lock ( ) . await ;
269+
270+ {
271+ let database_name_lock = self . database_name . lock ( ) ;
272+ if let Some ( database_name) = & * database_name_lock {
273+ return Ok ( database_name. clone ( ) ) ;
274+ }
275+ }
276+
277+ let identity = self . get_auth_identity ( ) . await ?;
278+
279+ if identity. databases . len ( ) > 1 {
280+ return Err ( ChromaHttpClientError :: CouldNotResolveDatabaseId (
281+ "Client has access to multiple databases; please provide a database_name"
282+ . to_string ( ) ,
283+ ) ) ;
284+ }
285+
286+ let database_name = identity. databases . into_iter ( ) . next ( ) . ok_or_else ( || {
287+ ChromaHttpClientError :: CouldNotResolveDatabaseId (
288+ "Client has access to no databases" . to_string ( ) ,
289+ )
290+ } ) ?;
291+
292+ {
293+ let mut database_name_lock = self . database_name . lock ( ) ;
294+ * database_name_lock = Some ( database_name. clone ( ) ) ;
295+ }
296+
297+ Ok ( database_name. clone ( ) )
298+ }
299+
300+ /// Resolves the tenant ID for the authenticated user.
301+ ///
302+ /// Returns the cached tenant ID if available, otherwise fetches and caches the user's
303+ /// identity information. Uses a lock to prevent concurrent resolution attempts.
304+ pub async fn get_tenant_id ( & self ) -> Result < String , ChromaHttpClientError > {
305+ {
306+ let tenant_id_lock = self . tenant_id . lock ( ) ;
307+ if let Some ( tenant_id) = & * tenant_id_lock {
308+ return Ok ( tenant_id. clone ( ) ) ;
309+ }
310+ }
311+
312+ let _guard = self . resolve_tenant_or_database_lock . lock ( ) . await ;
313+ {
314+ let tenant_id_lock = self . tenant_id . lock ( ) ;
315+ if let Some ( tenant_id) = & * tenant_id_lock {
316+ return Ok ( tenant_id. clone ( ) ) ;
317+ }
318+ }
319+
320+ let identity = self . get_auth_identity ( ) . await ?;
321+ let tenant_id = identity. tenant ;
322+
323+ {
324+ let mut tenant_id_lock = self . tenant_id . lock ( ) ;
325+ * tenant_id_lock = Some ( tenant_id. clone ( ) ) ;
326+ }
327+
328+ Ok ( tenant_id)
329+ }
330+
256331 /// Creates a new database within the authenticated tenant.
257332 ///
258333 /// The database becomes immediately available for collection operations after creation.
@@ -651,77 +726,6 @@ impl ChromaHttpClient {
651726 } )
652727 }
653728
654- async fn get_database_name ( & self ) -> Result < String , ChromaHttpClientError > {
655- {
656- let database_name_lock = self . database_name . lock ( ) ;
657- if let Some ( database_name) = & * database_name_lock {
658- return Ok ( database_name. clone ( ) ) ;
659- }
660- }
661-
662- let _guard = self . resolve_tenant_or_database_lock . lock ( ) . await ;
663-
664- {
665- let database_name_lock = self . database_name . lock ( ) ;
666- if let Some ( database_name) = & * database_name_lock {
667- return Ok ( database_name. clone ( ) ) ;
668- }
669- }
670-
671- let identity = self . get_auth_identity ( ) . await ?;
672-
673- if identity. databases . len ( ) > 1 {
674- return Err ( ChromaHttpClientError :: CouldNotResolveDatabaseId (
675- "Client has access to multiple databases; please provide a database_name"
676- . to_string ( ) ,
677- ) ) ;
678- }
679-
680- let database_name = identity. databases . into_iter ( ) . next ( ) . ok_or_else ( || {
681- ChromaHttpClientError :: CouldNotResolveDatabaseId (
682- "Client has access to no databases" . to_string ( ) ,
683- )
684- } ) ?;
685-
686- {
687- let mut database_name_lock = self . database_name . lock ( ) ;
688- * database_name_lock = Some ( database_name. clone ( ) ) ;
689- }
690-
691- Ok ( database_name. clone ( ) )
692- }
693-
694- /// Resolves the tenant ID for the authenticated user.
695- ///
696- /// Returns the cached tenant ID if available, otherwise fetches and caches the user's
697- /// identity information. Uses a lock to prevent concurrent resolution attempts.
698- async fn get_tenant_id ( & self ) -> Result < String , ChromaHttpClientError > {
699- {
700- let tenant_id_lock = self . tenant_id . lock ( ) ;
701- if let Some ( tenant_id) = & * tenant_id_lock {
702- return Ok ( tenant_id. clone ( ) ) ;
703- }
704- }
705-
706- let _guard = self . resolve_tenant_or_database_lock . lock ( ) . await ;
707- {
708- let tenant_id_lock = self . tenant_id . lock ( ) ;
709- if let Some ( tenant_id) = & * tenant_id_lock {
710- return Ok ( tenant_id. clone ( ) ) ;
711- }
712- }
713-
714- let identity = self . get_auth_identity ( ) . await ?;
715- let tenant_id = identity. tenant ;
716-
717- {
718- let mut tenant_id_lock = self . tenant_id . lock ( ) ;
719- * tenant_id_lock = Some ( tenant_id. clone ( ) ) ;
720- }
721-
722- Ok ( tenant_id)
723- }
724-
725729 /// Executes an HTTP request with automatic retry logic and OpenTelemetry metrics.
726730 ///
727731 /// This is the core transport method used by all higher-level operations. It handles:
0 commit comments