#![doc(html_root_url = "https://docs.rs/cql_i16/0.2.0")]
use std::fs::{ File, OpenOptions };
use std::io;
use std::io::{ Read, Write, Cursor, SeekFrom, Seek };
use byteorder::{ ReadBytesExt, WriteBytesExt, LittleEndian };
use cql_model::{ CqlType, CqlWritable, CqlReadable, CqlStreamReadable };
pub struct I16;
impl CqlType for I16 {
type ValueType = i16;
const VALUE_SIZE: usize = 2;
}
impl CqlWritable for I16 {
fn write_to_db(db_location: &str, value_location: u64, value: Self::ValueType) -> io::Result<()> {
let mut file = OpenOptions::new().write(true).open(db_location)?;
file.seek(SeekFrom::Start(value_location * Self::VALUE_SIZE as u64)).unwrap();
let mut wtr = vec![];
wtr.write_i16::<LittleEndian>(value)?;
file.write_all(&wtr)
}
}
impl CqlReadable for I16 {
fn read_from_db(db_location: &str, value_location: u64) -> io::Result<Self::ValueType> {
let mut file = File::open(&db_location)?;
file.seek(SeekFrom::Start(value_location * Self::VALUE_SIZE as u64)).unwrap();
let mut buffer = [0; Self::VALUE_SIZE];
match file.read_exact(&mut buffer) {
Err(e) => {
if e.kind() != io::ErrorKind::UnexpectedEof {
return Err(e)
}
}
_ => { }
}
let mut rdr = Cursor::new(buffer);
rdr.read_i16::<LittleEndian>()
}
}
impl CqlStreamReadable for I16 {
fn read_to_stream(db_location: &str, stream: &mut dyn Write, value_location: u64, n_values: u64) -> io::Result<()> {
let mut file = File::open(&db_location)?;
file.seek(SeekFrom::Start(value_location * Self::VALUE_SIZE as u64)).unwrap();
for _i in 0..n_values {
let mut buffer = [0; Self::VALUE_SIZE];
match file.read_exact(&mut buffer) {
Err(e) => {
if e.kind() != io::ErrorKind::UnexpectedEof {
return Err(e)
}
}
_ => { }
}
stream.write_all(&mut buffer)?;
}
stream.flush()
}
}
pub fn unpack_stream<F>(stream: &mut Cursor<Vec<u8>>, n_values: usize, mut value_handler: F) -> io::Result<()> where F: FnMut(usize, i16) {
for index in 0..n_values {
let mut value_buffer = [0; I16::VALUE_SIZE];
stream.read_exact(&mut value_buffer)?;
let mut rdr = Cursor::new(value_buffer);
value_handler(index, rdr.read_i16::<LittleEndian>()?);
}
Ok(())
}