use std::sync::Arc;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::net::TcpListener;
use leaves::dao::mysql::MySqlLeafDao;
use leaves::SegmentIDGen;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let dao = Arc::new(
MySqlLeafDao::new("mysql://root:12138@localhost:3306/course")
.await
.unwrap(),
);
let mut service = SegmentIDGen::new(dao);
service.init().await.unwrap();
let service = Arc::new(service);
let mut listener = TcpListener::bind("127.0.0.1:8080").await?;
loop {
let (mut socket, _) = listener.accept().await?;
let service = service.clone();
tokio::spawn(async move {
let mut buf = [0; 1024];
loop {
let n = match socket.read(&mut buf).await {
Ok(n) if n == 0 => return,
Ok(n) => n,
Err(e) => {
println!("failed to read from socket; err = {:?}", e);
return;
}
};
let id = service.get(1).await.unwrap();
if let Err(e) = socket.write_all(&buf[0..n]).await {
println!("failed to write to socket; err = {:?}", e);
return;
}
}
});
}
}