From 02bc75a01fe61ba5bdafbff575711daa507d9ce3 Mon Sep 17 00:00:00 2001 From: michaelvlach Date: Thu, 8 Sep 2022 07:16:08 +0200 Subject: [PATCH 1/3] Update storage_vec.rs --- src/storage/storage_vec.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/storage/storage_vec.rs b/src/storage/storage_vec.rs index ecaff0cfd..405eda294 100644 --- a/src/storage/storage_vec.rs +++ b/src/storage/storage_vec.rs @@ -81,4 +81,36 @@ mod tests { Ok(vec![1_i64, 3_i64, 5_i64]) ); } + + #[test] + fn value() { + let test_file = TestFile::from("./storage_vec-value.agdb"); + let storage = std::rc::Rc::new(std::cell::RefCell::new( + FileStorage::try_from(test_file.file_name().clone()).unwrap(), + )); + + let mut vec = StorageVec::::try_from(storage.clone()).unwrap(); + vec.push(&1).unwrap(); + vec.push(&3).unwrap(); + vec.push(&5).unwrap(); + + assert_eq!(vec.value(0), Ok(1)); + assert_eq!(vec.value(1), Ok(3)); + assert_eq!(vec.value(2), Ok(5)); + } + + #[test] + fn value_out_of_bounds() { + let test_file = TestFile::from("./storage_vec-value.agdb"); + let storage = std::rc::Rc::new(std::cell::RefCell::new( + FileStorage::try_from(test_file.file_name().clone()).unwrap(), + )); + + let mut vec = StorageVec::::try_from(storage.clone()).unwrap(); + + assert_eq!( + vec.value(0), + Err(DbError::Storage("index out of bounds".to_string())) + ); + } } From 3747d093237c74169a70d65b17dfb8991d4a23e9 Mon Sep 17 00:00:00 2001 From: michaelvlach Date: Thu, 8 Sep 2022 07:16:12 +0200 Subject: [PATCH 2/3] Update storage_vec.rs --- src/storage/storage_vec.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/storage/storage_vec.rs b/src/storage/storage_vec.rs index 405eda294..c0e47838e 100644 --- a/src/storage/storage_vec.rs +++ b/src/storage/storage_vec.rs @@ -31,6 +31,16 @@ impl StorageVec { Ok(()) } + pub(crate) fn value(&mut self, index: u64) -> Result { + if index < self.size { + self.storage + .borrow_mut() + .value_at::(self.index, Self::value_offset(index)) + } else { + return Err(DbError::Storage("index out of bounds".to_string())); + } + } + fn reallocate(&mut self, new_capacity: u64) -> Result<(), DbError> { self.capacity = new_capacity; self.storage From 1b022970a24d2347b22160700c6361b76c452dc9 Mon Sep 17 00:00:00 2001 From: michaelvlach Date: Thu, 8 Sep 2022 07:19:29 +0200 Subject: [PATCH 3/3] Update storage_vec.rs --- src/storage/storage_vec.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/storage/storage_vec.rs b/src/storage/storage_vec.rs index c0e47838e..5e635ee36 100644 --- a/src/storage/storage_vec.rs +++ b/src/storage/storage_vec.rs @@ -32,13 +32,13 @@ impl StorageVec { } pub(crate) fn value(&mut self, index: u64) -> Result { - if index < self.size { - self.storage - .borrow_mut() - .value_at::(self.index, Self::value_offset(index)) - } else { + if self.size <= index { return Err(DbError::Storage("index out of bounds".to_string())); } + + self.storage + .borrow_mut() + .value_at::(self.index, Self::value_offset(index)) } fn reallocate(&mut self, new_capacity: u64) -> Result<(), DbError> { @@ -99,7 +99,7 @@ mod tests { FileStorage::try_from(test_file.file_name().clone()).unwrap(), )); - let mut vec = StorageVec::::try_from(storage.clone()).unwrap(); + let mut vec = StorageVec::::try_from(storage).unwrap(); vec.push(&1).unwrap(); vec.push(&3).unwrap(); vec.push(&5).unwrap(); @@ -111,12 +111,12 @@ mod tests { #[test] fn value_out_of_bounds() { - let test_file = TestFile::from("./storage_vec-value.agdb"); + let test_file = TestFile::from("./storage_vec-value_out_of_bounds.agdb"); let storage = std::rc::Rc::new(std::cell::RefCell::new( FileStorage::try_from(test_file.file_name().clone()).unwrap(), )); - let mut vec = StorageVec::::try_from(storage.clone()).unwrap(); + let mut vec = StorageVec::::try_from(storage).unwrap(); assert_eq!( vec.value(0),