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の場合、オブジェクトを完全に消去します。処理結果は空となります。