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
+}