6. オブジェクトストレージ¶
ここではオブジェクトストレージの利用方法について説明します。
6.1. バケットの取得¶
NEC BaaS Embedded SDKではサーバへのバケットの生成はサポートしていないため、事前にデベロッパーコンソールなどから該当のバケットを作成しておきます。
オブジェクトのクエリ操作などにはバケットが必要になります。 以下のようにオブジェクトバケットのインスタンスを生成します。
// バケットのインスタンス作成
NbObjectBucket bucket1(service1, "bucketName");
6.2. オブジェクトの追加¶
オブジェクトを追加するには、まずインスタンスを生成します。 コンストラクタの引数にNbServiceとバケット名を渡します。
保存先のバケットのインスタンスを生成済みの場合、NewObject()を使用することもできます。
// オブジェクトの生成
NbObject object1(service1, "bucketName");
NbObject object2 = bucket1.NewObject();
オブジェクトをサーバに保存するには、Save() メソッドを呼び出します。 成功した場合、savedObjectにはサーバに保存されたオブジェクトのインスタンスが取得できます。
// オブジェクトの保存
NbResult<NbObject> resultSave = object1.Save();
if(resultSave.IsSuccess()) {
// Save成功
NbObject savedObject = resultSave.GetSuccessData();
} else {
// Save失敗
}
6.2.1. オブジェクトへのデータ設定¶
オブジェクトには以下の型の値を設定することができます。
- int, unsigned int
- int64_t, uint64_t
- double
- bool
- std::string
- NbJsonObject
- NbJsonArray
[]演算子では、プリミティブ型の値を設定できます。
NbObject nbobject(service1, "bucketName");
nbobject["keyString"] = "string";
nbobject["keyInt"] = 1000;
nbobject["keyDouble"] = 10.1;
nbobject["keyBool"] = true;
NbJsonObject, NbJsonArrayはJSON オブジェクトおよび配列に相当します。 これらを設定する場合、それぞれPutJsonObject()、PutJsonArray()を使用します。 NbJSONObject, NbJSONArray は入れ子にすることが可能です。
以下に例を示します。
NbJsonObject jsonObj1;
NbJsonArray jsonAry1;
// JsonArrayをJsonObjectに加える
jsonObj1["keyJsonObjString"] = "jsonObjectString";
jsonAry1[0] = "jsonArrayString";
jsonObj1.PutJsonArray("jsonAry1", jsonAry1);
// NbJsonObjectをNbObjectに加える
nbobject.PutJsonObject("keyJsonObj1", jsonObj1);
上記の処理の結果、NbObjectには以下のようなJSONが格納されます。
{
"keyBool":true,
"keyDouble":10.1,
"keyInt":1000,
"keyJsonObj1":
{
"jsonAry1":["jsonArrayString"],
"keyJsonObjString":"jsonObjectString"
},
"keyString":"string"
}
6.3. アクセス制御¶
オブジェクト単位でアクセス制御を行うことができます。
アクセス制御には、ACLクラスを使用します。NbObject の SetAcl() で ACL を設定します。 ACLにはアクセスを許可するユーザID、グループのエントリを追加します。 ユーザIDはユーザ生成時にランダムに割り当てられる文字列です グループ名は管理者がグループ追加時に決定する"g:"で始まる文字列です
- SetRead()
- SetWrite()
- SetCreate()
- SetUpdate()
- SetDelete()
- SetOwnder()
NbAcl acl;
acl.SetOwner("ownerId");
acl.SetRead({"userId_1", "g:groupId_1"});
acl.SetWrite({"userId_2", "g:groupId_2"});
NbObject object4(service1, "bucketName");
object4.SetAcl(acl);
上記の処理の結果、オブジェクトには以下のようなACLが設定されます。
{
"admin":[],
"c":[],
"d":[],
"owner":"ownerId",
"r":["g:groupId_1","userId_1"],
"u":[],
"w":["g:groupId_2","userId_2"]
}
注釈
OwnerにはユーザID1件のみが指定できます。その他は複数のユーザ、グループが指定可能です。
またACLを生成するメソッドを使用することもできます。
// anonymousアクセス(R/W/Admin)可能な ACL を生成する
// ログインしていないユーザでも自由にアクセス可能
NbAcl anonymousAcl = NbAcl::CreateAclForAnonymous();
// Authenticatedアクセス(R/W/Admin)可能な ACL を生成する
// ログインしたユーザであれば自由にアクセス可能
NbAcl authenticatedAcl = NbAcl::CreateAclForAuthenticated();
6.4. オブジェクトの更新¶
オブジェクトを更新するには、NbObject の Save() メソッドを使用します。
最初にクエリなどでNbObject のインスタンスを取得し、 オブジェクトに値を設定して Save() を呼び出すという流れになります。
また、PartUpdateObject()を使用することもできます。 引数にNbJsonObjectをとるので、一部のフィールドのみを更新する用途に適しています。
NbObject object = bucket1.NewObject();
object["keyA"] = "save";
// オブジェクトの新規作成
NbResult<NbObject> resultSave = object.Save();
if(resultSave.IsSuccess()) {
NbObject savedObject = resultSave.GetSuccessData();
std::cout << "[Save] keyA : " << savedObject["keyA"] << std::endl;
savedObject["keyA"] = "save2";
// オブジェクトの更新
NbResult<NbObject> resultSave2 = savedObject.Save();
if(resultSave2.IsSuccess()) {
NbObject savedObject2= resultSave2.GetSuccessData();
std::cout << "[Update] keyA : " << savedObject2["keyA"] << std::endl;
// 部分更新で指定するNbJsonObjectを生成
NbJsonObject updateData;
updateData["keyA"] = "partUpdate";
// オブジェクトの "keyA"を部分更新
NbResult<NbObject> resultUpdate = savedObject2.PartUpdateObject(updateData);
if (resultUpdate.IsSuccess()) {
NbObject updatedObject = resultUpdate.GetSuccessData();
std::cout << "[PartUpdate] keyA : " << updatedObject["keyA"] << std::endl;
}
}
}
この結果、KeyAに対するValueは以下のように更新されます。
[Save] keyA : "save"
[Update] keyA : "save2"
[PartUpdate] keyA : "partUpdate"
注釈
PartUpdateObject()では、サーバに保存されていないオブジェクトを更新することはできません。Save()を使用してください。
6.5. オブジェクトの削除¶
オブジェクトを削除するには、NbObject の DeleteObject() メソッドを使用します。
更新の場合と同様最初にクエリを行って NbObject のインスタンスを取得し、 その後 DeleteObject() を呼び出すという流れになります。
NbResult<NbObject> resultDelete = updatedObject.DeleteObject(false);
第一引数がtrueの場合、オブジェクトに削除マークを付与します。後からクエリでオブジェクトの情報を参照することができます。処理結果には更新されたオブジェクトが格納されます。 falseの場合、オブジェクトを完全に消去します。処理結果は空となります。