예제 #1
0
        /// <summary>
        /// 1. 직렬화된 정보를 <see cref="RequestSerializer"/>를 이용하여, 역직렬화를 수행. <see cref="XdsRequestDocument"/>를 빌드<br/>
        /// 2. 요청정보를  <see cref="XmlDataManager"/>에 전달하여, 실행 후, 응답정보를 반환 받음<br/>
        /// 3. 응답정보를 <see cref="ResponseSerializer"/>를 통해 직렬화하여 byte[] 로 반환함.
        /// </summary>
        /// <param name="requestBytes">직렬화된 요청 Data</param>
        /// <returns>응답정보를 직렬화한 byte[]</returns>
        public virtual byte[] Execute(byte[] requestBytes)
        {
            if (IsDebugEnabled)
            {
                log.Debug("XML 포맷 방식의 정보를 처리를 시작합니다... IXmlDataManager=[{0}]", XmlDataManager);
            }

            requestBytes.ShouldNotBeNull("requestBytes");

            try {
                var requestMsg          = RequestSerializer.Deserialize(requestBytes);
                var XdsResponseDocument = XmlDataManager.Execute(requestMsg);
                var responseBytes       = ResponseSerializer.Serialize(XdsResponseDocument);

                if (IsDebugEnabled)
                {
                    log.Debug("요청을 모두 처리하고, 응답 정보를 포맷으로 반환합니다!!!");
                }

                return(responseBytes);
            }
            catch (Exception ex) {
                if (log.IsErrorEnabled)
                {
                    log.ErrorException("요청 처리 중 예외가 발생했습니다.", ex);
                }

                return(ResponseSerializer.Serialize(XmlDataTool.CreateResponseWithError(ex)));
            }
        }
예제 #2
0
        /// <summary>
        /// 입력정보를 <see cref="XdsRequestDocument"/>로 변환하여, 요청 작업 후, <see cref="XdsResponseDocument"/>를 직렬화하여 반환합니다.
        /// </summary>
        /// <param name="requestText">요청 데이터</param>
        /// <returns>응답정보를 직렬화한 문자열</returns>
        public string Execute(string requestText)
        {
            try {
                return(Execute(requestText.Base64Decode()).Base64Encode());
            }
            catch (Exception ex) {
                if (log.IsErrorEnabled)
                {
                    log.ErrorException("요청 처리 중 예외가 발생했습니다.", ex);
                }

                return(ResponseSerializer.Serialize(XmlDataTool.CreateResponseWithError(ex)).ToText());
            }
        }
예제 #3
0
        /// <summary>
        /// 요청에 대한 실제 작업을 수행합니다.
        /// </summary>
        protected virtual void ExecuteRequestCore(XdsRequestDocument requestDocument, XdsResponseDocument responseDocument)
        {
            if (IsDebugEnabled)
            {
                log.Debug("요청 정보를 옵션에 따라 동기적으로 실행합니다...");
            }

            foreach (var request in requestDocument.Requests)
            {
                // 메소드인 경우는 QueryProvider를 이용하여, 실제 Query 문장으로 변경한다.
                //
                XmlDataTool.ConvertToQuery(Ado, request);

                ExecuteSimpleQuery(Ado, request.PreQueries);

                //! 실제 수행
                DoProcessRequestItem(request, responseDocument);

                ExecuteSimpleQuery(Ado, request.PostQueries);
            }
        }
예제 #4
0
        /// <summary>
        /// 요청정보를 실행하여 응답정보를 반환합니다.
        /// </summary>
        /// <param name="requestDocument">요청정보</param>
        /// <param name="commandTimeout">요청 처리 제한 시간 (단위 : seconds, 기본값 : 90)</param>
        /// <returns>요청 처리 응답정보</returns>
        public virtual XdsResponseDocument Execute(XdsRequestDocument requestDocument, int?commandTimeout)
        {
            if (IsDebugEnabled)
            {
                log.Debug("요청정보에 따른 Database 작업을 시작합니다...");
            }

            requestDocument.ShouldNotBeNull("requestDocument");

            if (requestDocument == null)
            {
                return(XmlDataTool.CreateResponseWithError(new InvalidOperationException(MsgConsts.NoRequestProvided)));
            }

            var responseDocument     = new XdsResponseDocument();
            TransactionScope txScope = null;

            try {
                if (IsDebugEnabled)
                {
                    log.Debug("요청문서 분석 및 응답문서를 초기화 합니다.");
                }

                requestDocument.CopyRequestHeader(responseDocument);

                if (requestDocument.CommandTimeout > commandTimeout.GetValueOrDefault(90))
                {
                    commandTimeout = requestDocument.CommandTimeout;
                }

                if (requestDocument.Transaction)
                {
                    if (IsDebugEnabled)
                    {
                        log.Debug("요청문서에 Transaction 적용 옵션이 설정되어 있습니다. TransactionScope를 이용하여, 전체 요청을 Transaction 하에서 실행합니다.");
                    }

                    txScope = AdoTool.CreateTransactionScope(TransactionScopeOption.Required, IsolationLevel.ReadCommitted);
                }

                //! 실제 요청 처리
                ExecuteRequestCore(requestDocument, responseDocument);


                // Transaction을 Commit 한다
                //
                if (txScope != null)
                {
                    if (IsDebugEnabled)
                    {
                        log.Debug("Transaction Commit을 시작합니다...");
                    }

                    txScope.Complete();

                    if (IsDebugEnabled)
                    {
                        log.Debug("Transaction Commit에 성공했습니다.!!!");
                    }
                }
            }
            catch (Exception ex) {
                responseDocument.ReportError(ex);
            }
            finally {
                if (txScope != null)
                {
                    txScope.Dispose();
                }
            }

            if (IsDebugEnabled)
            {
                log.Debug("모든 요청을 처리하고, ResponseDocument를 반환합니다.");
            }

            return(responseDocument);
        }
예제 #5
0
 public XmlDataManager(string dbName = null)
 {
     Ado = XmlDataTool.ResolveAdoRepository(dbName ?? AdoTool.DefaultDatabaseName);
 }