Exemplo n.º 1
0
        public int Increment(int itemId, int contextItemId, CounterType type = CounterType.Visits, CounterStoreType store = CounterStoreType.Database) {
            string key = String.Format("{0}.{1}.{2}", itemId, contextItemId, type);
            object counterLock = _locks.GetOrAdd(key, new object());
            lock (counterLock) {
                int counts = 0;
                switch (store) {
                    case CounterStoreType.Database:
                        CounterRecord counter = _repo.Value.Get(r => r.ForItemId == itemId &&
                                                                     r.InContextOfItemId == contextItemId &&
                                                                     r.Type == type);

                        if (counter == null) {
                            counter = new CounterRecord {
                                ForItemId = itemId,
                                InContextOfItemId = contextItemId,
                                Type = type,
                                Count = 0,
                                LastModified = DateTime.Now
                            };
                            _repo.Value.Create(counter);
                            _repo.Value.Flush();
                        }

                        counts = ++counter.Count;
                        counter.LastModified = DateTime.Now;
                        _repo.Value.Flush();
                        break;
                    case CounterStoreType.Session:
                        if (_context.Current() != null && _context.Current().Session != null) {
                            // ReSharper disable PossibleNullReferenceException
                            var dict = _context.Current().Session[SessionKey] as ConcurrentDictionary<string, SerializableCounter>;
                            // ReSharper restore PossibleNullReferenceException
                            SerializableCounter sessionCounter = dict.GetOrAdd(key, new SerializableCounter {
                                ForItemId = itemId,
                                InContextOfItemId = contextItemId,
                                Type = type,
                                Count = 0
                            });
                            counts = ++sessionCounter.Count;
                        }
                        break;
                    default:
                        break;
                }
                return counts;
            }
        }
Exemplo n.º 2
0
        public int GetCounter(int itemId, int contextItemId, CounterType type, CounterStoreType store) {
            int counts = 0;
            switch (store) {
                case CounterStoreType.Database:

                    CounterRecord counter = _repo.Value.Get(r => r.ForItemId == itemId &&
                                                                 r.InContextOfItemId == contextItemId &&
                                                                 r.Type == type);

                    counts = counter == null ? 0 : counter.Count;
                    break;
                case CounterStoreType.Session:
                    if (_context.Current() != null) {
                        string key = String.Format("{0}.{1}.{2}", itemId, contextItemId, type);
                        // ReSharper disable PossibleNullReferenceException
                        var dict = _context.Current().Session[SessionKey] as ConcurrentDictionary<string, SerializableCounter>;
                        // ReSharper restore PossibleNullReferenceException
                        SerializableCounter c;
                        counts = dict.TryGetValue(key, out c) ? c.Count : 0;
                    }
                    break;
                default:
                    break;
            }
            return counts;
        }
Exemplo n.º 3
0
        public void RemoveCounter(int itemId, int contextItemId, CounterType type, CounterStoreType store) {
            string key = String.Format("{0}.{1}.{2}", itemId, contextItemId, type);
            object counterLock = _locks.GetOrAdd(key, new object());
            lock (counterLock) {
                switch (store) {
                    case CounterStoreType.Database:

                        CounterRecord counter = _repo.Value.Get(r => r.ForItemId == itemId &&
                                                                     r.InContextOfItemId == contextItemId &&
                                                                     r.Type == type);

                        if (counter != null) {
                            _repo.Value.Delete(counter);
                            _repo.Value.Flush();
                        }


                        break;
                    case CounterStoreType.Session:
                        if (_context.Current() != null) {
                            // ReSharper disable PossibleNullReferenceException
                            var dict = _context.Current().Session[SessionKey] as ConcurrentDictionary<string, SerializableCounter>;
                            // ReSharper restore PossibleNullReferenceException
                            SerializableCounter c;
                            if (dict != null) {
                                dict.TryRemove(key, out c);
                            }
                        }
                        break;
                    default:
                        break;
                }
            }
        }
Exemplo n.º 4
0
        /// <summary>
        ///     Gets items by the given predicate.
        /// </summary>
        /// <param name = "counterPredicate">Predicate</param>
        /// <returns>List of content items</returns>
        public IEnumerable<IContent> GetItems(Func<dynamic, bool> counterPredicate, Func<dynamic, dynamic> orderBy, CounterStoreType store) {
            IEnumerable<int> ids = Enumerable.Empty<int>();
            switch (store) {
                case CounterStoreType.Database:
                    ids = _repo.Value.Fetch(r => counterPredicate(r) && r.Count > 0)
                        .OrderBy(orderBy)
                        .Select(r => (int)r.ForItemId);
                    break;
                case CounterStoreType.Session:
                    if (_context.Current() != null) {
                        ids = (_context.Current().Session[SessionKey] as ConcurrentDictionary<string, SerializableCounter>)
                            .Values
                            .Where(r => counterPredicate(r) && r.Count > 0)
                            .OrderBy(orderBy).Select(r => (int)r.ForItemId);
                    }
                    ;
                    break;
            }

            return _manager.Query().List().Where(i => ids.Contains(i.Id));
        }