最近接触 rust ,心血来潮想写一个 rdb 解析工具,目前 aux 部分解析完成,但是每次解析出来的值都会覆盖掉之前的值,导致最后结果为空,以下是代码,跪求各位大佬解答 orz:
impl ParserFactory {
pub fn parse(rdb_context: &[u8]) -> Result<RDBInfo> {
let mut cursor = Cursor::new(rdb_context);
let base_info = BaseInfo::parse(&mut cursor)?;
let rdb_version:usize = base_info.rdb_version.parse().expect("Not a valid number");
let mut aux_info = None;
let mut db_info= None;
// aux 只有 rdb 版本大于等于 7 才引入
if rdb_version < 7 {
aux_info = None
};
loop {
// 读取标志位
let mut flag_byte = [0;1];
if cursor.read_exact(&mut flag_byte).is_err(){
break
}
match flag_byte[0] {
FA => {
aux_info = Some(AuxInfo::parse(&mut cursor)?);
}
FE => {
db_info = Some(DbInfo::parse(&mut cursor)?);
}
FF => {
println!("parse done.");
break
}
_ =>{
continue;
}
}
}
// 组合 RDBInfo
let rdb_info = RDBInfo {
base_info,
aux_info: aux_info.unwrap_or_else(|| AuxInfo {
redis_server_version: String::new(),
used_mem:0,
}),
};
Ok(rdb_info)
}
}
impl Parser for AuxInfo {
fn parse(cursor: &mut Cursor<&[u8]>) -> Result<AuxInfo> {
let mut aux_info = AuxInfo {
redis_server_version: String::new(),
used_mem: 0,
};
let aux_name = parser_aux_name(cursor)?;
match aux_name.as_str() {
"redis-ver" => {
aux_info.redis_server_version = parser_aux_value(cursor)?;
}
"used-mem" => {
aux_info.used_mem = parser_aux_value(cursor)?.parse::<usize>().expect("Failed to parse used-mem");
}
_ => {
}
}
Ok(aux_info)
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.