vec: fix header reading of existing file

This commit is contained in:
nym21
2025-07-13 16:31:22 +02:00
parent 2dd608dfed
commit d6fa5c8a55
3 changed files with 18 additions and 12 deletions

View File

@@ -1,13 +1,15 @@
use std::{fs, path::Path};
use brk_core::{DateIndex, Height, Version};
use brk_core::{DateIndex, Height, Printable, Version};
use brk_vec::{AnyVec, CollectableVec, Format, GenericStoredVec, StoredVec, VecIterator};
type I = DateIndex;
#[allow(clippy::upper_case_acronyms)]
type VEC = StoredVec<DateIndex, u32>;
type VEC = StoredVec<I, u32>;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let _ = fs::remove_dir_all("./vec");
let _ = fs::remove_file("./vec");
let version = Version::TWO;
let format = Format::Compressed;
@@ -15,12 +17,14 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
{
let mut vec: VEC = StoredVec::forced_import(Path::new("."), "vec", version, format)?;
(0..21_u32).for_each(|v| {
(0..4_u32).for_each(|v| {
vec.push(v);
});
let mut iter = vec.into_iter();
dbg!(iter.get(0.into()));
dbg!(iter.get(1.into()));
dbg!(iter.get(2.into()));
dbg!(iter.get(20.into()));
dbg!(iter.get(21.into()));

View File

@@ -1,6 +1,6 @@
use std::{
fs::File,
io::{self, Read, Seek, SeekFrom},
io::{self, Seek, SeekFrom},
os::unix::fs::FileExt,
sync::Arc,
};
@@ -103,7 +103,6 @@ impl HeaderInner {
compressed: ZeroCopyBool::from(format),
};
header.write(file)?;
// dbg!(file.bytes().map(|b| b.unwrap()).collect::<Vec<_>>());
file.seek(SeekFrom::End(0))?;
Ok(header)
}
@@ -117,12 +116,14 @@ impl HeaderInner {
vec_version: Version,
format: Format,
) -> Result<Self> {
if file.metadata()?.len() < HEADER_OFFSET as u64 {
let len = file.metadata()?.len();
if len < HEADER_OFFSET as u64 {
return Err(Error::WrongLength);
}
let mut buf = [0; HEADER_OFFSET];
file.read_exact(&mut buf)?;
file.read_exact_at(&mut buf, 0)?;
let header = HeaderInner::read_from_bytes(&buf)?;

View File

@@ -28,8 +28,8 @@ pub struct RawVec<I, T> {
parent: PathBuf,
name: &'static str,
pushed: Vec<T>,
phantom: PhantomData<I>,
stored_len: Arc<AtomicUsize>,
phantom: PhantomData<I>,
}
impl<I, T> RawVec<I, T>
@@ -77,7 +77,9 @@ where
let header = Header::create_and_write(&mut file, version, Format::Raw)?;
(header, None)
}
_ => return Err(e.into()),
_ => {
return Err(e.into());
}
},
};
@@ -92,8 +94,8 @@ where
name: Box::leak(Box::new(name.to_string())),
parent: parent.to_owned(),
pushed: vec![],
phantom: PhantomData,
stored_len: Arc::new(AtomicUsize::new(stored_len)),
phantom: PhantomData,
})
}
@@ -306,12 +308,11 @@ where
type Item = (I, Cow<'a, T>);
fn next(&mut self) -> Option<Self::Item> {
let mmap = &self.mmap;
let index = self.index;
let opt = self
.vec
.get_or_read_(index, mmap)
.get_or_read_(index, &self.mmap)
.unwrap()
.map(|v| (I::from(index), v));