use libesedb_sys::*;
use std::io;
use std::marker::PhantomData;
use std::ptr::null_mut;
use crate::error::ese_result;
use crate::{LongValue, MultiValue};
use crate::value::Value;
pub struct Record<'a> {
ptr: *mut libesedb_record_t,
_marker: PhantomData<&'a ()>,
}
impl Record<'_> {
pub fn value(&self, entry: i32) -> io::Result<Value> {
Value::load(self.ptr, entry)
}
pub fn is_long(&self, entry: i32) -> io::Result<bool> {
Ok(1 == ese_result!(libesedb_record_is_long_value, self.ptr, entry)?)
}
pub fn is_multi(&self, entry: i32) -> io::Result<bool> {
Ok(1 == ese_result!(libesedb_record_is_multi_value, self.ptr, entry)?)
}
pub fn long<'a>(&self, entry: i32) -> io::Result<LongValue<'a>> {
LongValue::load(self.ptr, entry)
}
pub fn multi<'a>(&self, entry: i32) -> io::Result<MultiValue<'a>> {
MultiValue::load(self.ptr, entry)
}
pub fn count_values(&self) -> io::Result<i32> {
let mut n = 0;
ese_result!(libesedb_record_get_number_of_values, self.ptr, &mut n)?;
Ok(n)
}
pub fn iter_values(&self) -> io::Result<impl Iterator<Item = io::Result<Value>> + '_> {
Ok((0..self.count_values()?).map(|i| Value::load(self.ptr, i)))
}
#[deprecated]
pub fn close(self) {}
pub(crate) fn load<'a>(
table_handle: *mut libesedb_table_t,
entry: i32,
) -> io::Result<Record<'a>> {
let mut ptr = null_mut();
ese_result!(libesedb_table_get_record, table_handle, entry, &mut ptr)?;
Ok(Record::<'a> {
ptr,
_marker: PhantomData,
})
}
}
impl Drop for Record<'_> {
fn drop(&mut self) {
unsafe {
libesedb_record_free(&mut self.ptr, null_mut());
}
}
}