Skip to content

Commit 61639bb

Browse files
authored
[ENH]: (Rust client): make get_database_name() and get_tenant_id() public (#5703)
1 parent a69bc05 commit 61639bb

File tree

1 file changed

+75
-71
lines changed

1 file changed

+75
-71
lines changed

rust/chroma/src/client/chroma_http_client.rs

Lines changed: 75 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)