private void BuildStandardData(DbTestData testData, out string inputData, out DbData outputData, out DbQueryData queryData) { inputData = testData.Input; outputData = null; queryData = null; string stdOperCmd = testData.Operation; string stdQueryCmd = testData.Query; BaseDbOperator stdOperator = CreateJudgeEnv(inputData); try { DbDataReader reader = stdOperator.ExecuteReader(stdOperCmd ?? stdQueryCmd); if (stdOperCmd != null) { outputData = stdOperator.ReadDbData(); } if (stdQueryCmd != null) { queryData = BaseDbOperator.ReadQueryData(reader); } } catch (Exception ex) { throw new JudgeException("Build Db test data failed!" + ex); } finally { ClearJudgeEnv(stdOperator); } }
public SingleCaseJudger(JudgeContext context, BaseDbOperator dbOperator) { JudgeContext = context; JudgeTask = context.Task; UserOperator = dbOperator; _caseSensitive = (context.LangConfig as DbLangConfig).CaseSensitive; }
private SingleJudgeResult JudgeOneCase(string dataName) { DbTestData testData = TestDataManager.GetDbTestData(JudgeTask.ProblemId, _dbType, dataName); BuildStandardData(testData, out string inputData, out DbData outputData, out DbQueryData queryData); BaseDbOperator userOper = CreateJudgeEnv(inputData); SingleCaseJudger singleCaseJudger = new SingleCaseJudger(Context, userOper); SingleJudgeResult result = singleCaseJudger.Judge(inputData, outputData, queryData); ClearJudgeEnv(userOper); return(result); }
private BaseDbOperator CreateJudgeEnv(string input) { MainOperator.CreateDatabase(_dbName); MainOperator.CreateUser(_dbUser, _dbPassword); MainOperator.GeneratePrivileges(_dbName, _dbUser); DbLangConfig dbConfig = DbManager.GetDbConfiguration(JudgeTask.Language); dbConfig.Database = _dbName; dbConfig.User = _dbUser; dbConfig.Password = _dbPassword; BaseDbOperator userOper = DbOperatorFactory.Create(dbConfig); userOper.InitDatabase(input); return(userOper); }
/// <summary> /// 评测一组用例 /// </summary> /// <param name="stdInput">标准输入</param> /// <param name="stdOutput">标准输出</param> /// <param name="stdQuery">标准查询</param> /// <returns></returns> public SingleJudgeResult Judge(string stdInput, DbData stdOutput, DbQueryData stdQuery) { Stopwatch sw = new Stopwatch(); DbDataReader reader = null; DbQueryData usrQuery = null; DbData usrOutput = null; try { sw.Start(); reader = UserOperator.ExecuteReader(JudgeTask.SourceCode, JudgeTask.TimeLimit); usrQuery = BaseDbOperator.ReadQueryData(reader); usrOutput = UserOperator.ReadDbData(); } catch (Exception ex) { return(new SingleJudgeResult { ResultCode = JudgeResultCode.RuntimeError, JudgeDetail = ex.Message, TimeCost = 0 }); } finally { sw.Stop(); } CompareResult result = CompareAnswer(stdOutput, stdQuery, usrOutput, usrQuery); JudgeResultCode resultCode = (result == CompareResult.Accepted) ? JudgeResultCode.Accepted : JudgeResultCode.WrongAnswer; return(new SingleJudgeResult { ResultCode = resultCode, TimeCost = (int)sw.ElapsedMilliseconds }); }
private void ClearJudgeEnv(BaseDbOperator userOper) { userOper.Dispose(); MainOperator.DropDatabase(_dbName); MainOperator.DropUser(_dbUser); }