/// <summary> /// For Inproc only /// </summary> /// <param name="entry"></param> /// <returns></returns> internal static EventCacheItem ConvertToItem(EventCacheEntry entry) { Byte[] objectValue = null; if (entry != null) { EventCacheItem item = new EventCacheItem(); item.CacheItemPriority = (CacheItemPriority)entry.Priority; item.CacheItemVersion = new CacheItemVersion(entry.Version); item.Group = entry.Group; item.SubGroup = entry.SubGroup; if (entry.Value != null) { UserBinaryObject ubObject = entry.Value as UserBinaryObject; if (ubObject != null) { objectValue = ubObject.GetFullObject(); item.SetValue(objectValue); } else { item.SetValue(entry.Value); } } item.EntryType = entry.EntryType; return(item); } return(null); }
internal EventCacheItem ConvertToEventCacheItem(Common.Protobuf.EventCacheItem entry) { EventCacheItem cacheItem = new EventCacheItem(); try { cacheItem.Group = entry.group; cacheItem.SubGroup = entry.subGroup; cacheItem.CacheItemVersion = new CacheItemVersion(); cacheItem.CacheItemVersion.Version = entry.itemVersion; cacheItem.CacheItemPriority = (CacheItemPriority)entry.priority; //cacheItem.ResyncOptions = new Runtime.Caching.ResyncOptions(false, ""); cacheItem.Flagmap = new Common.BitSet((byte)entry.flagMap); if (entry.value.Count > 0) { List <byte[]> val = entry.value; UserBinaryObject ubObject = UserBinaryObject.CreateUserBinaryObject(entry.value.ToArray()); if (ubObject != null) { cacheItem.SetValue(ubObject.GetFullObject()); } } cacheItem.EntryType = Util.MiscUtil.ProtoItemTypeToEntryType(entry.itemType); } catch (System.Exception e) { throw e; } return(cacheItem); }
internal static EventCacheItem ConvertToEventEntry(Alachisoft.NCache.Common.Protobuf.EventCacheItem cacheItem) { Byte[] objectValue = null; if (cacheItem == null) { return(null); } EventCacheItem item = new EventCacheItem(); item.CacheItemPriority = (CacheItemPriority)cacheItem.priority; item.CacheItemVersion = new CacheItemVersion(cacheItem.itemVersion); item.Group = String.IsNullOrEmpty(cacheItem.group) ? null : cacheItem.group; item.SubGroup = String.IsNullOrEmpty(cacheItem.subGroup) ? null : cacheItem.subGroup; item.Flagmap = new Common.BitSet((byte)cacheItem.flagMap); if (cacheItem.value != null && cacheItem.value.Count > 0) { UserBinaryObject ubObject = UserBinaryObject.CreateUserBinaryObject(cacheItem.value.ToArray()); objectValue = ubObject.GetFullObject(); item.SetValue(objectValue); } item.EntryType = NCache.Util.MiscUtil.ProtoItemTypeToEntryType(cacheItem.itemType); return(item); }
/// <summary> /// TheadSafe and no locks internally /// </summary> /// <param name="key"></param> /// <param name="eventType">Should contain one type i.e. should not be used as a flag. /// Every EventType should be executed from another thread</param> /// <param name="item"></param> /// <param name="oldItem"></param> /// <param name="reason"></param> /// <param name="_notifyAsync"></param> /// <param name="eventhandle"></param> internal void RaiseSelectiveCacheNotification(string key, EventType eventType, EventCacheItem item, EventCacheItem oldItem, CacheItemRemovedReason reason, bool _notifyAsync, EventHandle eventhandle, EventDataFilter dataFilter) { try { ResourcePool poolID = null; CacheEventArg arg = null; var bitSet = new BitSet(); if (_cache.SerializationFormat == Common.Enum.SerializationFormat.Json) { bitSet.SetBit(BitSetConstants.JsonData); } if (item != null) { item.SetValue(_cache.SafeDeserialize <object>(item.GetValue <object>(), _cache.SerializationContext, bitSet, UserObjectType.CacheItem)); } if (oldItem != null) { oldItem.SetValue(_cache.SafeDeserialize <object>(oldItem.GetValue <object>(), _cache.SerializationContext, bitSet, UserObjectType.CacheItem)); } if ((eventType & EventType.ItemUpdated) != 0) { poolID = _selectiveUpdateEventIDPool; } else if ((eventType & EventType.ItemRemoved) != 0) { poolID = _selectiveRemoveEventIDPool; } arg = CreateCacheEventArgument(dataFilter, key, _cacheName, eventType, item, oldItem, reason); if (poolID == null) { return; } CacheDataNotificationCallback callback = poolID.GetResource((short)eventhandle.Handle) as CacheDataNotificationCallback; if (callback == null) //Can occur if Unregistered concurrently { return; } if (_notifyAsync) { System.Threading.ThreadPool.QueueUserWorkItem(waitC, new object[] { callback, key, arg }); //Faster and better } else { callback.Invoke(key, arg); } } catch (Exception ex) { if (_logger != null && _logger.IsErrorEnabled) { _logger.CriticalInfo(ex.ToString()); } } }
/// <summary> /// TheadSafe and no locks internally /// </summary> /// <param name="key"></param> /// <param name="eventType">Should contain one type i.e. should not be used as a flag. /// Every EventType should be executed from another thread</param> /// <param name="item"></param> /// <param name="oldItem"></param> /// <param name="reason"></param> /// <param name="notifyAsync"></param> internal void RaiseGeneralCacheNotification(string key, EventType eventType, EventCacheItem item, EventCacheItem oldItem, CacheItemRemovedReason reason, bool notifyAsync) { try { object[] registeredDiscriptors = null; ResourcePool eventPool = GetEventPool(EventsUtil.GetEventTypeInternal(eventType)); if (eventPool != null) { registeredDiscriptors = eventPool.GetAllResourceKeys(); } if (registeredDiscriptors != null && registeredDiscriptors.Length > 0) { for (int i = 0; i < registeredDiscriptors.Length; i++) { CacheEventDescriptor discriptor = registeredDiscriptors[i] as CacheEventDescriptor; if (discriptor == null) { continue; } var bitSet = new BitSet(); if (_cache.SerializationFormat == Common.Enum.SerializationFormat.Json) { bitSet.SetBit(BitSetConstants.JsonData); } if (item != null) { item.SetValue(_cache.SafeDeserialize <object>(item.GetValue <object>(), _cache.SerializationContext, bitSet, UserObjectType.CacheItem)); } if (oldItem != null) { oldItem.SetValue(_cache.SafeDeserialize <object>(oldItem.GetValue <object>(), _cache.SerializationContext, bitSet, UserObjectType.CacheItem)); } var arg = CreateCacheEventArgument(discriptor.DataFilter, key, _cacheName, eventType, item, oldItem, reason); arg.Descriptor = discriptor; if (notifyAsync) { #if !NETCORE discriptor.CacheDataNotificationCallback.BeginInvoke(key, arg, asyn, null); #elif NETCORE //TODO: ALACHISOFT (BeginInvoke is not supported in .Net Core thus using TaskFactory) TaskFactory factory = new TaskFactory(); Task task = factory.StartNew(() => discriptor.CacheDataNotificationCallback(key, arg)); #endif } else { discriptor.CacheDataNotificationCallback.Invoke(key, arg); } } } } catch (Exception ex) { if (_logger != null && _logger.IsErrorEnabled) { _logger.CriticalInfo(ex.ToString()); } } }