#lmdb #persistence #yrs #crdt #back-end

yrs-lmdb

基于 Yrs 文档的 LMDB 后端持久化层

3 个版本 (重大更改)

0.3.0 2024 年 7 月 9 日
0.2.0 2023 年 11 月 25 日
0.1.0 2023 年 3 月 1 日

#6 in #yrs

Download history 3/week @ 2024-04-24 37/week @ 2024-05-01 71/week @ 2024-07-03 135/week @ 2024-07-10 59/week @ 2024-07-17 38/week @ 2024-07-24

每月 303 次下载

MIT 许可证

50KB
940 代码行

yrs-lmdb

yrs-lmdb 是一个持久化层,允许存储 Yrs 文档,并提供方便的实用函数来处理它们,使用 LMDB 作为持久后端。

阅读文档以获取更多示例。


lib.rs:

yrs-lmdb 是一个持久化层,允许存储 Yrs 文档,并提供方便的实用函数来处理它们,使用 LMDB 作为持久后端。

示例

use std::sync::Arc;
use lmdb_rs::core::DbCreate;
use lmdb_rs::Environment;
use yrs::{Doc, Text, Transact};
use yrs_kvstore::DocOps;
use yrs_lmdb::LmdbStore;

let env = Arc::new(Environment::new()
    .autocreate_dir(true)
    .max_dbs(4)
    .open("my-lmdb-dir", 0o777)
    .unwrap());
let h = Arc::new(env.create_db("yrs", DbCreate).unwrap());

let doc = Doc::new();
let text = doc.get_or_insert_text("text");

// restore document state from DB
{
  let db_txn = env.get_reader().unwrap();
  let db = LmdbStore::from(db_txn.bind(&h));
  db.load_doc("my-doc-name", &mut doc.transact_mut()).unwrap();
}

// another options is to flush document state right away, but
// this requires a read-write transaction
{
  let db_txn = env.new_transaction().unwrap();
  let db = LmdbStore::from(db_txn.bind(&h));
  let doc = db.flush_doc_with("my-doc-name", yrs::Options::default()).unwrap();
  db_txn.commit().unwrap(); // flush may modify internal store state
}

// configure document to persist every update and
// occassionaly compact them into document state
let sub = {
  let env = env.clone();
  let h = h.clone();
  let options = doc.options().clone();
  doc.observe_update_v1(move |_,e| {
      let db_txn = env.new_transaction().unwrap();
      let db = LmdbStore::from(db_txn.bind(&h));
      let seq_nr = db.push_update("my-doc-name", &e.update).unwrap();
      if seq_nr % 64 == 0 {
          // occassinally merge updates into the document state
          db.flush_doc_with("my-doc-name", options.clone()).unwrap();
      }
      db_txn.commit().unwrap();
  })
};

text.insert(&mut doc.transact_mut(), 0, "a");
text.insert(&mut doc.transact_mut(), 1, "b");
text.insert(&mut doc.transact_mut(), 2, "c");

依赖项

~3–4.5MB
~91K SLoC