use std::marker::PhantomData;
use std::mem::MaybeUninit;
use crate::sql::engine::LocalEngineRef;
use crate::sql::{mcosql_error_code, result_from_code};
use crate::{exdb_sys, Result};
pub struct Params {
port: u16,
buf_size: usize,
threads: usize,
listen_queue_size: usize,
}
impl Params {
pub fn new(port: u16) -> Self {
Params {
port,
buf_size: 64 * 1024,
threads: 8,
listen_queue_size: 5,
}
}
pub fn port(&mut self, port: u16) -> &mut Self {
self.port = port;
self
}
pub fn buf_size(&mut self, buf_size: usize) -> &mut Self {
self.buf_size = buf_size;
self
}
pub fn threads(&mut self, threads: usize) -> &mut Self {
self.threads = threads;
self
}
pub fn listen_queue_size(&mut self, listen_queue_size: usize) -> &mut Self {
self.listen_queue_size = listen_queue_size;
self
}
}
pub struct Server<'a> {
h: exdb_sys::sqlsrv_t,
engine: PhantomData<LocalEngineRef<'a>>,
}
impl<'a> Server<'a> {
pub fn create(engine: LocalEngineRef<'a>, params: Params) -> Result<Self> {
let mut h = MaybeUninit::uninit();
result_from_code(unsafe {
exdb_sys::sqlsrv_create(
h.as_mut_ptr(),
engine.h as exdb_sys::storage_t,
params.port as i32,
params.buf_size as exdb_sys::size_t,
params.threads as exdb_sys::size_t,
params.listen_queue_size as i32,
None,
)
})?;
Ok(Server {
h: unsafe { h.assume_init() },
engine: PhantomData,
})
}
pub fn start(&mut self) -> Result<()> {
result_from_code(unsafe { exdb_sys::sqlsrv_start(self.h) })
}
pub fn stop(&mut self) -> Result<()> {
result_from_code(unsafe { exdb_sys::sqlsrv_stop(self.h) })
}
}
impl<'a> Drop for Server<'a> {
fn drop(&mut self) {
let rc = unsafe { exdb_sys::sqlsrv_destroy(self.h) };
debug_assert_eq!(mcosql_error_code::SQL_OK, rc);
}
}