/// <summary>
        /// Run queries for the node
        /// </summary>
        /// <param name="nodeInfo">TemplateNodeInfo</param>
        /// <param name="connData">Connection data</param>
        /// <param name="templateRowId">Template Id</param>
        private void RunQueries(TemplateNodeInfo nodeInfo, ConnectionData connData, long templateRowId, long scheduleId, string runningKey)
        {
            MultyQueryResultInfo result;
            ProgressItem         item  = new ProgressItem();
            CancellationToken    token = new CancellationToken();

            log.DebugFormat(
                @"Started: Connection:'{0}';templateRowId:'{1}';Query:'{2}'",
                connData.Title,
                templateRowId,
                nodeInfo.Name
                );

            lock (_runningTasksLock)
            {
                _runningTasks.TryAdd(runningKey, nodeInfo.Name);
            }

            using (SqlProcessor sqlProcessor = _model.GetNewSqlProcessor(token))
            {
                nodeInfo.SetConnectionData(null);
                TemplateNodeInfo node = nodeInfo.Instantiate(connData, null, null);
                node.AssignTemplateId(templateRowId);
                node.LoadUserParameters(_storage);

                Stopwatch durationWatch = new Stopwatch();
                DateTime  startTime     = DateTime.Now;

                durationWatch.Start();

                result = sqlProcessor.ExecuteMultyQuery(
                    connData.ConnectionGroup,
                    node.Queries,
                    item,
                    _model.Settings.SystemSettings.MaximumDBRequestsThreadCount
                    );

                IStorageManager istorage = _model.GetVaultProcessor(connData.ConnectionGroup);

                istorage.SaveRequestedData(node, result);

                durationWatch.Stop();

                DateTime duration = new DateTime(durationWatch.Elapsed.Ticks);

                istorage.CurrentStorage.UpdateTreeNodeTimings(
                    node,
                    startTime,
                    duration
                    );

                //_serviceSchedules.FirstOrDefault(sch => sch.TemplateNodeId == nodeInstanceRowId).LastRan = startTime;
                _serviceSchedules[scheduleId].LastRan = startTime;
            }

            nodeInfo.SetConnectionData(connData);

            lock (_runningTasksLock)
            {
                string outTask;
                _runningTasks.TryRemove(runningKey, out outTask);
            }
        }
        public bool TryLoadChildren(TemplateNodeInfo node)
        {
            if (node.TemplateNodeId == null)
            {
                return(false);
            }

            bool?notProcessedYet = this.GetChildrenNotYetProcessed(node.TemplateNodeId.Value);

            if (notProcessedYet ?? true)
            {
                return(false);
            }

            String sql = string.Format(
                "SELECT I.{0}, I.*, PQ.{1}, T.{9} AS [TemplateUserId] " +
                "FROM {2} AS I " +
                "LEFT JOIN {3} AS T ON I.{7} = T.{13} " +
                "LEFT JOIN {4} AS PQ ON T.{8} = PQ.{14} " +
                "WHERE I.{5} = {6} AND I.{10} = {11} " +
                "ORDER BY I.{12}",
                IdentityField,
                TemplateNodeQueryGroupDirectory.DefaultDatabaseFieldFn,
                TableName,
                TemplateNodeDirectory.TableName,
                TemplateNodeQueryGroupDirectory.TableName,
                ParentIdFn,
                node.TemplateNodeId,
                TemplateNodeIdFn,
                TemplateNodeDirectory.ParentQueryGroupIdFn,
                TemplateNodeDirectory.UserIdFieldName,
                NodeEnabledFn,
                SqLiteBool.ToBit(true),
                NodeSequenceNumberFn,
                TemplateNodeDirectory.TableIdentityField,
                TemplateNodeQueryGroupDirectory.TableIdentityField
                );

            node.Childs.Clear();

            using (this.Connection.OpenWrapper())
            {
                new SqlSelectCommand(
                    this.Connection,
                    sql,
                    reader =>
                {
                    string templateUserId = reader["TemplateUserId"].ToString();

                    TemplateNodeInfo template = node.Template.Childs.FirstOrDefault(
                        n => n.Id == templateUserId.ToString()
                        );

                    if (template == null)
                    {
                        this.DisableNode((Int64)reader[IdentityField]);
                        return;
                    }

                    string defaultDbFieldnName =
                        reader[TemplateNodeQueryGroupDirectory.DefaultDatabaseFieldFn].ToString();

                    TemplateNodeInfo newNode = template.Instantiate(node.Connection, defaultDbFieldnName, node);

                    long newNodeId = (Int64)reader[IdentityField];

                    newNode.AssignTemplateId(newNodeId);

                    List <TemplateNodeUpdateJob> refreshJobs = newNode.GetRefreshJob(true);

                    foreach (TemplateNodeUpdateJob refreshJob in refreshJobs)
                    {
                        if (refreshJob != null && !refreshJob.IsEmpty())
                        {
                            if (!(reader[NodeScheduledUpdateFn] is DBNull))
                            {
                                refreshJob.LastRan = (DateTime)reader[NodeScheduledUpdateFn];
                            }
                        }
                    }

                    this._storage.NodeInstanceAttributes.ReadTo(
                        newNodeId,
                        newNode.Attributes,
                        this.Connection
                        );

                    newNode.OnAttributesChanged();

                    node.Childs.Add(newNode);
                })
                .Execute(100);
            }

            Dictionary <string, TemplateNodeInfo> absent = new Dictionary <string, TemplateNodeInfo>();

            foreach (TemplateNodeInfo nodeTemplate in node.Template.Childs.Where(n => !n.NeedDataRowToBeInstantiated))
            {
                absent[nodeTemplate.Id] = nodeTemplate;
            }

            foreach (TemplateNodeInfo loaded in node.Childs)
            {
                absent.Remove(loaded.Template.Id);
            }

            if (absent.Any())
            {
                Dictionary <TemplateNodeInfo, int> templateIndexes = new Dictionary <TemplateNodeInfo, int>();

                for (int i = 0; i < node.Template.Childs.Count; i++)
                {
                    templateIndexes[node.Template.Childs[i]] = i;
                }

                List <TemplateNodeInfo> newStatics = absent.Values.Select(t => t.Instantiate(node.Connection, null, node)).ToList();

                IOrderedEnumerable <TemplateNodeInfo> newList =
                    new List <TemplateNodeInfo>(node.Childs).Union(newStatics).OrderBy(n => templateIndexes[n.Template]);

                node.Childs.Clear();

                node.Childs.AddRange(newList);

                this.SaveChildren(node);
            }

            return(true);
        }