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; namespace HotelPms.DataAccessGrpc.Client { public class RoomStatusAccess : IDisposable { /// /// チャネル /// public GrpcChannel Channel { get; private set; } = null; public RoomStatusCore.RoomStatusCoreClient Client { get; private set; } = null; public RoomStatusAccess(GrpcChannel channel) { Channel = channel; Client = new RoomStatusCore.RoomStatusCoreClient(Channel); } public void Dispose() { } public bool Exists(int pID) { return GrpcClient.ExecuteScalarSync(Channel, $"IF EXISTS(SELECT 1 FROM M_RoomStatus WHERE ID = {pID}) SELECT 1 ELSE SELECT 0") == "1"; } public async Task ExistsAsync(int pID) { return await GrpcClient.ExecuteScalar(Channel, $"IF EXISTS(SELECT 1 FROM M_RoomStatus WHERE ID = {pID}) SELECT 1 ELSE SELECT 0") == "1"; } public async Task OutputStream(PagingRequest request) { FileGrpcData data = null; request.Table = "M_RoomStatus"; 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_RoomStatus"; 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.RoomStatusMasterGrid, where); return table.ToDataTable(); } public async Task UpdateRoomStatus(DateTime useDate, int roomNo, int status) { GrpcTable table = await GrpcClient.GetTableAsync(Channel, (int)ETableActionType.UpdateRoomStatus, $"{CConvert.ToDateString(useDate)},{roomNo},{status}"); return table.ToDataTable(); } /// /// 同期データ取得 /// /// /// public RoomStatusTable 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 RoomStatus GetItem(int pID) { RoomStatusTable table = GetData($"ID = {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) { RoomStatusTable 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(RoomStatus data) { return await Client.AddAsync(data); } public DataResult Add(RoomStatus data) { return Client.Add(data); } public async Task UpdateAsync(RoomStatus data) { return await Client.UpdateAsync(data); } public DataResult Update(RoomStatus data) { return Client.Update(data); } /// /// 追加若しくは更新 /// /// /// /// private async Task AddOrUpdateStream(RoomStatus 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(RoomStatus data) { return await AddOrUpdateStream(data, true); } /// /// 更新 /// /// /// public async Task UpdateStream(RoomStatus 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(RoomStatusTable table) { return Client.SetData(table); } /// /// バッチ更新 /// /// /// public async Task SetDataStream(RoomStatusTable 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; } } }