はじめに
この投稿では、現時点ではまだ「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について紹介しました。内容的には、ほんのさわり、ということでしかないと思いますが、今後の展開の(特に自分自身にとっての)はずみとなればと思っています。