use error::{ErrorKind, Result};
use odpi::externs;
use odpi::opaque::ODPISubscr;
use statement::Statement;
use std::convert::TryFrom;
use std::ptr;
use util::ODPIStr;
#[derive(Clone)]
pub struct Subscription {
inner: *mut ODPISubscr,
}
impl Subscription {
#[doc(hidden)]
pub fn inner(&self) -> *mut ODPISubscr {
self.inner
}
pub fn close(&self) -> Result<()> {
try_dpi!(
externs::dpiSubscr_close(self.inner),
Ok(()),
ErrorKind::Subscription("dpiSubscr_close".to_string())
)
}
pub fn prepare_statement(&self, sql: &str) -> Result<Statement> {
let mut stmt = ptr::null_mut();
let sql_s: ODPIStr = TryFrom::try_from(sql)?;
try_dpi!(
externs::dpiSubscr_prepareStmt(self.inner, sql_s.ptr(), sql_s.len(), &mut stmt),
Ok(stmt.into()),
ErrorKind::Subscription("dpiSubscr_prepareStmt".to_string())
)
}
}
impl From<*mut ODPISubscr> for Subscription {
fn from(inner: *mut ODPISubscr) -> Self {
Self { inner }
}
}
impl Drop for Subscription {
fn drop(&mut self) {
if !self.inner.is_null() {
unsafe {
externs::dpiSubscr_release(self.inner);
}
}
}
}