#[cfg(feature="blocking")]
#[cfg_attr(docsrs, doc(cfg(feature="blocking")))]
mod blocking;
#[cfg(feature="nonblocking")]
#[cfg_attr(docsrs, doc(cfg(feature="nonblocking")))]
mod nonblocking;
use std::{sync::Arc, marker::PhantomData};
use crate::{Error, Result, oci::*, Environment};
pub(crate) struct SPool {
name: Vec<u8>,
pool: Handle<OCISPool>,
info: Handle<OCIAuthInfo>,
err: Handle<OCIError>,
env: Arc<Handle<OCIEnv>>,
}
impl Drop for SPool {
fn drop(&mut self) {
let _ = &self.info;
oci_session_pool_destroy(&self.pool, &self.err);
}
}
impl SPool {
#[cfg(feature="nonblocking")]
pub(crate) fn get_env(&self) -> Arc<Handle<OCIEnv>> {
self.env.clone()
}
pub(crate) fn get_name(&self) -> &[u8] {
&self.name
}
}
pub struct SessionPool<'a> {
inner: Arc<SPool>,
phantom_env: PhantomData<&'a Environment>
}
#[derive(Debug, PartialEq, Eq)]
pub enum SessionPoolGetMode {
Wait = 0,
NoWait,
ForcedGet,
TimedWait,
}
impl SessionPool<'_> {
pub(crate) fn get_spool(&self) -> Arc<SPool> {
self.inner.clone()
}
#[cfg(feature="blocking")]
pub(crate) fn get_env(&self) -> Arc<Handle<OCIEnv>> {
self.inner.env.clone()
}
pub fn busy_count(&self) -> Result<usize> {
let count : u32 = self.inner.pool.get_attr(OCI_ATTR_SPOOL_BUSY_COUNT, &self.inner.err)?;
Ok(count as usize)
}
pub fn open_count(&self) -> Result<usize> {
let count : u32 = self.inner.pool.get_attr(OCI_ATTR_SPOOL_OPEN_COUNT, &self.inner.err)?;
Ok(count as usize)
}
pub fn get_mode(&self) -> Result<SessionPoolGetMode> {
let mode : u8 = self.inner.pool.get_attr(OCI_ATTR_SPOOL_GETMODE, &self.inner.err)?;
match mode {
OCI_SPOOL_ATTRVAL_WAIT => Ok(SessionPoolGetMode::Wait),
OCI_SPOOL_ATTRVAL_NOWAIT => Ok(SessionPoolGetMode::NoWait),
OCI_SPOOL_ATTRVAL_FORCEGET => Ok(SessionPoolGetMode::ForcedGet),
OCI_SPOOL_ATTRVAL_TIMEDWAIT => Ok(SessionPoolGetMode::TimedWait),
_ => Err(Error::new("unknown get mmode returned"))
}
}
pub fn set_get_mode(&self, mode: SessionPoolGetMode) -> Result<()> {
self.inner.pool.set_attr(OCI_ATTR_SPOOL_GETMODE, mode as u8, &self.inner.err)
}
pub fn wait_timeout(&self) -> Result<u32> {
self.inner.pool.get_attr(OCI_ATTR_SPOOL_WAIT_TIMEOUT, &self.inner.err)
}
pub fn set_wait_timeout(&self, milliseconds: u32) -> Result<()> {
self.inner.pool.set_attr(OCI_ATTR_SPOOL_WAIT_TIMEOUT, milliseconds, &self.inner.err)
}
pub fn idle_timeout(&self) -> Result<u32> {
self.inner.pool.get_attr(OCI_ATTR_SPOOL_TIMEOUT, &self.inner.err)
}
pub fn set_idle_timeout(&self, seconds: u32) -> Result<()> {
self.inner.pool.set_attr(OCI_ATTR_SPOOL_TIMEOUT, seconds, &self.inner.err)
}
pub fn session_max_lifetime(&self) -> Result<u32> {
self.inner.pool.get_attr(OCI_ATTR_SPOOL_MAX_LIFETIME_SESSION, &self.inner.err)
}
pub fn set_session_max_lifetime(&self, seconds: u32) -> Result<()> {
self.inner.pool.set_attr(OCI_ATTR_SPOOL_MAX_LIFETIME_SESSION, seconds, &self.inner.err)
}
pub fn session_max_use_count(&self) -> Result<u32> {
self.inner.pool.get_attr(OCI_ATTR_SPOOL_MAX_USE_SESSION, &self.inner.err)
}
pub fn set_session_max_use_count(&self, count: u32) -> Result<()> {
self.inner.pool.set_attr(OCI_ATTR_SPOOL_MAX_USE_SESSION, count, &self.inner.err)
}
pub fn statement_cache_size(&self) -> Result<u32> {
self.inner.pool.get_attr(OCI_ATTR_SPOOL_STMTCACHESIZE, &self.inner.err)
}
pub fn set_statement_cache_size(&self, size: u32) -> Result<()> {
self.inner.pool.set_attr(OCI_ATTR_SPOOL_STMTCACHESIZE, size, &self.inner.err)
}
}