public ElementDailyDataRange SelectDailyData(String ticker, DateTime dateFrom, DateTime dateTo)
        {
            ElementDailyDataRange tempRes = SelectDailyData(ticker);

            DailyDataWrapper[] tempArr = (from ddw in tempRes.DailyData where ddw.Day >= dateFrom && ddw.Day <= dateTo select ddw).ToArray <DailyDataWrapper>();

            ElementDailyDataRange result;

            if (tempArr.Length > 0)
            {
                result = new ElementDailyDataRange(ticker, tempArr, tempArr[0].Day, tempArr[tempArr.Length - 1].Day);

                if (LoggerFactory.AppLogger.IsTraceEnabled)
                {
                    LoggerFactory.AppLogger.Trace("[DataProviderProxy.SelectDailyData] Loaded records for " + ticker + " " + tempArr.Length + " " + result.DateFrom + " " + result.DateTo);
                }
            }
            else
            {
                LoggerFactory.AppLogger.Warn("[DataProviderProxy.SelectDailyData] No data for period for " + ticker + " " + dateFrom + " " + dateTo);

                result = new ElementDailyDataRange(ticker, EmptyArrayTemplate <DailyDataWrapper> .Instance, DateTime.MaxValue, DateTime.MaxValue);
            }

            return(result);
        }
        public ElementDailyDataRange SelectDailyData(String ticker)
        {
            String cacheItemKey = String.Format("[SelectDailyData][{0}]", ticker);

            selectDailyDataLock.AcquireReaderLock(dataProviderLockTimeout);

            ElementDailyDataRange result = null;

            try
            {
                result = (ElementDailyDataRange)DataCache.Instance.Get(cacheItemKey);

                if (null == result)
                {
                    //////////////////////////////////////////////////////////////////
                    /// no data in cache - need to load it, but first check it again
                    ///

                    LockCookie lockCookie = selectDailyDataLock.UpgradeToWriterLock(dataProviderLockTimeout);

                    try
                    {
                        result = (ElementDailyDataRange)DataCache.Instance.Get(cacheItemKey);

                        if (null == result)
                        {
                            DailyData[] tempRes = (new ItemsDataProvider()).LoadItemDailyData(ticker);

                            if (tempRes.Length > 0)
                            {
                                result = new ElementDailyDataRange(ticker, WrapperUtilities.Convert(tempRes), tempRes[0].Day, tempRes[tempRes.Length - 1].Day);

                                if (LoggerFactory.AppLogger.IsTraceEnabled)
                                {
                                    LoggerFactory.AppLogger.Trace("[DataProviderProxy.SelectDailyData] Loaded records for " + ticker + " " + tempRes.Length + " " + result.DateFrom + " " + result.DateTo);
                                }

                                DataCache.Instance.Add(cacheItemKey, result);
                            }
                            else
                            {
                                LoggerFactory.AppLogger.Warn("[DataProviderProxy.SelectDailyData] No data for " + ticker);

                                result = new ElementDailyDataRange(ticker, EmptyArrayTemplate <DailyDataWrapper> .Instance, DateTime.MaxValue, DateTime.MaxValue);

                                //////////////////////////////////////////////////////
                                /// do not add empty item to cache
                                ///
                            }
                        }
                    }
                    finally
                    {
                        selectDailyDataLock.DowngradeFromWriterLock(ref lockCookie);
                    }
                }
            }
            finally
            {
                selectDailyDataLock.ReleaseReaderLock();
            }

            return(result);
        }