diff --git a/query-engine/connectors/sql-query-connector/src/database/js.rs b/query-engine/connectors/sql-query-connector/src/database/js.rs index 1dced9453fa3..5b22653647f8 100644 --- a/query-engine/connectors/sql-query-connector/src/database/js.rs +++ b/query-engine/connectors/sql-query-connector/src/database/js.rs @@ -11,40 +11,25 @@ use quaint::{ connector::{IsolationLevel, Transaction}, prelude::{Queryable as QuaintQueryable, *}, }; -use std::{ - collections::{hash_map::Entry, HashMap}, - sync::{Arc, Mutex}, -}; +use std::sync::{Arc, Mutex}; -/// Registry is the type for the global registry of driver adapters. -type Registry = HashMap; +static ACTIVE_DRIVER_ADAPTER: Lazy>> = Lazy::new(|| Mutex::new(None)); -/// REGISTRY is the global registry of Driver Adapters. -static REGISTRY: Lazy> = Lazy::new(|| Mutex::new(HashMap::new())); +fn active_driver_adapter(provider: &str) -> connector::Result { + let lock = ACTIVE_DRIVER_ADAPTER.lock().unwrap(); -fn registered_driver_adapter(provider: &str) -> connector::Result { - let lock = REGISTRY.lock().unwrap(); - lock.get(provider) + lock.as_ref() + .map(|conn_ref| conn_ref.to_owned()) .ok_or(ConnectorError::from_kind(ErrorKind::UnsupportedConnector(format!( "A driver adapter for {} was not registered", provider )))) - .map(|conn_ref| conn_ref.to_owned()) } -pub fn register_driver_adapter(provider: &str, connector: Arc) -> Result<(), String> { - let mut lock = REGISTRY.lock().unwrap(); - let entry = lock.entry(provider.to_string()); - match entry { - Entry::Occupied(_) => Err(format!( - "A driver adapter for {} was already registered, and cannot be overridden.", - provider - )), - Entry::Vacant(v) => { - v.insert(DriverAdapter { connector }); - Ok(()) - } - } +pub fn activate_driver_adapter(connector: Arc) { + let mut lock = ACTIVE_DRIVER_ADAPTER.lock().unwrap(); + + *lock = Some(DriverAdapter { connector }); } pub struct Js { @@ -69,7 +54,7 @@ impl FromSource for Js { url: &str, features: psl::PreviewFeatures, ) -> connector_interface::Result { - let connector = registered_driver_adapter(source.active_provider)?; + let connector = active_driver_adapter(source.active_provider)?; let connection_info = get_connection_info(url)?; Ok(Js { diff --git a/query-engine/connectors/sql-query-connector/src/lib.rs b/query-engine/connectors/sql-query-connector/src/lib.rs index 06aa1e376c4a..d98f87d9a92e 100644 --- a/query-engine/connectors/sql-query-connector/src/lib.rs +++ b/query-engine/connectors/sql-query-connector/src/lib.rs @@ -23,7 +23,7 @@ use self::{column_metadata::*, context::Context, filter_conversion::*, query_ext use quaint::prelude::Queryable; #[cfg(feature = "driver-adapters")] -pub use database::{register_driver_adapter, Js}; +pub use database::{activate_driver_adapter, Js}; pub use database::{FromSource, Mssql, Mysql, PostgreSql, Sqlite}; pub use error::SqlError; diff --git a/query-engine/query-engine-node-api/src/engine.rs b/query-engine/query-engine-node-api/src/engine.rs index 37baeaee2c60..8b53f9dfc8c5 100644 --- a/query-engine/query-engine-node-api/src/engine.rs +++ b/query-engine/query-engine-node-api/src/engine.rs @@ -183,15 +183,12 @@ impl QueryEngine { #[cfg(feature = "driver-adapters")] if let Some(driver) = maybe_driver { let js_queryable = driver_adapters::from_napi(driver); - let provider_name = schema.connector.provider_name(); - match sql_connector::register_driver_adapter(provider_name, Arc::new(js_queryable)) { - Ok(_) => { - connector_mode = ConnectorMode::Js; - tracing::info!("Registered driver adapter for {provider_name}.") - } - Err(err) => tracing::error!("Failed to register driver adapter for {provider_name}. {err}"), - } + sql_connector::activate_driver_adapter(Arc::new(js_queryable)); + connector_mode = ConnectorMode::Js; + + let provider_name = schema.connector.provider_name(); + tracing::info!("Registered driver adapter for {provider_name}."); } }