use error::{ErrorKind, Result};
use object::Object;
use odpi::externs;
use odpi::opaque::{ODPIObject, ODPIObjectAttr, ODPIObjectType};
use odpi::structs::ODPIObjectTypeInfo;
use std::ptr;
#[derive(Debug)]
pub struct ObjectType {
inner: *mut ODPIObjectType,
}
impl ObjectType {
#[doc(hidden)]
pub fn inner(&self) -> *mut ODPIObjectType {
self.inner
}
pub fn create(&self) -> Result<Object> {
let mut object: *mut ODPIObject = ptr::null_mut();
try_dpi!(
externs::dpiObjectType_createObject(self.inner, &mut object),
Ok(object.into()),
ErrorKind::ObjectType("dpiObjectType_createObject".to_string())
)
}
pub fn get_attributes(&self, length: u16) -> Result<Vec<*mut ODPIObjectAttr>> {
let mut buffer: Vec<*mut ODPIObjectAttr> = Vec::with_capacity(length as usize);
let buf_ptr = buffer.as_mut_ptr();
try_dpi!(
externs::dpiObjectType_getAttributes(self.inner, length, buf_ptr),
{
unsafe { buffer.set_len(length as usize) };
Ok(buffer)
},
ErrorKind::ObjectType("dpiObjectType_getAttributes".to_string())
)
}
pub fn get_info(&self) -> Result<ODPIObjectTypeInfo> {
let mut object_type_info: ODPIObjectTypeInfo = Default::default();
try_dpi!(
externs::dpiObjectType_getInfo(self.inner, &mut object_type_info),
Ok(object_type_info),
ErrorKind::ObjectType("dpiObjectType_getInfo".to_string())
)
}
pub fn release(&self) -> Result<()> {
try_dpi!(
externs::dpiObjectType_release(self.inner),
Ok(()),
ErrorKind::ObjectType("dpiObjectType_release".to_string())
)
}
}
impl From<*mut ODPIObjectType> for ObjectType {
fn from(oot: *mut ODPIObjectType) -> Self {
Self { inner: oot }
}
}