Rust-rocksdb: 支持 WriteBatch 序列化和反序列化。

创建于 2021-01-07  ·  4评论  ·  资料来源: rust-rocksdb/rust-rocksdb

你好,我想实现rocksdb实例之间的复制。 据我了解,现在 rust-rocksdb 支持所有需要的 api,除了最后一个功能 - writebatch 序列化。 我想从字节创建 WriteBatch 并将其序列化为字节,以便能够通过网络发送它以进行复制。

有什么方法可以实现吗? 或者我可以用我的解决方案进行 PR。

最有用的评论

我需要类似的东西:

impl WriteBatch {
    /// Tries to serialize writebatch as raw bytes vector with null values
    /// Its useful for sending write batches over network.
    pub fn try_into_raw(&self) -> Result<Vec<u8>, Error> {
        let data;
        unsafe {
            let mut repsize1: size_t = 0;
            let rep: *const i8 = ffi::rocksdb_writebatch_data(self.inner, &mut repsize1);
            let cs = slice_from_raw_parts(rep as *const u8, repsize1);
            data = cs.as_ref().ok_or_else(|| {
                Error::new("writeBatch reference is Null".to_string())
            })?.to_vec();
        }
        Ok(data)
    }

    /// creates writeBatch from raw input
    pub fn from_raw(data: &[u8]) -> Self {
        let u8slice = unsafe {
            &*(data as *const _ as *const [i8])
        };
        WriteBatch {
            inner: unsafe { ffi::rocksdb_writebatch_create_from(u8slice.as_ptr(), data.len() as size_t) }
        }
    }
}

使用 writeBatch 的原始值,我将能够通过网络将其发送到辅助数据库副本。

所有4条评论

这么晚才回复很抱歉。 老实说,我现在很少参与与 RocksDB 相关的任何事情,所以我不完全了解您的情况。 您能否详细说明需要添加哪些api?

我需要类似的东西:

impl WriteBatch {
    /// Tries to serialize writebatch as raw bytes vector with null values
    /// Its useful for sending write batches over network.
    pub fn try_into_raw(&self) -> Result<Vec<u8>, Error> {
        let data;
        unsafe {
            let mut repsize1: size_t = 0;
            let rep: *const i8 = ffi::rocksdb_writebatch_data(self.inner, &mut repsize1);
            let cs = slice_from_raw_parts(rep as *const u8, repsize1);
            data = cs.as_ref().ok_or_else(|| {
                Error::new("writeBatch reference is Null".to_string())
            })?.to_vec();
        }
        Ok(data)
    }

    /// creates writeBatch from raw input
    pub fn from_raw(data: &[u8]) -> Self {
        let u8slice = unsafe {
            &*(data as *const _ as *const [i8])
        };
        WriteBatch {
            inner: unsafe { ffi::rocksdb_writebatch_create_from(u8slice.as_ptr(), data.len() as size_t) }
        }
    }
}

使用 writeBatch 的原始值,我将能够通过网络将其发送到辅助数据库副本。

我想添加这样的api是有意义的。 您要提交拉取请求吗?

当然。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

spacejam picture spacejam  ·  3评论

yiyanwannian picture yiyanwannian  ·  6评论

iSynaptic picture iSynaptic  ·  12评论

eupn picture eupn  ·  3评论

iSynaptic picture iSynaptic  ·  31评论