Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[storage] Merge PartialSerialize and Serialize #363 #364

Merged
merged 2 commits into from
Nov 18, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/agdb/collections/dictionary.rs
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ mod dictionary_data_memory;

use self::dictionary_data_memory::DictionaryDataMemory;
use self::dictionary_impl::DictionaryImpl;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::marker::PhantomData;

2 changes: 1 addition & 1 deletion src/agdb/collections/dictionary/dictionary_data.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use super::dictionary_index::DictionaryIndex;
use super::dictionary_value::DictionaryValue;
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;

pub trait DictionaryData<T>
2 changes: 1 addition & 1 deletion src/agdb/collections/dictionary/dictionary_data_memory.rs
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@ use super::dictionary_index::DictionaryIndex;
use super::dictionary_value::DictionaryValue;
use crate::collections::multi_map::MultiMap;
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;

pub struct DictionaryDataMemory<T>
2 changes: 1 addition & 1 deletion src/agdb/collections/dictionary/dictionary_data_storage.rs
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@ use crate::db::db_error::DbError;
use crate::storage::storage_file::StorageFile;
use crate::storage::storage_index::StorageIndex;
use crate::storage::OldStorage;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::cell::RefCell;
use std::rc::Rc;
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::db::db_error::DbError;
use crate::storage::storage_index::StorageIndex;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use std::mem::size_of;

pub(crate) struct DictionaryDataStorageIndexes {
2 changes: 1 addition & 1 deletion src/agdb/collections/dictionary/dictionary_impl.rs
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@ use super::dictionary_data::DictionaryData;
use super::dictionary_index::DictionaryIndex;
use super::dictionary_value::DictionaryValue;
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::marker::PhantomData;

2 changes: 1 addition & 1 deletion src/agdb/collections/dictionary/dictionary_index.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;

#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct DictionaryIndex {
2 changes: 1 addition & 1 deletion src/agdb/collections/dictionary/dictionary_value.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;

#[derive(Clone, Default)]
2 changes: 1 addition & 1 deletion src/agdb/collections/map/map_impl.rs
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@ use crate::collections::map_common::map_iterator::MapIterator;
use crate::collections::map_common::map_value_state::MapValueState;
use crate::collections::map_common::MapCommon;
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::collections::HashMap;
use std::hash::Hash;
2 changes: 1 addition & 1 deletion src/agdb/collections/map_common.rs
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ use self::map_iterator::MapIterator;
use self::map_value::MapValue;
use self::map_value_state::MapValueState;
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::cmp::max;
use std::hash::Hash;
2 changes: 1 addition & 1 deletion src/agdb/collections/map_common/map_data.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use super::map_value::MapValue;
use super::map_value_state::MapValueState;
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::hash::Hash;

2 changes: 1 addition & 1 deletion src/agdb/collections/map_common/map_data_memory.rs
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@ use super::map_data::MapData;
use super::map_value::MapValue;
use super::map_value_state::MapValueState;
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::hash::Hash;
use std::mem::take;
2 changes: 1 addition & 1 deletion src/agdb/collections/map_common/map_data_storage.rs
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@ use super::map_value_state::MapValueState;
use crate::db::db_error::DbError;
use crate::storage::storage_index::StorageIndex;
use crate::storage::OldStorage;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::cell::RefCell;
use std::hash::Hash;
2 changes: 1 addition & 1 deletion src/agdb/collections/map_common/map_iterator.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use super::map_data::MapData;
use super::map_value_state::MapValueState;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::hash::Hash;
use std::marker::PhantomData;
2 changes: 1 addition & 1 deletion src/agdb/collections/map_common/map_value.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use super::map_value_state::MapValueState;
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;

#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct MapValue<K, T>
2 changes: 1 addition & 1 deletion src/agdb/collections/map_common/map_value_state.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use std::mem::size_of;

#[derive(Clone, Default, Debug, Eq, PartialEq)]
2 changes: 1 addition & 1 deletion src/agdb/collections/multi_map.rs
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@ pub mod multi_map_impl;
use self::multi_map_impl::MultiMapImpl;
use super::map_common::map_data_memory::MapDataMemory;
use super::map_common::MapCommon;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::hash::Hash;

2 changes: 1 addition & 1 deletion src/agdb/collections/multi_map/multi_map_impl.rs
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@ use crate::collections::map_common::map_data::MapData;
use crate::collections::map_common::map_iterator::MapIterator;
use crate::collections::map_common::map_value_state::MapValueState;
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::hash::Hash;

2 changes: 1 addition & 1 deletion src/agdb/collections/storage_dictionary.rs
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ use crate::db::db_error::DbError;
use crate::storage::storage_file::StorageFile;
use crate::storage::storage_index::StorageIndex;
use crate::storage::OldStorage;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::cell::RefCell;
use std::marker::PhantomData;
2 changes: 1 addition & 1 deletion src/agdb/collections/storage_map.rs
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@ use crate::db::db_error::DbError;
use crate::storage::storage_file::StorageFile;
use crate::storage::storage_index::StorageIndex;
use crate::storage::OldStorage;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::cell::RefCell;
use std::hash::Hash;
2 changes: 1 addition & 1 deletion src/agdb/collections/storage_multi_map.rs
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@ use crate::db::db_error::DbError;
use crate::storage::storage_file::StorageFile;
use crate::storage::storage_index::StorageIndex;
use crate::storage::OldStorage;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::cell::RefCell;
use std::hash::Hash;
2 changes: 1 addition & 1 deletion src/agdb/collections/storage_vec.rs
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@ use crate::db::db_error::DbError;
use crate::storage::storage_file::StorageFile;
use crate::storage::storage_index::StorageIndex;
use crate::storage::OldStorage;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use std::cell::RefCell;
use std::cell::RefMut;
use std::cmp::max;
2 changes: 1 addition & 1 deletion src/agdb/collections/vec/storage_vec_iterator.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::collections::storage_vec::StorageVec;
use crate::storage::OldStorage;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use std::marker::PhantomData;

pub struct StorageVecIterator<'a, T, Data>
2 changes: 1 addition & 1 deletion src/agdb/db/db_float.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use std::cmp::Ordering;
use std::hash::Hash;
15 changes: 9 additions & 6 deletions src/agdb/db/db_index.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::{utilities::serialize::Serialize, DbError};
use crate::utilities::serialize::{Serialize, SerializeFixed};
use crate::DbError;

#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
pub struct DbIndex {
@@ -12,11 +13,11 @@ impl DbIndex {
}

pub fn from_bytes(bytes: &[u8]) -> Result<DbIndex, DbError> {
if bytes.len() > DbIndex::serialized_size() {
if bytes.len() > DbIndex::fixed_size() {
return Err(DbError::from(format!(
"DbIndex::from_bytes error: value ({}) too long (>{})",
bytes.len(),
DbIndex::serialized_size()
DbIndex::fixed_size()
)));
}

@@ -51,7 +52,7 @@ impl DbIndex {
impl Serialize for DbIndex {
fn serialize(&self) -> Vec<u8> {
let mut bytes = Vec::<u8>::new();
bytes.reserve(Self::serialized_size());
bytes.reserve(Self::fixed_size());
bytes.extend(self.value.serialize());
bytes.extend(self.meta.serialize());

@@ -61,11 +62,13 @@ impl Serialize for DbIndex {
fn deserialize(bytes: &[u8]) -> Result<Self, crate::DbError> {
Ok(DbIndex {
value: u64::deserialize(bytes)?,
meta: u64::deserialize(&bytes[u64::serialized_size()..])?,
meta: u64::deserialize(&bytes[u64::fixed_size()..])?,
})
}
}

impl SerializeFixed for DbIndex {}

impl From<usize> for DbIndex {
fn from(value: usize) -> Self {
Self {
@@ -216,7 +219,7 @@ mod tests {
original.set_value(1_u64);
original.set_meta(2_u64);

let serialized_size = DbIndex::serialized_size();
let serialized_size = DbIndex::fixed_size();
let mut bytes = original.serialize();

assert_eq!(bytes.len(), serialized_size);
2 changes: 1 addition & 1 deletion src/agdb/db/db_value.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use super::db_float::DbFloat;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;
use crate::DbError;

2 changes: 1 addition & 1 deletion src/agdb/graph/graph_data_storage_indexes.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::db::db_error::DbError;
use crate::storage::storage_index::StorageIndex;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use std::mem::size_of;

pub(crate) struct GraphDataStorageIndexes {
2 changes: 1 addition & 1 deletion src/agdb/storage.rs
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ mod write_ahead_log;
use self::partial_storage::PartialStorage;
use crate::db::db_error::DbError;
use crate::storage::storage_index::StorageIndex;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::serialize::Serialize;

pub trait OldStorage {
22 changes: 7 additions & 15 deletions src/agdb/storage/partial_storage.rs
Original file line number Diff line number Diff line change
@@ -1,33 +1,25 @@
use super::storage_index::StorageIndex;
use crate::utilities::partial_serialize::PartialSerialize;
use crate::utilities::serialize::Serialize;
use crate::DbError;

pub trait PartialStorage {
fn commit(&mut self) -> Result<(), DbError>;
fn insert<T: PartialSerialize>(&mut self, value: &T) -> Result<StorageIndex, DbError>;
fn insert_at<T: PartialSerialize>(
fn insert<T: Serialize>(&mut self, value: &T) -> Result<StorageIndex, DbError>;
fn insert_at<T: Serialize>(
&mut self,
index: &StorageIndex,
offset: usize,
value: &T,
) -> Result<usize, DbError>;
fn move_at<T: PartialSerialize>(
fn move_at<T: Serialize>(
&mut self,
index: &StorageIndex,
offset: usize,
value: &T,
) -> Result<(), DbError>;
fn replace<T: PartialSerialize>(
&mut self,
index: &StorageIndex,
value: &T,
) -> Result<usize, DbError>;
fn value<T: PartialSerialize>(&self, index: &StorageIndex) -> Result<T, DbError>;
fn value_at<T: PartialSerialize>(
&self,
index: &StorageIndex,
offset: usize,
) -> Result<T, DbError>;
fn replace<T: Serialize>(&mut self, index: &StorageIndex, value: &T) -> Result<usize, DbError>;
fn value<T: Serialize>(&self, index: &StorageIndex) -> Result<T, DbError>;
fn value_at<T: Serialize>(&self, index: &StorageIndex, offset: usize) -> Result<T, DbError>;
fn resize_value(&mut self, index: &StorageIndex, new_size: u64) -> Result<(), DbError>;
fn shrink_to_fit(&mut self) -> Result<(), DbError>;
fn size(&mut self) -> Result<u64, DbError>;
2 changes: 1 addition & 1 deletion src/agdb/storage/storage_file.rs
Original file line number Diff line number Diff line change
@@ -33,7 +33,7 @@ mod tests {
use crate::storage::storage_index::StorageIndex;
use crate::storage::OldStorage;
use crate::test_utilities::test_file::TestFile;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use std::fs::metadata;

#[test]
2 changes: 1 addition & 1 deletion src/agdb/storage/storage_impl.rs
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@ use crate::storage::storage_index::StorageIndex;
use crate::storage::storage_record::StorageRecord;
use crate::storage::write_ahead_log::WriteAheadLogRecord;
use crate::storage::OldStorage;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use std::cmp::max;
use std::cmp::min;
use std::io::SeekFrom;
2 changes: 1 addition & 1 deletion src/agdb/storage/storage_index.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;

#[derive(Clone, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
pub struct StorageIndex {
2 changes: 1 addition & 1 deletion src/agdb/storage/storage_record.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::db::db_error::DbError;
use crate::storage::storage_index::StorageIndex;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;

#[derive(Clone, Debug, Default, Eq, Ord, PartialEq, PartialOrd)]
pub struct StorageRecord {
2 changes: 1 addition & 1 deletion src/agdb/storage/write_ahead_log.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use std::fs::File;
use std::fs::OpenOptions;
use std::io::Read;
2 changes: 1 addition & 1 deletion src/agdb/test_utilities/collided_value.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use crate::db::db_error::DbError;
use crate::utilities::serialize::OldSerialize;
use crate::utilities::old_serialize::OldSerialize;
use crate::utilities::stable_hash::StableHash;

#[derive(Clone, Debug, Default, Eq, PartialEq)]
2 changes: 1 addition & 1 deletion src/agdb/utilities.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
pub mod partial_serialize;
pub mod old_serialize;
pub mod serialize;
pub mod stable_hash;
328 changes: 328 additions & 0 deletions src/agdb/utilities/old_serialize.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,328 @@
use crate::db::db_error::DbError;
use std::mem::size_of;

pub trait OldSerialize: Sized {
fn old_deserialize(bytes: &[u8]) -> Result<Self, DbError>;
fn old_serialize(&self) -> Vec<u8>;
fn fixed_size() -> u64 {
size_of::<Self>() as u64
}
}

impl OldSerialize for f64 {
fn old_deserialize(bytes: &[u8]) -> Result<Self, DbError> {
let bits = u64::old_deserialize(bytes)?;
Ok(f64::from_bits(bits))
}

fn old_serialize(&self) -> Vec<u8> {
self.to_bits().old_serialize()
}
}

impl OldSerialize for i64 {
fn old_deserialize(bytes: &[u8]) -> Result<Self, DbError> {
let buffer: [u8; size_of::<Self>()] = bytes
.get(0..size_of::<Self>())
.ok_or_else(|| DbError::from("i64 deserialization error: out of bounds"))?
.try_into()
.unwrap();
Ok(Self::from_le_bytes(buffer))
}

fn old_serialize(&self) -> Vec<u8> {
self.to_le_bytes().into()
}
}

impl OldSerialize for u64 {
fn old_deserialize(bytes: &[u8]) -> Result<Self, DbError> {
let buffer: [u8; size_of::<Self>()] = bytes
.get(0..size_of::<Self>())
.ok_or_else(|| DbError::from("u64 deserialization error: out of bounds"))?
.try_into()
.unwrap();
Ok(Self::from_le_bytes(buffer))
}

fn old_serialize(&self) -> Vec<u8> {
self.to_le_bytes().into()
}
}

impl OldSerialize for String {
fn old_deserialize(bytes: &[u8]) -> Result<Self, DbError> {
if bytes.len() <= 16 {
let size = bytes[0] as usize;
Ok(String::from_utf8(bytes[1..(size + 1)].to_vec())?)
} else {
let size = u64::old_deserialize(bytes)? as usize;
Ok(String::from_utf8(
bytes[u64::fixed_size() as usize..(u64::fixed_size() as usize + size)].to_vec(),
)?)
}
}

fn old_serialize(&self) -> Vec<u8> {
let mut bytes = Vec::<u8>::new();

if self.len() < 16 {
bytes.reserve(1 + self.len());
bytes.push(self.len() as u8);
bytes.extend(self.as_bytes());
} else {
bytes.reserve(u64::fixed_size() as usize + self.len());
bytes.extend((self.len() as u64).old_serialize());
bytes.extend(self.as_bytes());
}

bytes
}

fn fixed_size() -> u64 {
0
}
}

struct VecSerializer;

impl VecSerializer {
fn deserialize_dynamic<T: OldSerialize>(bytes: &[u8]) -> Result<Vec<T>, DbError> {
const LEN_OFFSET: usize = size_of::<u64>();
let len = u64::old_deserialize(bytes)? as usize;
let mut data = Vec::<T>::new();
data.reserve(len);
let mut offset = LEN_OFFSET;

for _i in 0..len {
let value_len = u64::old_deserialize(&bytes[offset..(offset + LEN_OFFSET)])? as usize;
offset += LEN_OFFSET;
let value = T::old_deserialize(&bytes[offset..(offset + value_len)])?;
offset += value_len;
data.push(value);
}

Ok(data)
}

fn serialize_dynamic<T: OldSerialize>(vec: &Vec<T>) -> Vec<u8> {
let mut bytes = Vec::<u8>::new();

bytes.extend((vec.len() as u64).old_serialize());

for value in vec {
let serialized_value = value.old_serialize();
bytes.extend((serialized_value.len() as u64).old_serialize());
bytes.extend(serialized_value);
}

bytes
}

fn deserialize_fixed<T: OldSerialize>(bytes: &[u8]) -> Result<Vec<T>, DbError> {
const LEN_OFFSET: usize = size_of::<u64>();
let len = u64::old_deserialize(bytes)? as usize;
let mut data = Vec::<T>::new();
data.reserve(len);

let value_offset = T::fixed_size();

for i in 0..len {
let offset = LEN_OFFSET + value_offset as usize * i;
data.push(T::old_deserialize(&bytes[offset..])?);
}

Ok(data)
}

fn serialize_fixed<T: OldSerialize>(vec: &Vec<T>) -> Vec<u8> {
const LEN_OFFSET: usize = size_of::<u64>();
let mut bytes = Vec::<u8>::new();

let value_offset = T::fixed_size();
bytes.reserve(LEN_OFFSET + (value_offset as usize) * vec.len());
bytes.extend((vec.len() as u64).old_serialize());

for value in vec {
bytes.extend(value.old_serialize());
}

bytes
}
}

impl<T> OldSerialize for Vec<T>
where
T: OldSerialize,
{
fn old_deserialize(bytes: &[u8]) -> Result<Self, DbError> {
if T::fixed_size() == 0 {
return VecSerializer::deserialize_dynamic(bytes);
}

VecSerializer::deserialize_fixed(bytes)
}

fn old_serialize(&self) -> Vec<u8> {
if T::fixed_size() == 0 {
return VecSerializer::serialize_dynamic(self);
}

VecSerializer::serialize_fixed(self)
}

fn fixed_size() -> u64 {
0
}
}

impl OldSerialize for Vec<u8> {
fn old_deserialize(bytes: &[u8]) -> Result<Self, DbError> {
Ok(bytes.to_vec())
}

fn old_serialize(&self) -> Vec<u8> {
self.to_vec()
}

fn fixed_size() -> u64 {
0
}
}

#[cfg(test)]
mod old_tests {
use super::*;
use std::cmp::Ordering;

#[test]
fn fixed_size() {
assert_eq!(i64::fixed_size(), 8);
assert_eq!(u64::fixed_size(), 8);
assert_eq!(Vec::<i64>::fixed_size(), 0);
assert_eq!(String::fixed_size(), 0);
}

#[test]
fn f64() {
let f = -3.333_f64;
let bytes = f.old_serialize();
let actual = f64::old_deserialize(&bytes).unwrap();

assert_eq!(f.total_cmp(&actual), Ordering::Equal);

let nan = f64::NAN;
let bytes = nan.old_serialize();
let actual_nan = f64::old_deserialize(&bytes).unwrap();

assert_eq!(nan.total_cmp(&actual_nan), Ordering::Equal);
}

#[test]
fn i64() {
let number = -10_i64;
let bytes = number.old_serialize();
let actual = i64::old_deserialize(&bytes);

assert_eq!(actual, Ok(number));
}

#[test]
fn i64_out_of_bounds() {
let bytes = vec![0_u8; 4];

assert_eq!(
i64::old_deserialize(&bytes),
Err(DbError::from("i64 deserialization error: out of bounds"))
);
}

#[test]
fn small_string_optimization() {
let value = "Hello, World!".to_string();
let bytes = value.old_serialize();

assert_eq!(bytes.len(), 14);

let actual = String::old_deserialize(&bytes);

assert_eq!(actual, Ok(value));
}

#[test]
fn string() {
let value = "Hello, World! This string is not short. No sir!".to_string();
let bytes = value.old_serialize();

assert_eq!(bytes.len(), 8 + value.len());

let actual = String::old_deserialize(&bytes);

assert_eq!(actual, Ok(value));
}

#[test]
fn string_bad_bytes() {
let bad_bytes = vec![2_u8, 0xdf, 0xff];

assert!(String::old_deserialize(&bad_bytes).is_err());
}

#[test]
fn u64() {
let number = 10_u64;
let bytes = number.old_serialize();
let actual = u64::old_deserialize(&bytes);

assert_eq!(actual, Ok(number));
}

#[test]
fn u64_out_of_bounds() {
let bytes = vec![0_u8; 4];

assert_eq!(
u64::old_deserialize(&bytes),
Err(DbError::from("u64 deserialization error: out of bounds"))
);
}

#[test]
fn vec_i64() {
let data = vec![1_i64, 2_i64, 3_i64];
let bytes = data.old_serialize();
let actual = Vec::<i64>::old_deserialize(&bytes);

assert_eq!(actual, Ok(data));
}

#[test]
fn vec_size_out_of_bounds() {
let bytes = vec![0_u8; 4];

assert_eq!(
Vec::<i64>::old_deserialize(&bytes),
Err(DbError::from("u64 deserialization error: out of bounds"))
);
}

#[test]
fn vec_u8() {
let data = vec![1_u8, 2_u8, 3_u8];
let bytes = data.old_serialize();
let actual = Vec::<u8>::old_deserialize(&bytes);

assert_eq!(Vec::<u8>::fixed_size(), 0);
assert_eq!(actual, Ok(data));
}

#[test]
fn vec_value_out_of_bounds() {
let bytes = 1_u64.old_serialize();

assert_eq!(
Vec::<i64>::old_deserialize(&bytes),
Err(DbError::from("i64 deserialization error: out of bounds"))
);
}
}
272 changes: 0 additions & 272 deletions src/agdb/utilities/partial_serialize.rs

This file was deleted.

533 changes: 244 additions & 289 deletions src/agdb/utilities/serialize.rs

Large diffs are not rendered by default.