swiftide_integrations/lancedb/
connection_pool.rs1use anyhow::Context as _;
2use anyhow::Result;
3use deadpool::managed::Manager;
4use derive_builder::Builder;
5use lancedb::connection::ConnectBuilder;
6
7#[derive(Builder, Debug, Clone)]
8#[builder(setter(into), build_fn(error = "anyhow::Error"))]
9pub struct LanceDBPoolManager {
10 uri: String,
11 #[builder(default)]
12 api_key: Option<String>,
13 #[builder(default)]
14 region: Option<String>,
15 #[builder(default)]
16 storage_options: Vec<(String, String)>,
17}
18
19pub type LanceDBConnectionPool = deadpool::managed::Pool<LanceDBPoolManager>;
20
21impl LanceDBPoolManager {
22 pub fn builder() -> LanceDBPoolManagerBuilder {
23 LanceDBPoolManagerBuilder::default()
24 }
25}
26
27impl Manager for LanceDBPoolManager {
28 type Type = lancedb::Connection;
29 type Error = anyhow::Error;
30
31 async fn create(&self) -> Result<Self::Type, Self::Error> {
32 let mut builder = ConnectBuilder::new(&self.uri);
33
34 if let Some(api_key) = &self.api_key {
35 builder = builder.api_key(api_key);
36 }
37
38 if let Some(region) = &self.region {
39 builder = builder.region(region);
40 }
41
42 for (key, value) in &self.storage_options {
43 builder = builder.storage_option(key, value);
44 }
45
46 builder
47 .execute()
48 .await
49 .context("Failed to create LanceDB connection")
50 }
51
52 async fn recycle(
53 &self,
54 _obj: &mut Self::Type,
55 _metrics: &deadpool::managed::Metrics,
56 ) -> deadpool::managed::RecycleResult<Self::Error> {
57 Ok(())
59 }
60}