/// <summary>
        /// 从给定的题目句柄对象创建 NativeProblemDataProvider 对象。
        /// </summary>
        /// <param name="handle">题目句柄对象。</param>
        /// <param name="isReadonly">一个值,该值指示创建的 NativeProblemDataProvider 对象是否处于只读模式。</param>
        /// <returns>从给定题目句柄创建的 NativeProblemDataProvider 对象。</returns>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="InvalidProblemException"/>
        /// <exception cref="ProblemNotExistException"/>
        public static NativeProblemDataProvider Create(ProblemHandle handle, bool isReadonly)
        {
            if (handle == null)
            {
                throw new ArgumentNullException(nameof(handle));
            }
            if (!handle.IsNativeProblem)
            {
                throw new InvalidProblemException(handle, "给定的题目句柄不是 BITOJ 本地题目。");
            }

            // 尝试从题目句柄中解析出题目ID。
            if (!int.TryParse(handle.ProblemId.Substring(3), out int id))
            {
                throw new InvalidProblemException(handle, "给定的题目句柄非法。");
            }

            // 从底层数据库中查询题目实体对象。
            ProblemEntity entity = ProblemArchieveManager.Default.DataContext.GetProblemEntityById(id);

            if (entity == null)
            {
                throw new ProblemNotExistException(handle);
            }

            // 创建底层题目数据访问器对象。
            ProblemAccessHandle entryHandle = new ProblemAccessHandle(entity.ProblemDirectory);

            return(new NativeProblemDataProvider()
            {
                m_entity = entity,
                m_accessHandle = entryHandle,
                m_readonly = isReadonly
            });
        }
        /// <summary>
        /// 从给定的题目句柄对象创建 NativeProblemDataProvider 对象。
        /// </summary>
        /// <param name="handle">题目句柄对象。</param>
        /// <param name="isReadonly">一个值,该值指示创建的 NativeProblemDataProvider 对象是否处于只读模式。</param>
        /// <returns>从给定题目句柄创建的 NativeProblemDataProvider 对象。</returns>
        /// <exception cref="ArgumentNullException"/>
        /// <exception cref="InvalidProblemException"/>
        /// <exception cref="ProblemNotExistException"/>
        public static ProblemDataProvider Create(ProblemHandle handle, bool isReadonly)
        {
            if (handle == null)
            {
                throw new ArgumentNullException(nameof(handle));
            }
            if (!handle.IsNativeProblem)
            {
                throw new InvalidProblemException(handle, "给定的题目句柄不是 BITOJ 本地题目。");
            }

            // 从底层数据库中查询题目实体对象。
            ProblemDataContext context = new ProblemDataContextFactory().CreateContext();
            ProblemEntity      entity  = context.GetProblemEntityById(handle.ProblemId);

            if (entity == null)
            {
                context.Dispose();
                throw new ProblemNotExistException(handle);
            }

            // 创建底层题目数据访问器对象。
            ProblemAccessHandle entryHandle = new ProblemAccessHandle(entity);

            return(new ProblemDataProvider()
            {
                m_context = context,
                m_entity = entity,
                m_accessHandle = entryHandle,
                m_readonly = isReadonly
            });
        }
Ejemplo n.º 3
0
 /// <summary>
 /// 使用指定的题目句柄和描述信息创建 ProblemNotExistException 类的新实例。
 /// </summary>
 /// <param name="handle">题目句柄。</param>
 /// <param name="message">描述信息。</param>
 public ProblemNotExistException(ProblemHandle handle, string message) : base(message)
 {
     m_handle = handle;
 }
Ejemplo n.º 4
0
 /// <summary>
 /// 使用给定的题目句柄创建 ProblemNotExistException 类的新实例。
 /// </summary>
 /// <param name="handle">题目句柄。</param>
 public ProblemNotExistException(ProblemHandle handle) : base("给定的题目不存在。")
 {
     m_handle = handle;
 }
Ejemplo n.º 5
0
 /// <summary>
 /// 使用给定的 ProblemHandle 对象和异常消息初始化 ProblemException 类的新实例。
 /// </summary>
 /// <param name="entry">要使用的 ProblemEntry 对象。</param>
 /// <param name="message">要使用的异常消息。</param>
 public ProblemException(ProblemHandle entry, string message) : base(message)
 {
     Problem = entry ?? throw new ArgumentNullException(nameof(entry));
 }
Ejemplo n.º 6
0
 /// <summary>
 /// 使用 ProblemHandle 对象初始化 ProblemException 类的新实例。
 /// </summary>
 /// <param name="entry">要使用的 ProblemEntry 对象。</param>
 /// <exception cref="NullReferenceException"/>
 public ProblemException(ProblemHandle entry) : base($"编号为 {entry.ProblemId} 的题目出现错误。")
 {
     Problem = entry;
 }