//tips
//基本情報理解
関係データベースを編集する際のSQL文ON DELETE句にCASCADEを用いることで更新の場合には参照元における外部キーの値が連鎖更新され、削除の場合には参照元のレコードが連鎖削除される。
INTERSECT:二つの表の中から共通するレコードを抽出するために用いる
RESTRICT:参照整合性が崩れるときに、参照先の更新や削除を制限する
UNIQUE:一意性制約を課すために用いる
共有ロックは、他のトランザクションの共有ロックは許すが占有ロックは許さない。データを参照する時だけにかけるロックの方法で、自分も他の人も見られるけど、変更はできない見るだけ用。
占有ロックは、他のトランザクションの共有ロックも占有ロックも許さない。データを更新するときにかけるロックの方法で、ロックした人は、中身を見て変更できるが他の人は見れない。
Xが表内の特定行に対して共有ロックを獲得している場合、Yは特定行を含む表全体の占有ロックを獲得することはできない。
データベースの障害には3種類あり、
トランザクション障害:
デットロック検出、プログラムによる異常検出、プログラムの強制終了など
システム障害:
DBMS異常終了、OSの異常終了、CPU、メモリなど処理系ハード障害など
媒体障害:
ディスク装置障害など
媒体障害はハードでの異常となる。
ディスク装置や媒体の交換、バックアップ媒体からデータベースのリストア、更新後ログのロールフォワード復旧という形で対応することが多い。
2相コミットプロトコルは、複数のデータベースサイトに対する更新を制御するもので、各データベース(従サイト)に実行指示を出し更新可能かどうかを問い合わせ、全てのサイトが更新可能であれば全サイトにコミット指示を出し、一つでも更新が不可能であれば全サイトにロールバック指示を出す。
トランザクションを他のサイトに更新可能かどうかを確認する第1相と、更新を確定する第2相の2つのフェーズに分け、各サイトのトランザクションをコミットもロールバックも可能な中間状態(セキュア状態)にした後、全サイトがコミットできる場合だけトランザクションをコミットするという方法。
https://atmarkit.itmedia.co.jp/ait/articles/1703/01/news203_2.html
//unity/shopify連動
よく考えてみるとすでにproductsはList<Product>なので、ShopifyBuy.Init(accessToken, storeDomain);までをstartメソッドに残し、クリックした対象から商品idまたはリスト内のインデックスを入手し、大元のproductsリストを用いて、その特定productに対してcart.LineItems.AddOrUpdate(firstProductFirstVariant, 1);などのカートへ入れる処理を行えば良さそう。
cart.LineItems.AddOrUpdateの引数を見てみるとProductVariant型を取る必要があるようなので、これは対象の商品が確定した後にidである[0]を指定すれば良い。
下記のようにproductを引数に取る方法もあるがdictionaryを第二引数に必要とし、手間がかかるためvariantのものを使用することにした。
AddOrUpdate (Product product, Dictionary< string, string > selectedOptions, long? quantity=null, Dictionary< string, string > customAttributes=null)
https://shopify.github.io/unity-buy-sdk/class_shopify_1_1_unity_1_1_s_d_k_1_1_cart_line_items.html#a7283bb4d1e802609c5e91e533158eab2
商品を選択するために下記のようにした。Checkout(int x)のように関数にし、商品の購入ボタンのBUYClickスクリプトに商品のリストインデックスを入れ、UnityBuySDKDemo.Checkout(1);のように設定することで、購入商品を選択してカートに入れチェックアウトのページを表示させることができた。
public class UnityBuySDKDemo : MonoBehaviour
{
Cart cart;
List<Product> mylist=null;
void Start()
{
// Add your access token and store domain
string accessToken = "c2c7528ea957b4c13a41037700b3efe5";
string storeDomain = "nakiunity.myshopify.com";
// Initialize the Unity Buy SDK
ShopifyBuy.Init(accessToken, storeDomain);
ShopifyBuy.Client().products((products, error, after) =>
{
if (error != null)
{
Debug.Log("Encountered an SDK Error");
return;
}
cart = ShopifyBuy.Client().Cart();
mylist = products;
});
}
public void Checkout(int x)
{
List<ProductVariant> firstProductVariants = (List<ProductVariant>)mylist[x].variants();
ProductVariant firstProductFirstVariant = firstProductVariants[0];
cart.LineItems.AddOrUpdate(firstProductFirstVariant, 1);
// The following line will get a checkout url using the above line items and open the url in browser
cart.CheckoutWithWebView(
success: () => {
Debug.Log("User finished purchase/checkout!");
},
cancelled: () => {
Debug.Log("User cancelled out of the web checkout.");
},
failure: (e) => {
Debug.Log("Something bad happened - Error: " + e);
}
);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BUYClick : MonoBehaviour
{
[SerializeField]
GameObject comptext;
[SerializeField]
UnityBuySDKDemo UnityBuySDKDemo;
public void Buythis()
{
Debug.Log("buy");
comptext.SetActive(true);
UnityBuySDKDemo.Checkout(1);
}
}
BUYClickは商品ごとに名前を変えて付ければ良い。
カートに入れチェックアウトの画面まで行き、再度unityに戻ってアイテムを追加したい場合についても考えてみる。現状は一回のチェックアウト画面で1商品のみ扱えるのでカートから離れても、カート内情報を保持し、カートに商品を加算できるようにする。
cart.LineItems.AddOrUpdate(firstProductFirstVariant, 3);の数量を変更し、一度に注文する量を増やすことができることがわかった。
この数量部分をクリックごとに1加算する内容への変更を考える。Getで該当商品idの数量を取得し、1を加算してみた。
cart.LineItems.AddOrUpdate(firstProductFirstVariant, cart.LineItems.Get(x.ToString()).Quantity+1)
NullReferenceException: Object reference not set to an instance of an objectのエラーが発生。Getで使用するidとリストのidとは異なるのか。
GETの引数にvariantが取れるものを見つけたのでそちらに変更。
Shopify.Unity.SDK.CartLineItems.Get (ProductVariant variant)
cart.LineItems.AddOrUpdate(firstProductFirstVariant, cart.LineItems.Get(firstProductFirstVariant).Quantity+1);//firstProductFirstVariant,1
これでもNullReferenceException: Object reference not set to an instance of an objectと出てしまう。
色々探してみるとApps can no longer set inventory using inventory_quantity or inventory_quantity_adjustmentとの記載がProduct Variantのページにあるが、カート内情報についてではなさそう。
https://shopify.dev/api/admin/rest/reference/products/product-variant
https://shopify.dev/api/examples/product-inventory
https://shopify.dev/api/admin/graphql/reference/products-and-collections/productvariant#samples
途中で気づいたが下記のようなjsonの構造を見ているとfirstProductVariants[0]はidのことを指しているのではなく商品バリエーションの一つとして商品を選択していることが分かった。
"data": {
"product": {
"title": "Tシャツ",
"variants": {
"edges": [
{
"node": {
"title": "S",
"displayName": "Tシャツ - S"
}
},
{
"node": {
"title": "L",
"displayName": "Tシャツ - L"
}
}
]
だが、firstProductFirstVariant.inventory_quantityとしてもエラーとして取り扱われてしまう。
Cartの中のline_item objectについてもう少し見ていこうか。手がかりがなかったら数字をローカル情報として保存していくplayerprefでの方法を考えてみる
https://shopify.dev/api/liquid/objects/line_item
https://shopify.github.io/unity-buy-sdk/class_shopify_1_1_unity_1_1_cart.html
https://shopify.github.io/unity-buy-sdk/class_shopify_1_1_unity_1_1_s_d_k_1_1_cart_line_items.html