시작하기 전에
많은 경우, 사용자 정의 노드는 해당 입력 터미널에서 수신된 메시지의 컨텐츠에 액세스해야 합니다. 메시지는 구문 요소의 트리로 표현됩니다. 메시지 관리, 메시지 버퍼 액세스, 구문 요소 탐색, 구문 요소 액세스를 위한 유틸리티 함수 그룹이 제공됩니다. (유틸리티 함수에 대한 자세한 정보는 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)); ... }
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 개요을 참조하십시오.
cniFinalize(&rc, outMsg, CCI_FINALIZE_NONE);
if (terminalObject) { if (cniIsTerminalAttached(&rc, terminalObject)) { if (rc == CCI_SUCCESS) { cniPropagate(&rc, terminalObject, destinationList, exceptionList, outMsg); } }
cniDeleteMessage(&rc, outMsg);
{ ... cniWriteBuffer(&rc, message); writeToDevice(cniBufferPointer(&rc, message), cniBufferSize(&rc, message)); ... }메시지는 단 한 번만 직렬화될 수 있습니다.