Example #1
0
        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);
            }
        }
Example #2
0
 public SingleCaseJudger(JudgeContext context, BaseDbOperator dbOperator)
 {
     JudgeContext   = context;
     JudgeTask      = context.Task;
     UserOperator   = dbOperator;
     _caseSensitive = (context.LangConfig as DbLangConfig).CaseSensitive;
 }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        /// <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
            });
        }
Example #6
0
 private void ClearJudgeEnv(BaseDbOperator userOper)
 {
     userOper.Dispose();
     MainOperator.DropDatabase(_dbName);
     MainOperator.DropUser(_dbUser);
 }