시작하기 전에
대부분의 경우, 사용자 정의 노드는 해당 입력 터미널에서 수신된 메시지의 컨텐츠에 액세스해야 합니다. 메시지는 구문 요소의 트리로 표현됩니다. 메시지 관리, 메시지 버퍼 액세스, 구문 요소 탐색, 구문 요소 액세스를 위한 유틸리티 함수 그룹이 제공됩니다. (유틸리티 함수에 대한 자세한 정보는 C 노드 유틸리티 함수를 참조하십시오.)
예를 들면, 본문 첫 번째 하위 항목의 이름과 유형을 조회하는 코드는 다음과 같습니다.
void cniEvaluate( ... ){ ... /* Navigate to the target element */ rootElement = cniRootElement(&rc, message); bodyElement = cniLastChild(&rc, rootElement); bodyFirstChild = cniFirstChild(&rc, bodyElement); /* Query the name and value of the target element */ cniElementName(&rc, bodyFirstChild, (CciChar*)&elementname, sizeof(elementName)); bytes = cniElementCharacterValue( &rc, bodyfirstChild, (CciChar*)&eValue, sizeof(eValue)); ... }
요소 트리의 비트스트림 표현에 액세스하기 위해 cniElementAsBitstream 함수를 사용할 수 있습니다. 이 함수를 사용하면 메시지의 요소에 대한 비트스트림 표현을 확보할 수 있습니다. 이 함수와 샘플 코드의 사용 방법에 대한 세부사항은 cniElementAsBitstream을 참조하십시오.
수신된 입력 메시지는 읽기 전용이므로, 메시지를 변환하려면 cniCreateMessage 함수를 사용하여 해당 메시지를 새 출력 메시지에 써야 합니다. 입력 메시지로부터 요소를 복사하거나, 새 요소를 작성하여 메시지에 첨부할 수 있습니다. 일반적으로 새 요소는 구문 분석기 도메인에 있습니다.
{ ... context = cniGetMessageContext(&rc, message)); outMsg = cniCreateMessage(&rc, context)); ... }
cniCopyElementTree(&rc, sourceElement, targetElement);
cniSetElementIntegerValue(&rc, targetElement, L"newValue", 8);
cniDeleteMessage(&rc, outMsg);
cniCreateElementAsFirstChildUsingParser cniCreateElementAsLastChildUsingParser cniCreateElementAfterUsingParser cniCreateElementBeforeUsingParser메시지 트리 폴더에 구문 분석기를 지정하는 데 특정하므로 이런 함수를 사용해야 합니다.
cniCreateElementAsFirstChild cniCreateElementAsLastChild cniCreateElementAfter cniCreateElementBefore
노드는 Compute 노드 ESQL 구문을 사용하여 ESQL 표현식을 호출할 수 있습니다. ESQL 표현식을 사용하여 메시지 구성요소를 작성하고 수정할 수 있으며, cniSqlCreateStatement, cniSqlSelect, cniSqlDeleteStatement 및 cniSqlExecute 함수를 사용하여 외부 데이터베이스의 입력 메시지 및 데이터 요소를 참조할 수 있습니다.
예를 들면, 데이터베이스 테이블의 열 컨텐츠로부터 Result 요소를 채우는 코드는 다음과 같습니다.
{ ... sqlExpr = cniSqlCreateStatement(&rc, (NODE_CONTEXT_ST *)context->nodeObject, L"DB", CCI_SQL_TRANSACTION_AUTO, L"SET OutputRoot.XML.Result[] = (SELECT T.C1 AS Col1 FROM Database.TABLE AS T;"); ... cniSqlSelect(&rc, sqlExpr, destinationList, exceptionList, message, outMsg); cniSqlDeleteStatement(&rc, sqlExpr); ... }
ESQL에 대한 자세한 정보는 ESQL 개요를 참조하십시오.
사용자 정의 노드가 기본적으로 ESQL을 사용하는 경우 Compute 노드 사용을 고려하십시오. Compute 노드를 참조하십시오.
cniFinalize(&rc, outMsg, CCI_FINALIZE_NONE);
if (terminalObject) { if (cniIsTerminalAttached(&rc, terminalObject)) { if (rc == CCI_SUCCESS) { cniPropagate(&rc, terminalObject, destinationList, exceptionList, outMsg); } }
위의 예에서 메시지를 지정된 터미널에 전달할 수 있는지 여부를 테스트하기 위해 cniIsTerminalAttached 함수가 사용되었습니다. cniIsTerminalAttached 함수를 사용하지 않았으며 커넥터가 터미널을 다른 노드에 연결하지 않은 경우, 메시지가 전달되지 않고 경고 메시지는 리턴되지 않습니다. 이 상황이 발생하지 않도록 하려면 cniIsTerminalAttached 함수를 사용하십시오.
cniDeleteMessage(&rc, outMsg);
{ ... cniWriteBuffer(&rc, message); writeToDevice(cniBufferPointer(&rc, message), cniBufferSize(&rc, message)); ... }이 예제에서 메소드 writeToDevice는 비트스트림을 출력 디바이스에 쓰는 사용자 작성 메소드입니다.
메시지는 단 한 번만 직렬화될 수 있습니.