use libesedb_sys::*;
use std::io;
use std::marker::PhantomData;
use std::ptr::null_mut;
use crate::column::Column;
use crate::error::ese_result;
use crate::record::Record;
pub struct Table<'a> {
ptr: *mut libesedb_table_t,
_marker: PhantomData<&'a ()>,
}
impl Table<'_> {
pub(crate) fn from_name(handle: *mut libesedb_file_t, name: &str) -> io::Result<Self> {
let mut ptr = null_mut();
match ese_result!(
libesedb_file_get_table_by_utf8_name,
handle,
name.as_ptr(),
name.len() as _,
&mut ptr
)? {
1 => Ok(Self {
ptr,
_marker: PhantomData,
}),
_ => Err(io::Error::new(
io::ErrorKind::Other,
format!("Can't find table '{name}'"),
)),
}
}
pub fn name(&self) -> io::Result<String> {
let mut size = 0;
ese_result!(libesedb_table_get_utf8_name_size, self.ptr, &mut size)?;
let mut name = Vec::with_capacity(size as _);
ese_result!(
libesedb_table_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 count_columns(&self) -> io::Result<i32> {
let mut n = 0;
ese_result!(libesedb_table_get_number_of_columns, self.ptr, &mut n, 0)?;
Ok(n)
}
pub fn count_records(&self) -> io::Result<i32> {
let mut n = 0;
ese_result!(libesedb_table_get_number_of_records, self.ptr, &mut n)?;
Ok(n)
}
pub fn column(&self, entry: i32) -> io::Result<Column> {
Column::load(self.ptr, entry)
}
pub fn record(&self, entry: i32) -> io::Result<Record> {
Record::load(self.ptr, entry)
}
pub fn iter_columns(&self) -> io::Result<impl Iterator<Item = io::Result<Column>>> {
Ok((0..self.count_columns()?).map(|i| Column::load(self.ptr, i)))
}
pub fn iter_records(&self) -> io::Result<impl Iterator<Item = io::Result<Record>>> {
Ok((0..self.count_records()?).map(|i| Record::load(self.ptr, i)))
}
#[deprecated]
pub fn close(self) {}
pub(crate) fn load<'a>(db_handle: *mut libesedb_file_t, entry: i32) -> io::Result<Table<'a>> {
let mut ptr = null_mut();
ese_result!(libesedb_file_get_table, db_handle, entry, &mut ptr)?;
Ok(Table::<'a> {
ptr,
_marker: PhantomData,
})
}
}
impl Drop for Table<'_> {
fn drop(&mut self) {
unsafe {
libesedb_table_free(&mut self.ptr, null_mut());
}
}
}