public virtual JsonResult CounterData(string sd, string ed, int cc, int cn, int cs, int ci, int ced, string series)
        {
            CounterDataParameters parameters = new CounterDataParameters(sd, ed, cc, cn, cs, ci, ced, series);

            List <object> allSeriesData = new List <object>();
            DateTime      dt            = DateTime.Now;

            List <CounterSeriesData> allCounterSeriesData = parameters.Sources.AsParallel().SelectMany(
                source => parameters.Instances.AsParallel().SelectMany(
                    instance => parameters.ExtendedDatas.AsParallel().SelectMany(
                        extData =>
                        CountersDatabase.Instance.GetCounterData(parameters.BeginDate, parameters.EndDate,
                                                                 parameters.CounterCategoryId,
                                                                 parameters.CounterNameId, source.Id, instance.Id,
                                                                 extData.Id, parameters.Series)
                        ))).ToList();

            foreach (var counterSeriesData in allCounterSeriesData)
            {
                allSeriesData.Add(
                    new
                {
                    yaxis           = counterSeriesData.ValueType == UniversalValue.UniversalClassType.TimeSpan ? 2 : 1,
                    source          = counterSeriesData.CounterSource,
                    instance        = counterSeriesData.CounterInstance,
                    extData         = counterSeriesData.CounterExtData,
                    counterName     = counterSeriesData.CounterName,
                    counterCategory = counterSeriesData.CounterCategory,
                    seriesName      = counterSeriesData.SeriesName,
                    data            = counterSeriesData.Points.Select(p => p == null? null :new List <object> {
                        p.DateTime.ToLocalTime().Ticks / TimeSpan.TicksPerMillisecond, p.Value
                    }),
                    uniqId = counterSeriesData.UniqId
                });
            }
            if (allSeriesData.Count == 0 && String.IsNullOrEmpty(ed))
            {
                return(Json(null, JsonRequestBehavior.AllowGet));
            }
            return
                (Json(
                     new
            {
                success = true,
                lastDate =
                    (dt < parameters.EndDate ? dt : parameters.EndDate).ToString("dd.MM.yyyy HH:mm:ss"),
                seriesData = allSeriesData
            }, JsonRequestBehavior.AllowGet));
        }
        static void Main(string[] args)
        {
            if (!File.Exists("state"))
            {
                File.Create("state").Close();
            }
            string[] states = File.ReadAllLines("state");

            Console.WriteLine("Readed " + states.Length + " states");
            string mongoUrl = File.ReadAllText("settings\\mongoConnection");

            CountersDatabase.InitConnection(mongoUrl);
            Console.WriteLine("Connection initialized");

            for (int i = 0; i < states.Length; i++)
            {
                string[] state = states[i].Split('\t');

                string category      = state[0];
                string counterName   = state[1];
                string counterSource = state[2];

                string counterInstance = state[3];
                string counterExtData  = state[4];
                string statName        = state[6];
                Console.WriteLine("Reading data for " + statName);


                List <object> allSeriesData = new List <object>();
                DateTime      dt            = DateTime.Now;


                DateTime now       = DateTime.Now;
                DateTime startDate = state.Length == 6 ? DateTime.Parse(state[5]) : DateTime.MinValue;


                CounterDataParameters parameters = new CounterDataParameters(startDate.ToString("dd.MM.yyyy HH:mm:ss"),
                                                                             DateTime.MaxValue.ToString("dd.MM.yyyy HH:mm:ss"),
                                                                             Int32.Parse(category),
                                                                             Int32.Parse(counterName),
                                                                             Int32.Parse(counterSource),
                                                                             Int32.Parse(counterInstance),
                                                                             Int32.Parse(counterExtData),
                                                                             "*");


                SqlConnection connection = new SqlConnection("Data Source=app77;Initial Catalog=KeLiteDownloads;Connect Timeout=300; Max Pool Size=1000;Integrated Security=SSPI;Application Name=stats;");
                connection.Open();
                string commandText =
                    @"IF EXISTS(select 1 from Stats where [date]=@date and [statKey]=@statKey and [extend]=@extend)
									UPDATE Stats SET [value] = @value WHERE [date]=@date and [statKey]=@statKey and [extend]=@extend
									ELSE
									INSERT INTO Stats ([date], [statKey], [extend], [value]) VALUES (@date, @statKey, @extend, @value)"                                    ;
                SqlCommand command = new SqlCommand(commandText, connection);

                /*List<CounterSeriesData> result = CountersDatabase.Instance.GetCounterData(
                 *  startDate, DateTime.MaxValue, Int32.Parse(category),
                 *  Int32.Parse(counterName), Int32.Parse(counterSource), Int32.Parse(counterInstance),
                 *  Int32.Parse(counterExtData), new List<string> { "*" });*/

                List <CounterSeriesData> result = parameters.Sources.AsParallel().SelectMany(
                    source => parameters.Instances.AsParallel().SelectMany(
                        instance => parameters.ExtendedDatas.AsParallel().SelectMany(
                            extData =>
                            CountersDatabase.Instance.GetCounterData(parameters.BeginDate, parameters.EndDate,
                                                                     parameters.CounterCategoryId,
                                                                     parameters.CounterNameId, source.Id, instance.Id,
                                                                     extData.Id, parameters.Series)
                            ))).ToList();
                Console.WriteLine("Data for " + statName + " readed. Total " + result.Count + " values");

                foreach (CounterSeriesData counterSeriesData in result)
                {
                    foreach (SeriesPoint seriesPoint in counterSeriesData.Points)
                    {
                        if (!seriesPoint.Value.HasValue)
                        {
                            continue;
                        }
                        command.Parameters.Clear();
                        command.Parameters.AddWithValue("date", seriesPoint.DateTime.RoundTo5Minutes().ToLocalTime());
                        command.Parameters.AddWithValue("statKey", statName);
                        command.Parameters.AddWithValue("extend", counterSeriesData.CounterSource);
                        command.Parameters.AddWithValue("value", seriesPoint.Value);
                        command.ExecuteNonQuery();

                        Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}",
                                          counterSeriesData.CounterCategory, counterSeriesData.CounterName, counterSeriesData.CounterSource, counterSeriesData.CounterInstance, counterSeriesData.CounterExtData,
                                          counterSeriesData.SeriesName, seriesPoint.DateTime.RoundTo5Minutes().ToLocalTime(), seriesPoint.Value);
                    }
                }
                Console.WriteLine("Data saved to SQL Server");
                states[i] = String.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}", category, counterName, counterSource,
                                          counterInstance, counterExtData, now, statName);
            }
            File.WriteAllLines("state", states);
        }