はじめに

この投稿では、現時点ではまだ「work in progress」とされているCouchbase Rust SDKについて紹介します。内容的には、Couchbase Labsにて公開されている公式リポジトリーのREADMEからの情報紹介になります。

筆者は、Rustについては経験がないものの、Couchbase Server周りの話として、Rust SDKの要望を聞くようになっています。現在はコミュニティサポートの状態にて、エンタープライズサポート版の登場が待たれるところですが、本稿が、Rustアプリケーションから利用することのできるデータベースのひとつとして、Couchbase Serverについて認識いただく機会になれば幸いです。

Couchbase Serverについては、日本語で読むことができるまとまった情報として、次の拙著を紹介させていただきます。

Couchbase Serverは、NoSQLドキュメント指向データベースであり、同様のカテゴリーにMongoDBがあります。上記書籍にて、それぞれの違いについても説明しています。

MongoDBのRust対応については、以下のようなリポジトリーがあるようですね。将来的に、それぞれのRustにおける実装の違いなども、検証・紹介してみたいものです。

Couchbase Server Rust SDK概要

Couchbase ServerのRust SDKは、 以下のGithubリポジトリで公開されています。

ソースコードとして提供されており、ビルドするために、Couchbase C Clientライブラリー(libcouchbase)に依存します。

また、C/C++ライブラリーにRust FFIをバインディングするためのbindgenのユーザーガイドで公開されている要件を考慮する必要があります。

Couchbase Rust SDKは、async/await構文を利用しているため、1.39以上のRustバージョンが必要です。

コード記述例

キーバリュー操作の基本的なコード記述例は次のとおりです。

pub fn main() {
    // 接続文字列と視覚情報を使用してクラスターに接続
    let cluster = Cluster::connect("couchbase://127.0.0.1", "Administrator", "password");
    // バケットをオープン
    let bucket = cluster.bucket("travel-sample");
    // Use the default collection (needs to be used for all server 6.5 and earlier)
    let collection = bucket.default_collection();

    // ドキュメントの取得
    match block_on(collection.get("airline_10", GetOptions::default())) {
        Ok(r) => println!("get result: {:?}", r),
        Err(e) => println!("get failed! {}", e),
    };

    // ドキュメントを保存
    let mut content = HashMap::new();
    content.insert("Hello", "Rust!");

    match block_on(collection.upsert("foo", content, UpsertOptions::default())) {
        Ok(r) => println!("upsert result: {:?}", r),
        Err(e) => println!("upsert failed! {}", e),
    };
}

サンプルコード

レポジトリーのexamplesフォルダーにコード記述例が多数格納されています。

アンセーフコードブロック

現在のコードには、unsafe {}コードブロックが含まれていることが注意されています。unsafe {}コードブロックを使用する理由は、Cライブラリであるlibcouchbaseを呼び出すことができるようにするためです。

該当箇所は、IOモジュールのlcb部分にあります。そのため、その部分で、セグメンテーション違反が発生する可能性があります。

また、unsafe {}コードブロックのない純粋なRust SDKの開発にも取り組み中であるとされています。

最後に

今回、Couchbase Rust SDKについて紹介しました。内容的には、ほんのさわり、ということでしかないと思いますが、今後の展開の(特に自分自身にとっての)はずみとなればと思っています。

bannerAds