using Google.Protobuf; using Grpc.Core; using Grpc.Net.Client; using HotelPms.Data.Client; using HotelPms.Data.Common; using HotelPms.Data.Master; using HotelPms.Share.Util; using System; using System.Data; using System.Threading.Tasks; using HotelPms.Data; using System.Collections.Generic; using HotelPms.Data.Common.Pagination; using System.Text.Json; using System.Threading; using System.Security.Cryptography; namespace HotelPms.DataAccessGrpc.Client; public class ItemAccess : IDisposable { /// /// チャネル /// public GrpcChannel Channel { get; private set; } = null; public ItemCore.ItemCoreClient Client { get; private set; } = null; public ItemAccess(GrpcChannel channel) { Channel = channel; Client = new ItemCore.ItemCoreClient(Channel); } public void Dispose() { } public bool Exists(string pID) { return GrpcClient.ExecuteScalarSync(Channel, $"IF EXISTS(SELECT 1 FROM M_Item WHERE ID = N'{pID}') SELECT 1 ELSE SELECT 0") == "1"; } public async Task ExistsAsync(string pID) { return await GrpcClient.ExecuteScalar(Channel, $"IF EXISTS(SELECT 1 FROM M_Item WHERE ID = N'{pID}') SELECT 1 ELSE SELECT 0") == "1"; } public async Task OutputStream(PagingRequest request) { FileGrpcData data = null; request.Table = "M_Item"; string json = JsonSerializer.Serialize(request); using (var call = Client.OutputStream(GrpcClient.CreateDataRequest(2, json))) { var reaponseStream = call.ResponseStream; //データの取得 while (await reaponseStream.MoveNext(CancellationToken.None)) { data = reaponseStream.Current; } } return data; } public async Task GetPageData(PagingRequest request) { request.Table = "M_Item"; string json = JsonSerializer.Serialize(request); return await Client.GetDataAsync(GrpcClient.CreateDataRequest(1, json)); } /// /// 部屋タイプの基本料金を返す /// /// /// /// /// public async Task GetBaseItem(int roomTypeID, int personCount, string useDate) { ItemTable table = await Client.GetDataAsync(GrpcClient.CreateDataRequest(3, $"{roomTypeID},{personCount},{useDate}")); if (table == null || table.ErrNo != 0 || table.Rows.Count == 0) { return null; } return table.Rows[0]; } public DataTable GetMasterGridData(string where) { GrpcTable table = GrpcClient.GetTable(Channel, (int)ETableActionType.BuildingMasterGrid, where); return table.ToDataTable(); } /// /// 同期データ取得 /// /// /// public ItemTable GetData(string where) { return Client.GetData(GrpcClient.CreateDataRequest(0, where)); } public async Task GetDataAsync(string where) { return await Client.GetDataAsync(GrpcClient.CreateDataRequest(0, where)); } public Item GetItem(string pID) { ItemTable table = GetData($"ID = N'{pID}'"); if (table == null || table.ErrNo != 0 || table.Rows.Count == 0) { return null; } return table.Rows[0]; } /// /// データ取得 /// /// public async Task GetItemAsync(string pID) { ItemTable table = await GetDataAsync($"ID = N'{pID}'"); if(table == null || table.ErrNo != 0 || table.Rows.Count == 0) { return null; } return table.Rows[0]; } public async Task GetDataStream() { return await GetDataStream(string.Empty); } /// /// データ取得 /// /// public async Task GetDataStream(string where) { ItemTable table = null; using (var call = Client.GetDataStream()) { await call.RequestStream.WriteAsync(GrpcClient.CreateDataRequest(0, where)); await call.RequestStream.CompleteAsync(); // Finish call and report results //データの取得 await foreach (var message in call.ResponseStream.ReadAllAsync()) { table = message; break; } } return table; } public async Task AddAsync(Item data) { return await Client.AddAsync(data); } public DataResult Add(Item data) { return Client.Add(data); } public async Task UpdateAsync(Item data) { return await Client.UpdateAsync(data); } public DataResult Update(Item data) { return Client.Update(data); } /// /// 追加若しくは更新 /// /// /// /// private async Task AddOrUpdateStream(Item data, bool add) { DataResult result = null; using (var call = add ? Client.AddStream() : Client.UpdateStream()) { await call.RequestStream.WriteAsync(data); await call.RequestStream.CompleteAsync(); // Finish call and report results //データの取得 await foreach (var message in call.ResponseStream.ReadAllAsync()) { result = message; break; } } return result; } /// /// 追加 /// /// /// public async Task AddStream(Item data) { return await AddOrUpdateStream(data, true); } /// /// 更新 /// /// /// public async Task UpdateStream(Item data) { return await AddOrUpdateStream(data, true); } public DataResult Remove(string where) { SqlWhere data = new SqlWhere() { Data = ByteString.CopyFromUtf8(where) }; return Client.Remove(data); } public async Task RemoveAsync(string where) { SqlWhere data = new SqlWhere() { Data = ByteString.CopyFromUtf8(where) }; return await Client.RemoveAsync(data); } /// /// 削除 /// /// /// public async Task RemoveStream(string where) { DataResult result = null; SqlWhere data = new SqlWhere() { Data = ByteString.CopyFromUtf8(where) }; using (var call = Client.RemoveStream()) { await call.RequestStream.WriteAsync(data); await call.RequestStream.CompleteAsync(); // Finish call and report results //データの取得 await foreach (var message in call.ResponseStream.ReadAllAsync()) { result = message; break; } } return result; } public DataResult SetData(ItemTable table) { return Client.SetData(table); } /// /// バッチ更新 /// /// /// public async Task SetDataStream(ItemTable table) { DataResult result = null; using (var call = Client.SetDataStream()) { await call.RequestStream.WriteAsync(table); await call.RequestStream.CompleteAsync(); // Finish call and report results //データの取得 await foreach (var message in call.ResponseStream.ReadAllAsync()) { result = message; break; } } return result; } }