#![doc(html_root_url = "https://docs.rs/cql_f64/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 F64;
impl CqlType for F64 {
type ValueType = f64;
const VALUE_SIZE: usize = 8;
}
impl CqlWritable for F64 {
fn write_to_db(db_location: &str, value_location: u64, value: f64) -> 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_f64::<LittleEndian>(value)?;
file.write_all(&wtr)
}
}
impl CqlReadable for F64 {
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_f64::<LittleEndian>()
}
}
impl CqlStreamReadable for F64 {
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, f64) {
for index in 0..n_values {
let mut value_buffer = [0; F64::VALUE_SIZE];
stream.read_exact(&mut value_buffer)?;
let mut rdr = Cursor::new(value_buffer);
value_handler(index, rdr.read_f64::<LittleEndian>()?);
}
Ok(())
}