refactor info
This commit is contained in:
parent
32e4bee157
commit
50fa2b43e3
47
src/info.rs
47
src/info.rs
@ -1,11 +1,11 @@
|
|||||||
use std::collections::HashMap;
|
use std::{collections::HashMap, io};
|
||||||
|
|
||||||
use eyre::{bail, Context};
|
use eyre::{bail, Context};
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
chunk::{read_chunk, MessageDataHeader},
|
chunk::{read_chunk, ChunkHeader, MessageDataHeader},
|
||||||
index::BagIndex,
|
index::{BagIndex, IndexData},
|
||||||
parse::Op,
|
parse::Op,
|
||||||
reader::{BagReader, SliceReader},
|
reader::{BagReader, SliceReader},
|
||||||
Result,
|
Result,
|
||||||
@ -26,23 +26,36 @@ impl BagInfo {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn compute<R: BagReader + Clone + Send + Sync>(reader: &mut R, index: &BagIndex) -> Result<BagInfo> {
|
pub fn compute<R: BagReader + Clone + Send + Sync>(
|
||||||
|
reader: &mut R,
|
||||||
|
index: &BagIndex,
|
||||||
|
) -> Result<BagInfo> {
|
||||||
|
index
|
||||||
|
.chunks
|
||||||
|
.par_iter()
|
||||||
|
.try_fold(BagInfo::default, |mut info, chunk| -> Result<_> {
|
||||||
|
let mut reader = reader.clone();
|
||||||
|
reader.seek(io::SeekFrom::Start(chunk.pos))?;
|
||||||
|
let chunk_header = ChunkHeader::read(&mut reader)?;
|
||||||
|
info.total_uncompressed += chunk_header.uncompressed_size as u64;
|
||||||
|
reader.skip_data()?;
|
||||||
|
for _ in &chunk.connections {
|
||||||
|
let index = IndexData::read(&mut reader)?;
|
||||||
|
*info.per_connection.entry(index.conn_id).or_insert(0) +=
|
||||||
|
index.entries.len() as u64;
|
||||||
|
}
|
||||||
|
Ok(info)
|
||||||
|
})
|
||||||
|
.try_reduce(BagInfo::default, |a, b| Ok(a.combine(b)))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn compute_without_index<R: BagReader + Clone + Send + Sync>(
|
||||||
|
reader: &mut R,
|
||||||
|
index: &BagIndex,
|
||||||
|
) -> Result<BagInfo> {
|
||||||
index
|
index
|
||||||
.chunks
|
.chunks
|
||||||
.par_iter()
|
.par_iter()
|
||||||
// .try_fold(BagInfo::default, |mut info, chunk| -> rsbag::Result<_> {
|
|
||||||
// let mut reader = reader.clone();
|
|
||||||
// reader.seek(io::SeekFrom::Start(chunk.pos))?;
|
|
||||||
// let chunk_header = ChunkHeader::read(&mut reader)?;
|
|
||||||
// info.total_uncompressed += chunk_header.uncompressed_size as u64;
|
|
||||||
// reader.skip_data()?;
|
|
||||||
// for _ in &chunk.connections {
|
|
||||||
// let index = IndexData::read(&mut reader)?;
|
|
||||||
// *info.per_connection.entry(index.conn_id).or_insert(0) +=
|
|
||||||
// index.entries.len() as u64;
|
|
||||||
// }
|
|
||||||
// Ok(info)
|
|
||||||
// })
|
|
||||||
.try_fold(BagInfo::default, |mut info, chunk| -> Result<_> {
|
.try_fold(BagInfo::default, |mut info, chunk| -> Result<_> {
|
||||||
let mut reader = reader.clone();
|
let mut reader = reader.clone();
|
||||||
let data = read_chunk(&mut reader, chunk.pos)
|
let data = read_chunk(&mut reader, chunk.pos)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user