Mercurial > lbo > hg > leveldb-rs
changeset 611:ca88834b15c2
Add custom compressor example
author | kaiyohugo <41114603+KAIYOHUGO@users.noreply.github.com> |
---|---|
date | Sat, 15 Jul 2023 14:18:59 +0800 |
parents | 9a561cd122c3 |
children | 40d8c816e363 |
files | Cargo.toml examples/mcpe/Cargo.toml examples/mcpe/README.md examples/mcpe/src/main.rs |
diffstat | 4 files changed, 90 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/Cargo.toml Sat Jul 15 14:05:55 2023 +0800 +++ b/Cargo.toml Sat Jul 15 14:18:59 2023 +0800 @@ -36,5 +36,11 @@ path = "src/benches/maps_bench.rs" [workspace] -members = ["examples/write-a-lot", "examples/leveldb-tool", "examples/word-analyze", "examples/stresstest", "examples/asyncdb"] - +members = [ + "examples/write-a-lot", + "examples/leveldb-tool", + "examples/word-analyze", + "examples/stresstest", + "examples/asyncdb", + "examples/mcpe", +]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/mcpe/Cargo.toml Sat Jul 15 14:18:59 2023 +0800 @@ -0,0 +1,8 @@ +[package] +name = "mcpe" +version = "0.1.0" +edition = "2021" + +[dependencies] +miniz_oxide = "0.7.1" +rusty-leveldb = { path = "../../" }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/mcpe/README.md Sat Jul 15 14:18:59 2023 +0800 @@ -0,0 +1,5 @@ +# MCPE + +This example show how to customize compression method. + +This setup is compatible to [Mojang's leveldb](https://github.com/Mojang/leveldb-mcpe). \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/mcpe/src/main.rs Sat Jul 15 14:18:59 2023 +0800 @@ -0,0 +1,69 @@ +use miniz_oxide::deflate::{compress_to_vec, compress_to_vec_zlib}; +use miniz_oxide::inflate::{decompress_to_vec, decompress_to_vec_zlib}; +use rusty_leveldb::{Compressor, CompressorList, Options}; +use std::rc::Rc; + +struct ZlibCompressor(u8); + +impl ZlibCompressor { + /// level 0-10 + pub fn new(level: u8) -> Self { + assert!(level <= 10); + Self(level) + } +} + +impl Compressor for ZlibCompressor { + fn encode(&self, block: Vec<u8>) -> rusty_leveldb::Result<Vec<u8>> { + Ok(compress_to_vec_zlib(&block, self.0)) + } + + fn decode(&self, block: Vec<u8>) -> rusty_leveldb::Result<Vec<u8>> { + decompress_to_vec_zlib(&block).map_err(|e| rusty_leveldb::Status { + code: rusty_leveldb::StatusCode::CompressionError, + err: e.to_string(), + }) + } +} + +struct RawZlibCompressor(u8); + +impl RawZlibCompressor { + /// level 0-10 + pub fn new(level: u8) -> Self { + assert!(level <= 10); + Self(level) + } +} + +impl Compressor for RawZlibCompressor { + fn encode(&self, block: Vec<u8>) -> rusty_leveldb::Result<Vec<u8>> { + Ok(compress_to_vec(&block, self.0)) + } + + fn decode(&self, block: Vec<u8>) -> rusty_leveldb::Result<Vec<u8>> { + decompress_to_vec(&block).map_err(|e| rusty_leveldb::Status { + code: rusty_leveldb::StatusCode::CompressionError, + err: e.to_string(), + }) + } +} + +pub fn mcpe_options(compression_level: u8) -> Options { + let mut opt = Options::default(); + opt.compressor = 0; + let mut list = CompressorList::new(); + list.set_with_id(0, RawZlibCompressor::new(compression_level)); + list.set_with_id(1, ZlibCompressor::new(compression_level)); + opt.compressor_list = Rc::new(list); + opt +} + +fn main() { + // let path = "path here"; + // let compression_level = 10; + // let opt = mcpe_options(compression_level); + // DB::open(path, opt) + + // Do something +}