保存独立KV用户服务、固定会话存档与原业务接线,以及C3d资料缓存和C3e本人统计写。 保留原PF/AGG路线、业务公式和时序;榜单读取、好友资料、公告、匹配及首场景闸仍待完成。 验证:ServiceHost两条件各33组646断言;Unity CLI Loop编译0错误269警告。 包含相关方案、评审裁决、测试及状态文档。未操作服务器、正式账号或打包。
53 lines
2.7 KiB
C#
53 lines
2.7 KiB
C#
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using game.PlayerDataStorage;
|
|
|
|
internal static class KVMgr
|
|
{
|
|
internal static PlayerKVKeyReadResult ReadKV(PlayerKVGameSessionHandle handle, string key)
|
|
{
|
|
if (PlayerKVGameLoadGuard.Reject(PlayerKVGuardPoint.ReadLocal))
|
|
return new PlayerKVKeyReadResult(PlayerKVKeyReadError.LoadGuardActive, handle);
|
|
if (handle == null || !KVSnapshot.ValidKey(key))
|
|
return new PlayerKVKeyReadResult(PlayerKVKeyReadError.InvalidInput, handle);
|
|
var read = handle.ReadLocalSnapshot();
|
|
if (!read.Success)
|
|
return new PlayerKVKeyReadResult(read.Error == PlayerKVLocalReadError.StaleOrClosing
|
|
? PlayerKVKeyReadError.StaleOrClosing : PlayerKVKeyReadError.NotReady, handle);
|
|
var found = read.Data.TryGetValue(key, out var value);
|
|
return new PlayerKVKeyReadResult(PlayerKVKeyReadError.None, handle, found, value);
|
|
}
|
|
|
|
internal static PlayerKVEditResult WriteKV(PlayerKVGameSessionHandle handle,
|
|
string key, string value, bool remoteStore = true)
|
|
{
|
|
if (PlayerKVGameLoadGuard.Reject(PlayerKVGuardPoint.Update))
|
|
return new PlayerKVEditResult(new PlayerKVStateResult(PlayerKVChangeError.Blocked));
|
|
if (handle == null)
|
|
return new PlayerKVEditResult(new PlayerKVStateResult(PlayerKVChangeError.Validation));
|
|
return handle.Update(key, value, remoteStore);
|
|
}
|
|
|
|
internal static Task<PlayerKVFlushResult> FlushKVAsync(PlayerKVGameSessionHandle handle,
|
|
CancellationToken waitToken = default)
|
|
{
|
|
if (PlayerKVGameLoadGuard.Reject(PlayerKVGuardPoint.Sync))
|
|
return Task.FromResult(new PlayerKVFlushResult(0, 0, 1, 0, PlayerKVError.Cancelled,
|
|
handle == null ? PlayerKVSyncStatus.NotLoaded : handle.Status));
|
|
if (handle == null)
|
|
return Task.FromResult(new PlayerKVFlushResult(0, 0, 1, 0, PlayerKVError.Validation, PlayerKVSyncStatus.NotLoaded));
|
|
return handle.FlushAsync(waitToken);
|
|
}
|
|
|
|
internal static Task<PlayerKVTicketResult> WaitForKVTicketAsync(PlayerKVGameSessionHandle handle,
|
|
PlayerKVSyncTicket ticket, CancellationToken waitToken = default)
|
|
{
|
|
if (PlayerKVGameLoadGuard.Reject(PlayerKVGuardPoint.Sync))
|
|
return Task.FromResult(new PlayerKVTicketResult(PlayerKVTicketStatus.Blocked, PlayerKVError.Cancelled,
|
|
handle == null ? PlayerKVSyncStatus.NotLoaded : handle.Status));
|
|
if (handle == null)
|
|
return Task.FromResult(new PlayerKVTicketResult(PlayerKVTicketStatus.Blocked, PlayerKVError.Validation, PlayerKVSyncStatus.NotLoaded));
|
|
return handle.WaitForTicketAsync(ticket, waitToken);
|
|
}
|
|
}
|