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 RoomViewLayoutAccess : IDisposable
{
///
/// チャネル
///
public GrpcChannel Channel { get; private set; } = null;
public RoomViewLayoutCore.RoomViewLayoutCoreClient Client { get; private set; } = null;
public RoomViewLayoutAccess(GrpcChannel channel)
{
Channel = channel;
Client = new RoomViewLayoutCore.RoomViewLayoutCoreClient(Channel);
}
public void Dispose()
{
}
public bool Exists(int pTabID,int pRow,int pCol)
{
return GrpcClient.ExecuteScalarSync(Channel, $"IF EXISTS(SELECT 1 FROM M_RoomViewLayout WHERE TabID = {pTabID} AND Row = {pRow} AND Col = {pCol}) SELECT 1 ELSE SELECT 0") == "1";
}
public async Task ExistsAsync(int pTabID,int pRow,int pCol)
{
return await GrpcClient.ExecuteScalar(Channel, $"IF EXISTS(SELECT 1 FROM M_RoomViewLayout WHERE TabID = {pTabID} AND Row = {pRow} AND Col = {pCol}) SELECT 1 ELSE SELECT 0") == "1";
}
public async Task OutputStream(PagingRequest request)
{
FileGrpcData data = null;
request.Table = "M_RoomViewLayout";
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_RoomViewLayout";
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.RoomViewLayoutGrid, where);
return table.ToDataTable();
}
public async Task GetRoomState(string where)
{
GrpcTable table = await GrpcClient.GetTableAsync(Channel, (int)ETableActionType.RoomViewState, where);
return table.ToDataTable();
}
///
/// 客室状況画面の日別表示データ
///
///
///
public async Task GetRoomViewData(string where)
{
GrpcSet set = await GrpcClient.GetGrpcSet(Channel, (int)ESetActionType.RoomView, where);
return set.ToDataSet();
}
///
/// 同期データ取得
///
///
///
public RoomViewLayoutTable 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 RoomViewLayout GetItem(int pTabID,int pRow,int pCol)
{
RoomViewLayoutTable table = GetData($"TabID = {pTabID} AND Row = {pRow} AND Col = {pCol}");
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)
{
RoomViewLayoutTable 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(RoomViewLayout data)
{
return await Client.AddAsync(data);
}
public DataResult Add(RoomViewLayout data)
{
return Client.Add(data);
}
public async Task UpdateAsync(RoomViewLayout data)
{
return await Client.UpdateAsync(data);
}
public DataResult Update(RoomViewLayout data)
{
return Client.Update(data);
}
///
/// 追加若しくは更新
///
///
///
///
private async Task AddOrUpdateStream(RoomViewLayout 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(RoomViewLayout data)
{
return await AddOrUpdateStream(data, true);
}
///
/// 更新
///
///
///
public async Task UpdateStream(RoomViewLayout 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(RoomViewLayoutTable table)
{
return Client.SetData(table);
}
///
/// バッチ更新
///
///
///
public async Task SetDataStream(RoomViewLayoutTable 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;
}
}
}