/// <summary> /// 服务端数据结构定义数据 /// </summary> /// <param name="buffer">数据缓冲区</param> internal unsafe DataStructureBuffer(Buffer buffer) { Data = buffer.Array; fixed(byte *dataFixed = Data.Array) { byte *start = dataFixed + Data.Start, read = start + (OperationParameter.Serializer.HeaderSize + IndexIdentity.SerializeSize); Identity = new IndexIdentity(start + OperationParameter.Serializer.HeaderSize); CacheName = AutoCSer.BinarySerialize.DeSerializer.DeSerializeString(ref read, start + *(int *)start); Data.MoveStart((int)(read - start)); } }
/// <summary> /// 删除数据结构信息 /// </summary> /// <param name="cacheName">缓存名称标识</param> /// <param name="identity"></param> private void removeDataStructure(HashString cacheName, ref IndexIdentity identity) { ClientDataStructure dataStructure; Monitor.Enter(cacheNameLock); try { if (CacheNames.TryGetValue(cacheName, out dataStructure) && dataStructure.Identity.Equals(ref identity) == 0) { CacheNames.Remove(cacheName); } } finally { Monitor.Exit(cacheNameLock); } }
/// <summary> /// 删除数据结构信息 /// </summary> /// <param name="cacheName">缓存名称标识</param> /// <param name="onRemove"></param> public override void RemoveDataStructure(string cacheName, Action <ReturnValue <bool> > onRemove) { if (string.IsNullOrEmpty(cacheName)) { onRemove(new ReturnValue <bool> { Type = ReturnType.NullArgument }); return; } try { client.Remove(new OperationParameter.RemoveDataStructure { CacheName = cacheName }, returnValue => { IndexIdentity identity = returnValue.Value; identity.TcpReturnType = returnValue.Type; if (identity.ReturnType == ReturnType.Success) { removeDataStructure(cacheName, ref identity); } if (onRemove != null) { onRemove(new ReturnValue <bool> { TcpReturnType = identity.TcpReturnType, Type = identity.ReturnType, Value = identity.ReturnType == ReturnType.Success }); } }); onRemove = null; } finally { if (onRemove != null) { onRemove(new ReturnValue <bool> { Type = ReturnType.TcpError }); } } }
/// <summary> /// 删除数据结构信息 /// </summary> /// <param name="cacheName">缓存名称标识</param> /// <returns></returns> public async Task <ReturnValue <bool> > RemoveDataStructureTask(string cacheName) { if (string.IsNullOrEmpty(cacheName)) { return new ReturnValue <bool> { Type = ReturnType.NullArgument } } ; IndexIdentity identity = default(IndexIdentity); identity.Set(await client.RemoveAwaiter(new OperationParameter.RemoveDataStructure { CacheName = cacheName })); if (identity.ReturnType == ReturnType.Success) { removeDataStructure(cacheName, ref identity); } return(new ReturnValue <bool> { TcpReturnType = identity.TcpReturnType, Type = identity.ReturnType, Value = identity.ReturnType == ReturnType.Success }); }
/// <summary> /// 设置服务端数据结构索引标识 /// </summary> /// <param name="identity">服务端数据结构索引标识</param> internal unsafe void SetIdentity(IndexIdentity identity) { fixed(byte *bufferFixed = Array.Array) identity.UnsafeSerialize(bufferFixed + (Array.Start + OperationParameter.Serializer.HeaderSize)); }
private void set(ref IndexIdentity identity) { Index = identity.Index; Identity = identity.Identity; }
internal ulong Equals(ref IndexIdentity other) { return((uint)(other.Index ^ Index) | (other.Identity ^ Identity)); }
/// <summary> /// 创建缓存节点后的回调操作 /// </summary> /// <param name="identity"></param> private static void onDataStructureCreatedNull(IndexIdentity identity) { }
/// <summary> /// 服务端数据结构定义信息 /// </summary> /// <param name="cacheName">缓存名称标识</param> /// <param name="identity">数据结构索引标识</param> /// <param name="nodeData">节点序列化数据</param> internal ServerDataStructureBase(string cacheName, IndexIdentity identity, SubArray <byte> nodeData) { CacheName = cacheName; Identity = identity; NodeData = nodeData; }