From 4b9b20e13bbe781731c03808604d68244ee65561 Mon Sep 17 00:00:00 2001 From: michaelvlach Date: Sun, 11 Sep 2022 22:46:47 +0200 Subject: [PATCH 1/6] Update storage_impl.rs --- src/storage/storage_impl.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/storage/storage_impl.rs b/src/storage/storage_impl.rs index b3863aff6..7cdd172bc 100644 --- a/src/storage/storage_impl.rs +++ b/src/storage/storage_impl.rs @@ -5,7 +5,7 @@ use super::write_ahead_log_record::WriteAheadLogRecord; use crate::db_error::DbError; pub(crate) trait StorageImpl { - fn append(&mut self, bytes: Vec) -> Result<(), DbError> { + fn append(&mut self, bytes: &[u8]) -> Result<(), DbError> { self.write(std::io::SeekFrom::End(0), bytes) } @@ -46,7 +46,7 @@ pub(crate) trait StorageImpl { new_position: u64, ) -> Result<(), DbError> { let bytes = self.read(std::io::SeekFrom::Start(old_position), size)?; - self.write(std::io::SeekFrom::Start(new_position), bytes)?; + self.write(std::io::SeekFrom::Start(new_position), &bytes)?; self.record_mut(index).position = new_position; Ok(()) @@ -60,9 +60,9 @@ pub(crate) trait StorageImpl { ) -> Result { let new_position = self.seek(std::io::SeekFrom::End(0))?; let bytes = self.read(std::io::SeekFrom::Start(from), size)?; - self.append(record_index.serialize())?; - self.append(record_size.serialize())?; - self.append(bytes)?; + self.append(&record_index.serialize())?; + self.append(&record_size.serialize())?; + self.append(&bytes)?; Ok(StorageRecord { position: new_position, @@ -93,7 +93,7 @@ pub(crate) trait StorageImpl { fn erase_bytes(&mut self, position: u64, size: u64) -> Result<(), DbError> { self.write( std::io::SeekFrom::Start(position), - vec![0_u8; size as usize], + &vec![0_u8; size as usize], ) } @@ -101,7 +101,7 @@ pub(crate) trait StorageImpl { fn insert_wal_record(&mut self, record: WriteAheadLogRecord) -> Result<(), DbError>; fn invalidate_record(&mut self, index: i64, position: u64) -> Result<(), DbError> { - self.write(std::io::SeekFrom::Start(position), (-index).serialize()) + self.write(std::io::SeekFrom::Start(position), &(-index).serialize()) } fn is_at_end(&mut self, record: &StorageRecord) -> Result { @@ -134,7 +134,7 @@ pub(crate) trait StorageImpl { fn move_bytes(&mut self, from: u64, to: u64, size: u64) -> Result<(), DbError> { let bytes = self.read(std::io::SeekFrom::Start(from), size)?; - self.write(std::io::SeekFrom::Start(to), bytes)?; + self.write(std::io::SeekFrom::Start(to), &bytes)?; if from < to { self.erase_bytes(from, std::cmp::min(size, to - from))?; @@ -294,7 +294,7 @@ pub(crate) trait StorageImpl { fn wal_records(&mut self) -> Result, DbError>; - fn write(&mut self, position: std::io::SeekFrom, bytes: Vec) -> Result<(), DbError> { + fn write(&mut self, position: std::io::SeekFrom, bytes: &[u8]) -> Result<(), DbError> { let current_end = self.seek(std::io::SeekFrom::End(0))?; let write_pos = self.seek(position)?; From b5d2d2d86549bfbeee41ff696fc0c1c97d70b9c8 Mon Sep 17 00:00:00 2001 From: michaelvlach Date: Sun, 11 Sep 2022 22:46:49 +0200 Subject: [PATCH 2/6] Update serialize.rs --- src/storage/serialize.rs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/storage/serialize.rs b/src/storage/serialize.rs index d70b0c985..de36d40f4 100644 --- a/src/storage/serialize.rs +++ b/src/storage/serialize.rs @@ -16,7 +16,7 @@ impl Serialize for i64 { } fn serialize(&self) -> Vec { - self.to_le_bytes().to_vec() + self.to_le_bytes().into() } } @@ -31,7 +31,7 @@ impl Serialize for u64 { } fn serialize(&self) -> Vec { - self.to_le_bytes().to_vec() + self.to_le_bytes().into() } } @@ -68,6 +68,16 @@ impl Serialize for Vec { } } +impl Serialize for Vec { + fn deserialize(bytes: &[u8]) -> Result { + Ok(bytes.to_vec()) + } + + fn serialize(&self) -> Vec { + self.to_vec() + } +} + #[cfg(test)] mod tests { use super::*; @@ -129,6 +139,15 @@ mod tests { ); } + #[test] + fn vec_u8() { + let data = vec![1_u8, 2_u8, 3_u8]; + let bytes = data.serialize(); + let actual = Vec::::deserialize(&bytes); + + assert_eq!(actual, Ok(data)); + } + #[test] fn vec_value_out_of_bounds() { let bytes = 1_u64.serialize(); From 7a43e3f0290921c6efe6cf337295ba2a40e08af3 Mon Sep 17 00:00:00 2001 From: michaelvlach Date: Sun, 11 Sep 2022 22:46:52 +0200 Subject: [PATCH 3/6] Update storage.rs --- src/storage.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/storage.rs b/src/storage.rs index 0be4f4a25..be7f9a72d 100644 --- a/src/storage.rs +++ b/src/storage.rs @@ -27,9 +27,9 @@ pub(crate) trait Storage: StorageImpl { let bytes = value.serialize(); let index = self.create_index(position, bytes.len() as u64); - self.append(index.serialize())?; - self.append((bytes.len() as u64).serialize())?; - self.append(bytes)?; + self.append(&index.serialize())?; + self.append(&(bytes.len() as u64).serialize())?; + self.append(&bytes)?; self.commit()?; Ok(index) @@ -45,7 +45,7 @@ pub(crate) trait Storage: StorageImpl { let mut record = self.record(index)?; let bytes = V::serialize(value); self.ensure_record_size(&mut record, index, offset, bytes.len() as u64)?; - self.write(Self::value_position(record.position, offset), bytes)?; + self.write(Self::value_position(record.position, offset), &bytes)?; self.commit() } From 038a6f1f4927acc55e268639ffbf5f9341f0b521 Mon Sep 17 00:00:00 2001 From: michaelvlach Date: Sun, 11 Sep 2022 22:48:42 +0200 Subject: [PATCH 4/6] Update storage_impl.rs --- src/storage/storage_impl.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/storage_impl.rs b/src/storage/storage_impl.rs index 7cdd172bc..7dfdb2494 100644 --- a/src/storage/storage_impl.rs +++ b/src/storage/storage_impl.rs @@ -315,7 +315,7 @@ pub(crate) trait StorageImpl { } self.seek(position)?; - self.write_all(&bytes) + self.write_all(bytes) } fn write_all(&mut self, bytes: &[u8]) -> Result<(), DbError>; From 4b05146bf6f8a5a3d670680363dc81f252253c80 Mon Sep 17 00:00:00 2001 From: michaelvlach Date: Sun, 11 Sep 2022 22:57:16 +0200 Subject: [PATCH 5/6] Update file_storage.rs --- src/storage/file_storage.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/storage/file_storage.rs b/src/storage/file_storage.rs index 499c7cbd9..f2fed6c12 100644 --- a/src/storage/file_storage.rs +++ b/src/storage/file_storage.rs @@ -232,6 +232,23 @@ mod tests { ); } + #[test] + fn insert_at_bytes() { + let test_file = TestFile::from("./file_storage-insert_at_bytes.agdb"); + let mut storage = FileStorage::try_from(test_file.file_name().as_str()).unwrap(); + + let index = storage.insert(&vec![1_i64, 2_i64, 3_i64]).unwrap(); + let offset = (std::mem::size_of::() + std::mem::size_of::() * 1) as u64; + let size = std::mem::size_of::() * 2; + + storage.insert_at(index, offset, &vec![0_u8; size]).unwrap(); + + assert_eq!( + storage.value::>(index).unwrap(), + vec![1_i64, 0_i64, 0_i64] + ); + } + #[test] fn move_at() { let test_file = TestFile::from("./file_storage-move_at.agdb"); From 140a600bc6ec19d7720d642346e21bc7dd4cf1eb Mon Sep 17 00:00:00 2001 From: michaelvlach Date: Sun, 11 Sep 2022 22:59:27 +0200 Subject: [PATCH 6/6] Update file_storage.rs --- src/storage/file_storage.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/storage/file_storage.rs b/src/storage/file_storage.rs index f2fed6c12..076a7e6dc 100644 --- a/src/storage/file_storage.rs +++ b/src/storage/file_storage.rs @@ -238,7 +238,7 @@ mod tests { let mut storage = FileStorage::try_from(test_file.file_name().as_str()).unwrap(); let index = storage.insert(&vec![1_i64, 2_i64, 3_i64]).unwrap(); - let offset = (std::mem::size_of::() + std::mem::size_of::() * 1) as u64; + let offset = (std::mem::size_of::() + std::mem::size_of::()) as u64; let size = std::mem::size_of::() * 2; storage.insert_at(index, offset, &vec![0_u8; size]).unwrap();