コンテンツにスキップ

はじめに

最初は高レベルの AkkaraDB / PackedTable API を選んでください。通常の C++ 構造体を BinPack で保存し、主キー、走査、インデックスを独自のバイトレイアウトなしで扱えます。

独自のキーレイアウトやバイトエンコードをアプリケーション側で管理する場合だけ、低レベルの AkkEngine API を選びます。

1. Native ライブラリをビルドする

Section titled “1. Native ライブラリをビルドする”

AkkaraDB Native は LLVM Clang を必要とします。Windows では Visual Studio の開発者環境内の clang-cl、Linux/macOS では clang++ を使います。

Terminal window
cmake --preset release
cmake --build --preset release

Windows では最初に Visual Studio environment を初期化します。

Terminal window
cmd /c "call \"C:\Program Files\Microsoft Visual Studio\18\Community\VC\Auxiliary\Build\vcvars64.bat\" >nul && cmake --preset windows-clang-cl-release && cmake --build --preset windows-clang-cl-release"

インストール済みパッケージを使う場合は、アプリケーションの CMake から Native target をリンクします。

find_package(AkkaraDB REQUIRED)
target_link_libraries(my_app PRIVATE AkkaraDB::akkaradb)

2. 行を定義してデータベースを開く

Section titled “2. 行を定義してデータベースを開く”

保存し、型付きクエリヘルパーから使うフィールドをマクロで登録します。型名の次の引数が主キーです。

#include "akkaradb/AkkaraDB.hpp"
#include <cstdint>
#include <iostream>
#include <string>
struct User {
uint64_t id;
std::string email;
std::string name;
uint32_t age;
};
AKKARADB_ENTITY(User, id, email, name, age)
int main() {
auto db = akkaradb::AkkaraDB::open("data/app", akkaradb::StartupMode::NORMAL);
auto users = db->table<&User::id>("users");

NORMAL は組み込み用途の標準プロファイルです。同期 WAL と VersionLog が必要なら DURABLE、低オーバーヘッドなローカル用途なら FAST を選びます。プロファイルの詳細は AkkaraDB を参照してください。

put() は主キーにより行を insert または置換します。get()std::optional<T> を返すため、存在しない場合を明示的に扱います。

users.put(User{1, "alice@example.test", "Alice", 30});
if (const auto alice = users.get(1)) {
std::cout << alice->name << " is " << alice->age << "\n";
}
auto rows = users.scanAll();
while (rows.hasNext()) {
const auto row = rows.next();
std::cout << row.value.email << "\n";
}

テーブル名とエンティティのフィールド順序は、保存済みデータの互換性に含まれます。テーブル名の変更やフィールドの並べ替え・型変更は、移行として扱ってください。

4. インデックスを使う前に登録する

Section titled “4. インデックスを使う前に登録する”

インデックスはテーブルを開いた直後、インデックス経由で見つけたい行を書き込む前に登録します。登録後の書き込みでは維持されますが、既存行は自動で再構築されません。

users.indexed<&User::email>()
.indexed<&User::age>();
users.put(User{2, "bob@example.test", "Bob", 24});
if (const auto bob = users.findBy<&User::email>("bob@example.test")) {
std::cout << bob->name << "\n";
}

文字列の接頭辞クエリを頻繁に行う場合は、prefixIndexed<&Field>() を別に使います。これは等価検索用の通常インデックスを置き換えません。

最後のテーブル操作後に close() すると、プロセス終了前に設定済みのフラッシュ / 同期方針が実行されます。

db->close();
}