use libesedb_sys::*;
use std::io;
use std::marker::PhantomData;
use std::ptr::null_mut;
use crate::error::ese_result;
use crate::Value;
pub struct Column<'a> {
ptr: *mut libesedb_column_t,
_marker: PhantomData<&'a ()>,
}
impl Column<'_> {
pub fn name(&self) -> io::Result<String> {
let mut size = 0;
ese_result!(libesedb_column_get_utf8_name_size, self.ptr, &mut size)?;
let mut name = Vec::with_capacity(size as _);
ese_result!(
libesedb_column_get_utf8_name,
self.ptr,
name.as_mut_ptr(),
size
)?;
unsafe { name.set_len(size as _) }
name.pop();
String::from_utf8(name).map_err(|e| io::Error::new(io::ErrorKind::Other, e))
}
pub fn id(&self) -> io::Result<u32> {
let mut id = 0;
ese_result!(libesedb_column_get_identifier, self.ptr, &mut id)?;
Ok(id)
}
pub fn variant(&self) -> io::Result<Value> {
let mut typ = 0;
ese_result!(libesedb_column_get_type, self.ptr, &mut typ)?;
Ok(Value::from_discriminant(typ as _))
}
#[deprecated]
pub fn close(self) {}
pub(crate) fn load<'a>(
table_handle: *mut libesedb_table_t,
entry: i32,
) -> io::Result<Column<'a>> {
let mut ptr = null_mut();
ese_result!(libesedb_table_get_column, table_handle, entry, &mut ptr, 0)?;
Ok(Column::<'a> {
ptr,
_marker: PhantomData,
})
}
}
impl Drop for Column<'_> {
fn drop(&mut self) {
unsafe {
libesedb_column_free(&mut self.ptr, null_mut());
}
}
}