/// <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))); } }
/// <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()); } }
/// <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); } }
/// <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); }
public XmlDataManager(string dbName = null) { Ado = XmlDataTool.ResolveAdoRepository(dbName ?? AdoTool.DefaultDatabaseName); }