예제 #1
0
        private void GetOperations()
        {
            OperationList.Clear();
            DataSet ds = null;

            if (!EnableOnlyRestartOperationMode)
            {
                // Берем все оперции за исключением RestartMagicUpdater_Service (1003) т.к. она нужна для
                // перезапуска MagicUpdater'a и должна выполняться в отдельном потоке.
                ds = SqlWorks.ExecProc("SelectOperationsList", MainSettings.MainSqlSettings.ComputerId);
            }
            else
            {
                // Берем только операцию RestartMagicUpdater_Service (1003)
                ds = SqlWorks.ExecProc("SelectRestartOperation", MainSettings.MainSqlSettings.ComputerId);
            }

            if (ds != null)
            {
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    int id = Convert.ToInt32(dr["ID"]);
                    if (!SetOperationReaded(id))
                    {
                        NLogger.LogErrorToBaseOrHdd(MainSettings.MainSqlSettings.ComputerId, $"Ошибка чтения операции. ID: {id}");
                        continue;
                    }
                    string attrsJson = Convert.ToString(dr["Attributes"]);

                    var operationSqlDto = GetOperationName(Convert.ToInt32(dr["OperationType"]));

                    string ot       = operationSqlDto.Name;
                    string fileName = operationSqlDto.FileName;
                    string fileMD5  = operationSqlDto.FileMD5;

                    Type t = null;

                    //Если имя файла не пустое - это плагин операция (dll)
                    if (string.IsNullOrEmpty(fileName))
                    {
                        t = Type.GetType($"MagicUpdater.Operations.{ot}");
                    }
                    else
                    {
                        t = PluginOperationAdapter.GetPluginOperationType(ot, fileName, fileMD5);
                    }

                    if (t != null)
                    {
                        try
                        {
                            Operation operation;

                            if (t.GetConstructors()[0].GetParameters().Length == 2)
                            {
                                operation = (Operation)Activator.CreateInstance(t, id, attrsJson);
                            }
                            else
                            {
                                operation = (Operation)Activator.CreateInstance(t, id);
                            }

                            OperationList.Add(operation);
                        }
                        catch (Exception ex)
                        {
                            NLogger.LogErrorToBaseOrHdd(MainSettings.MainSqlSettings.ComputerId, $"Возможная причина. Несовпадение сигнатур операций БД и Шарпа. Original: {ex.Message.ToString()}");
                        }
                    }
                    else
                    {
                        NLogger.SetReportForOperation(id, false, "Не удалось найти тип операции");
                    }
                }
            }
        }