basic get / set / delete / has

This commit is contained in:
2025-06-12 15:52:01 +02:00
commit 7a6b1b6954
11 changed files with 916 additions and 0 deletions

52
src/server.rs Normal file
View File

@@ -0,0 +1,52 @@
use std::sync::Arc;
use tokio::net::ToSocketAddrs;
use tokio::{net::TcpListener, sync::Semaphore};
use crate::Result;
use crate::connection::Connection;
use crate::database::Database;
use crate::handler::Handler;
#[derive(Debug)]
pub struct Server {
db: Database,
listener: TcpListener,
connection_limit: Arc<Semaphore>,
}
impl Server {
const MAX_CONNECTIONS: usize = 256;
pub async fn new<Addr: ToSocketAddrs>(addr: ToSocketAddrs) -> Result<Self> {
let listener = TcpListener::bind(addr).await?;
Ok(Self {
db: Database::new(),
connection_limit: Arc::new(Semaphore::const_new(Self::MAX_CONNECTIONS)),
listener,
})
}
pub async fn run(&mut self) -> Result<()> {
loop {
let permit = Arc::clone(&self.connection_limit)
.acquire_owned()
.await
.unwrap();
let socket = self.listener.accept().await?.0;
let connection = Connection::new(socket);
let mut handler = Handler::new(self.db.clone(), connection);
tokio::spawn(async move {
if let Err(e) = handler.run().await {
println!("Handler::run error: {e:?}");
}
drop(permit);
});
}
}
}