private void SendTestingResult(ProgramTestingResult ptResult, CompilerResult cResult) { /* * Указываем в лог-файле о скором * завершении обработки данного * запроса на тестирование. */ logger.Trace( "#" + _submissionInfo.SubmissionId + ": Result is being sent to MySQL server..." ); /* * Создаём команду для MySQL сервера * на основе сформированного * запроса к базе данных. */ var updateSqlCommand = new MySqlCommand( Properties.Resources.submission_result_query, _connection ); /* * Указываем параметры выше сформированного * запроса к базе данных. */ updateSqlCommand.Parameters.AddWithValue( "@param_submissionId", _submissionInfo.SubmissionId ); // Идентификатор запроса updateSqlCommand.Parameters.AddWithValue( "@param_hasError", Convert.ToInt32(cResult.HasErrors) ); // Сигнал об ошибке при компиляции updateSqlCommand.Parameters.AddWithValue( "@param_compiler_text", cResult.CompilerMessage ); // Вывод компилятора updateSqlCommand.Parameters.AddWithValue( "@param_errorOutput", Encoding.UTF8.GetBytes(ptResult.GetErrorOutputAsLine()) ); // Вывод ошибок решения updateSqlCommand.Parameters.AddWithValue( "@param_output", ptResult.TestingResults[ptResult.TestingResults.Length - 1].Output ); // Вывод решения updateSqlCommand.Parameters.AddWithValue( "@param_exitcodes", ptResult.GetExitCodesAsLine('|') ); // Коды выхода решения updateSqlCommand.Parameters.AddWithValue( "@param_usedProcTime", ptResult.GetUsedProcessorTimeAsLine('|') ); // Использованное процессорное время решения updateSqlCommand.Parameters.AddWithValue( "@param_usedMemory", ptResult.GetUsedMemoryAsLine('|') ); // Использованная память решения updateSqlCommand.Parameters.AddWithValue( "@param_result", ptResult.GetResultAsLine('|') ); // Потестовые результаты решения updateSqlCommand.Parameters.AddWithValue( "@param_rating", 0 ); // Полученный рейтинг за решение /* * Выполняем запрос к базе данных */ updateSqlCommand.ExecuteNonQuery(); }
private ProgramTestingResult RunTesting( CompilerResult cResult, ref dynamic compilerConfiguration, ref ICompilerPlugin compilerPlugin ) { /* * Записываем в лог-файл информацию о том, * что в данный момент производим тестирование * пользовательского решения поставленной задачи. */ logger.Trace( "#" + _submissionInfo.SubmissionId + ": Running solution testing subsystem (" + _submissionInfo.TestType + " mode)..." ); /* * Объявляем временную переменную, * которая будет хранить результат * выполнения тестирования пользо- * вательской программы. */ ProgramTestingResult tmpResult = null; /* * Объявляем объект на базе класса * тестировщика, с помощью которого * в скором времени будем выполнять * тестировани пользовательских ре- * шений задач по программированию. */ var tester = new SimplePM_Tester.SimplePM_Tester( ref _connection, ref _serverConfiguration, ref _compilerConfigurations, ref _compilerPlugins, cResult.ExeFullname, ref _submissionInfo ); /* * Выполняем тестирование в блоке обработки * исключительных систуаций, и, в случае * возникновения такой ситуации записываем * данные о ней в лог-файл и искусственно * создаём результаты тестирования * пользовательского решения задачи. */ try { /* * В зависимости от выбранного пользователем * типа тестирования выполняем специфические * операции по отношению к решению задачи. */ switch (_submissionInfo.TestType) { /* Проверка синтаксиса */ case "syntax": /* * Вызываем метод, который создаёт * иллюзию проверки пользовательского * решения поставленной задачи и * возвращает результаты своей "работы". */ tmpResult = tester.Syntax(); break; /* Debug-тестирование */ case "debug": /* * Вызываем метод Debug-тестирования * пользовательского решения постав- * ленной задачи по программированию */ tmpResult = tester.Debug(); break; /* Release-тестирование */ case "release": /* * Вызываем метод Release-тестирования * пользовательского решения постав- * ленной задачи по программированию */ tmpResult = tester.Release( ref compilerConfiguration, ref compilerPlugin ); break; } } catch (Exception ex) { // Записываем информацию об исключении в лог logger.Error(ex); /* * Создаём псевдорезультат тестирования, * который будет содержать информацию о * возникшем во время тестирования поль- * зовательского решения задачи исключе- * нии. */ tmpResult = new ProgramTestingResult(1) { /* * Создаём превдотест и добавляем его * в массив результатов тестирования. */ TestingResults = { [0] = new TestResult { // За код выхода принимаем номер исклбчения ExitCode = ex.HResult, // За выходной поток ошибок принимаем исключение ErrorOutput = ex.ToString(), // Заполняем выходные данные информацией (not null) Output = Encoding.UTF8.GetBytes("An exception occured during testing!"), // Устанавливаем результат тестирования Result = TestResult.ErrorOutputNotNullResult, /* * Указываем, что память и процессорное * время не были использованы. */ UsedMemory = 0, UsedProcessorTime = 0 } } }; } /* * Возвращаем результат выполнения * тестирования пользовательского * решения данной задачи. */ return(tmpResult); }