using Google.Protobuf; using Grpc.Core; using Grpc.Net.Client; using HotelPms.Data; using HotelPms.Data.Client; using HotelPms.Data.Common; using HotelPms.Data.Common.Pagination; using HotelPms.Data.Master; using System.Data; using System.Text.Json; namespace HotelPms.DataAccessGrpc.Client { public class OptionAccess : IDisposable { /// /// チャネル /// public GrpcChannel Channel { get; private set; } = null; public OptionCore.OptionCoreClient Client { get; private set; } = null; public OptionAccess(GrpcChannel channel) { Channel = channel; Client = new OptionCore.OptionCoreClient(Channel); } public void Dispose() { } public bool Exists(string pType,string pKey) { return GrpcClient.ExecuteScalarSync(Channel, $"IF EXISTS(SELECT 1 FROM S_Option WHERE Type = N'{pType}' AND Key = N'{pKey}') SELECT 1 ELSE SELECT 0") == "1"; } public async Task ExistsAsync(string pType,string pKey) { return await GrpcClient.ExecuteScalar(Channel, $"IF EXISTS(SELECT 1 FROM S_Option WHERE Type = N'{pType}' AND Key = N'{pKey}') SELECT 1 ELSE SELECT 0") == "1"; } public async Task OutputStream(PagingRequest request) { FileGrpcData data = null; request.Table = "S_Option"; 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 = "S_Option"; string json = JsonSerializer.Serialize(request); return await Client.GetDataAsync(GrpcClient.CreateDataRequest(1, json)); } public DataTable GetMasterGridData(string where) { GrpcTable table = GrpcClient.GetTable(Channel, (int)ETableActionType.BuildingMasterGrid, where); return table.ToDataTable(); } /// /// 同期データ取得 /// /// /// public OptionTable 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 Option GetItem(string pType,string pKey) { OptionTable table = GetData($"Type = N'{pType}' AND Key = N'{pKey}'"); 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) { OptionTable 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(Option data) { return await Client.AddAsync(data); } public DataResult Add(Option data) { return Client.Add(data); } public async Task UpdateAsync(Option data) { return await Client.UpdateAsync(data); } public DataResult Update(Option data) { return Client.Update(data); } /// /// 追加若しくは更新 /// /// /// /// private async Task AddOrUpdateStream(Option 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(Option data) { return await AddOrUpdateStream(data, true); } /// /// 更新 /// /// /// public async Task UpdateStream(Option 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(OptionTable table) { return Client.SetData(table); } /// /// バッチ更新 /// /// /// public async Task SetDataStream(OptionTable 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; } } }