pub mod parser;
pub mod server;
use mnemo_core::query::MnemoEngine;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct PgWireConfig {
pub bind_addr: String,
pub max_connections: usize,
pub default_agent_id: String,
pub password: Option<String>,
}
impl Default for PgWireConfig {
fn default() -> Self {
Self {
bind_addr: "127.0.0.1:5433".to_string(),
max_connections: 100,
default_agent_id: "default".to_string(),
password: None,
}
}
}
pub async fn start_server(
engine: Arc<MnemoEngine>,
config: PgWireConfig,
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let listener = tokio::net::TcpListener::bind(&config.bind_addr).await?;
tracing::info!("pgwire server listening on {}", config.bind_addr);
let semaphore = Arc::new(tokio::sync::Semaphore::new(config.max_connections));
loop {
let (stream, addr) = listener.accept().await?;
tracing::debug!("pgwire connection from {addr}");
let engine = engine.clone();
let config = config.clone();
let permit = semaphore.clone().acquire_owned().await?;
tokio::spawn(async move {
if let Err(e) = server::handle_connection(stream, engine, &config).await {
tracing::warn!("pgwire connection error from {addr}: {e}");
}
drop(permit);
});
}
}