use pgwire::api::auth::DefaultServerParameterProvider;
#[derive(Debug)]
pub(super) struct NodeDbParameterProvider {
inner: DefaultServerParameterProvider,
}
impl NodeDbParameterProvider {
fn new() -> Self {
let mut inner = DefaultServerParameterProvider::default();
inner.server_version =
nodedb_types::pg_compat::server_version_string(crate::version::VERSION);
Self { inner }
}
}
impl pgwire::api::auth::ServerParameterProvider for NodeDbParameterProvider {
fn server_parameters<C>(&self, client: &C) -> Option<std::collections::HashMap<String, String>>
where
C: pgwire::api::ClientInfo,
{
let mut params = self.inner.server_parameters(client)?;
params.insert(
"server_version_num".to_owned(),
nodedb_types::pg_compat::PG_COMPAT_VERSION_NUM.to_owned(),
);
Some(params)
}
}
pub(super) fn nodedb_parameter_provider() -> NodeDbParameterProvider {
NodeDbParameterProvider::new()
}
#[cfg(test)]
mod tests {
use super::*;
use pgwire::api::DefaultClient;
use pgwire::api::auth::ServerParameterProvider;
#[test]
fn parameter_provider_advertises_server_version_num_and_nodedb_version() {
let addr = "127.0.0.1:5432"
.parse::<std::net::SocketAddr>()
.expect("valid socket addr");
let client: DefaultClient<()> = DefaultClient::new(addr, false);
let provider = NodeDbParameterProvider::new();
let params = provider
.server_parameters(&client)
.expect("provider must yield parameters");
assert_eq!(
params.get("server_version_num").map(String::as_str),
Some(nodedb_types::pg_compat::PG_COMPAT_VERSION_NUM),
"startup params must advertise server_version_num, got {params:?}"
);
assert_eq!(
params.get("server_version").cloned(),
Some(nodedb_types::pg_compat::server_version_string(
crate::version::VERSION,
)),
"startup params must advertise a libpq-parseable server_version, got {params:?}"
);
}
}