rust-rocksdb新导出一个函数

导出一个类:

首先用c写一个c的结构,模拟类的操作,也就是c函数的第一个指针是结构体指针,模拟类的this指针。
然后再把c的函数导出到rust

以DB为例:

  1. 在librocksdb_sys/crocksdb/c.cc中导出c的函数
struct crocksdb_t {
  DB* rep;
};
crocksdb_t* crocksdb_open(const crocksdb_options_t* options, const char* name,
                          char** errptr) {
  DB* db;
  if (SaveError(errptr, DB::Open(options->rep, std::string(name), &db))) {
    return nullptr;
  }
  crocksdb_t* result = new crocksdb_t;
  result->rep = db;
  return result;
}
  1. librocksdb_sys/crocksdb/crocksdb/c.h中定义。
extern C_ROCKSDB_LIBRARY_API crocksdb_t* crocksdb_open(
    const crocksdb_options_t* options, const char* name, char** errptr);
  1. 用 ./scripts/generate-bindings.sh 重新生成绑定,即生成到了 x86_64-unknown-linux-gnu-bindings.rs中
  2. 复制 x86_64-unknown-linux-gnu-bindings.rs 中的函数定义到 librocksdb_sys/src/lib.rs 中,定一个空指针,例如 DBInstance
#[repr(C)]
pub struct DBInstance(c_void);

pub fn crocksdb_open(
        options: *mut Options,
        path: *const c_char,
        err: *mut *mut c_char,
    ) -> *mut DBInstance;
  1. 在src/rocksdb.rs中定义类名
pub DB{
   inner: *mut DBInstance,
}
impl{
pub fn open_cf_with_ttl<'a, T>(
        ...
    ) -> Result<DB, String>{
         unsafe{
         	 DB{inner:crocksdb_ffi::crocksdb_open(...)}
         }
    }

主要是这样的一个流程。先导出成C的函数,然后导出成rust的。其中第4步的函数就是第2步的函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值