0285-KVS-分离写入文件逻辑
环境
- Time 2022-12-12
- WSL-Ubuntu 22.04
- Rust 1.65.0
前言
说明
参考:https://github.com/pingcap/talent-plan
目标
在上一节的基础上,将文件的写入逻辑存放到新的文件中。
Cargo.toml
[package]
edition = "2021"
name = "kvs"
version = "1.0.0"
[dependencies]
clap = {version = "4", features = ["derive"]}
serde = {version = "1", features = ["derive"]}
serde_json = "1"
log.rs
use std::collections::HashMap;
use std::fs::File;
use std::io::{BufWriter, Write};
use crate::cmd::Command;
mod reader;
mod writer;
pub(crate) struct CommandLog {
writer: BufWriter<File>,
map: HashMap<String, String>,
}
pub type KvResult = anyhow::Result<Option<String>>;
impl CommandLog {
pub(crate) fn new() -> anyhow::Result<Self> {
let path = "/root/log/1.log";
let writer = writer::new_writer(path)?;
let mut map = HashMap::default();
reader::load(path, &mut map)?;
Ok(Self { writer, map })
}
pub(crate) fn get(&mut self, key: &str) -> KvResult {
Ok(self.map.get(key).map(String::from))
}
pub fn set(&mut self, key: String, value: String) -> KvResult {
let command = Command::Set {
key: key.to_string(),
value: value.to_string(),
};
let json = serde_json::to_string(&command)?;
self.writer.write_all(json.as_bytes())?;
Ok(self.map.insert(key, value))
}
pub(crate) fn remove(&mut self, key: String) -> KvResult {
let command = Command::Remove { key: &key };
let json = serde_json::to_string(&command)?;
self.writer.write_all(json.as_bytes())?;
Ok(self.map.remove(&key))
}
}
writer.rs
use std::fs::{File, OpenOptions};
use std::io::BufWriter;
use anyhow::Result;
pub fn new_writer(path: &str) -> Result<BufWriter<File>> {
let file = OpenOptions::new().append(true).create(true).open(path)?;
Ok(BufWriter::new(file))
}
总结
将写入文件的逻辑分离到了单独的文件中。

浙公网安备 33010602011771号