use crate::client::Client;
use crate::constants;
use crate::error::Error;
use crate::response::Response;
use crate::rowid::Rowid;
pub struct ErrorInfo {
pub(super) num: usize,
cursor_id: u16,
flags: u8,
pub(super) rowcount: u64,
message: String,
}
impl ErrorInfo {
pub fn deserialize(
resp: &mut Response,
client: &Client,
) -> Result<ErrorInfo, Error> {
resp.read_ub4()?; resp.read_ub2()?; resp.read_ub4()?; resp.read_ub2()?; resp.read_ub2()?; resp.read_ub2()?; let cursor_id = resp.read_ub2()?;
resp.read_ub2()?; resp.read_u8()?; resp.read_u8()?; resp.read_u8()?; resp.read_u8()?; resp.read_u8()?; let flags = resp.read_u8()?;
let _rowid = Rowid::deserialize(resp)?;
resp.read_ub4()?; resp.read_u8()?; resp.read_u8()?; resp.read_ub2()?; resp.read_ub4()?; let num_bytes = resp.read_ub4()?; if num_bytes > 0 {
resp.read_bytes_with_length()?;
}
let num_errors = resp.read_ub2()?;
if num_errors > 0 {
todo!();
}
let num_offsets = resp.read_ub4()?;
if num_offsets > 0 {
todo!();
}
let num_messages = resp.read_ub2()?;
if num_messages > 0 {
todo!();
}
let error_num = resp.read_ub4()?;
let rowcount = resp.read_ub8()?;
if client.supports_ttc_field_version(constants::TTC_FIELD_VERSION_20_1)
{
resp.read_ub4()?; resp.read_ub4()?; }
let message: String = if error_num == 0 {
String::new()
} else {
resp.read_str_with_length()?
};
Ok(ErrorInfo {
num: error_num as usize,
cursor_id,
flags,
rowcount,
message: message.trim_end().to_string(),
})
}
pub(crate) fn cursor_id(&self) -> u16 {
self.cursor_id
}
pub(crate) fn error_message(&self) -> &str {
&self.message
}
pub(crate) fn is_compilation_warning(&self) -> bool {
self.flags & 0x20 != 0
}
pub(crate) fn rowcount(&self) -> u64 {
self.rowcount
}
}