Antes de começar
Em muitos casos, o nó definido pelo usuário necessita acessar o conteúdo da mensagem que é recebida em seu terminal de entrada. A mensagem é representada como uma árvore de elementos de sintaxe. Grupos de funções utilitárias são fornecidos para gerenciamento de mensagens, acesso a buffer de mensagem, navegação de elementos de sintaxe e acesso a elementos de sintaxe. (Consulte Funções de Utilitários de Nó C para obter detalhes sobre as funções de utilitário).
Por exemplo, para consultar o nome e o tipo do primeiro filho do corpo:
void cniEvaluate( ... ){ ... /* Navegar até o elemento de destino */ rootElement = cniRootElement(&rc, message); bodyElement = cniLastChild(&rc, rootElement); bodyFirstChild = cniFirstChild(&rc, bodyElement); /* Consultar o nome e o valor do elemento de destino */ cniElementName(&rc, bodyFirstChild, (CciChar*)&elementname, sizeof(elementName)); bytes = cniElementCharacterValue( &rc, bodyfirstChild, (CciChar*)&eValue, sizeof(eValue)); ... }
Para acessar a representação de fluxo de bits de uma árvore de elementos, você pode utilizar a função cniElementAsBitstream. Utilizando essa função, é possível obter a representação de fluxo de bits de qualquer elemento em uma mensagem. Consulte cniElementAsBitstream para obter detalhes de como utilizar essa função e código de amostra.
A mensagem de entrada recebida é somente leitura, portanto antes que uma mensagem possa ser transformada é preciso gravá-la para uma nova mensagem de saída utilizando a função cniCreateMessage. É possível copiar elementos da mensagem de entrada ou criar novos elementos e anexá-los á mensagem. Os novos elementos em geral estão no domínio de um analisador.
{ ... context = cniGetMessageContext(&rc, message)); outMsg = cniCreateMessage(&rc, context)); ... }
cniCopyElementTree(&rc, sourceElement, targetElement);
cniSetElementIntegerValue(&rc, targetElement, L"newValue", 8);
cniDeleteMessage(&rc, outMsg);
cniCreateElementAsFirstChildUsingParser cniCreateElementAsLastChildUsingParser cniCreateElementAfterUsingParser cniCreateElementBeforeUsingParserEstas funções devem ser utilizadas, porque são específicas para designação de um analisador a uma pasta da árvore de mensagens.
cniCreateElementAsFirstChild cniCreateElementAsLastChild cniCreateElementAfter cniCreateElementBefore
Os nós podem chamar expressões ESQL utilizando sintaxe ESQL de nó Compute. É possível criar e modificar os componentes da mensagem utilizando as expressões ESQL e referir-se a elementos da mensagem de entrada e aos dados de um banco de dados externo utilizando as funções cniSqlCreateStatement, cniSqlSelect, cniSqlDeleteStatement e cniSqlExecute.
Por exemplo, para ocupar o elemento Result do conteúdo de uma coluna em uma tabela de banco de dados:
{ ... 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); ... }
Para obter informações adicionais sobre ESQL, consulte Visão Geral do ESQL.
Se seu nó definido pelo usuário usar primeiramente o ESQL considere utilizar um nó compute, consulte Nó Compute.
cniFinalize(&rc, outMsg, CCI_FINALIZE_NONE);
if (terminalObject) { if (cniIsTerminalAttached(&rc, terminalObject)) { if (rc == CCI_SUCCESS) { cniPropagate(&rc, terminalObject, destinationList, exceptionList, outMsg); } }
No exemplo acima, a função cniIsTerminalAttached é utilizada para testar se a mensagem pode ser propagada para o terminal especificado. Se você não utilizar a função cniIsTerminalAttached e o terminal não estiver anexado a outro nó por um conector, a mensagem não será propagada e nenhuma mensagem de aviso será retornada. Utilize a função cniIsTerminalAttached para evitar que isso ocorra.
cniDeleteMessage(&rc, outMsg);
{ ... cniWriteBuffer(&rc, message); writeToDevice(cniBufferPointer(&rc, message), cniBufferSize(&rc, message)); ... }Nesse exemplo, o método writeToDevice é um método escrito pelo usuário que grava um fluxo de bits para um dispositivo de saída.
Observe que uma mensagem pode ser serializada somente uma vez.