Antes de empezar
En muchos casos, el nodo definido por el usuario necesita acceder al contenido del mensaje recibido en el terminal de entrada. El mensaje se representa como un árbol de elementos de sintaxis. Se proporcionan grupos de funciones de programa de utilidad para la gestión de mensajes, el acceso al almacenamiento intermedio de mensajes, la navegación por los elementos de sintaxis y el acceso a los elementos de sintaxis. (Consulte el apartado Funciones de programa de utilidad de nodo en C si desea ver información detallada sobre las funciones de programa de utilidad.)
Por ejemplo, para consultar el nombre y el tipo del primer hijo del cuerpo:
void cniEvaluate( ... ){ ... /* Navegar hasta el elemento de destino */ rootElement = cniRootElement(&rc, message); bodyElement = cniLastChild(&rc, rootElement); bodyFirstChild = cniFirstChild(&rc, bodyElement); /* Consultar el nombre y el valor del elemento de destino */ cniElementName(&rc, bodyFirstChild, (CciChar*)&elementname, sizeof(elementName)); bytes = cniElementCharacterValue( &rc, bodyfirstChild, (CciChar*)&eValue, sizeof(eValue)); ... }
Para acceder a la representación de corriente de bits de un árbol de elementos, puede utilizar la función cniElementAsBitstream. Utilizando esta función, puede obtener la representación de corriente de bits de cualquier elemento en un mensaje. Consulte cniElementAsBitstream para obtener detalles sobre cómo utilizar esta función y código de ejemplo.
Dado que el mensaje de entrada recibido es de sólo lectura, para poder transformar un mensaje deberá escribirlo en un mensaje de salida nuevo utilizando la función cniCreateMessage. Puede copiar los elementos del mensaje de entrada o puede crear elementos nuevos y conectarlos al mensaje. Los elementos nuevos están generalmente en el dominio de un analizador.
{ ... context = cniGetMessageContext(&rc, message)); outMsg = cniCreateMessage(&rc, context)); ... }
cniCopyElementTree(&rc, sourceElement, targetElement);
cniSetElementIntegerValue(&rc, targetElement, L"newValue", 8);
cniDeleteMessage(&rc, outMsg);
cniCreateElementAsFirstChildUsingParser cniCreateElementAsLastChildUsingParser cniCreateElementAfterUsingParser cniCreateElementBeforeUsingParserDeben utilizarse estas funciones porque son específicas para asignar un analizador a una carpeta de árbol de mensaje.
cniCreateElementAsFirstChild cniCreateElementAsLastChild cniCreateElementAfter cniCreateElementBefore
Los nodos pueden invocar expresiones ESQL utilizando la sintaxis ESQL del nodo Compute. Puede crear y modificar los componentes del mensaje utilizando expresiones ESQL y puede hacer referencia a los elementos del mensaje de entrada y de los datos de una base de datos externa utilizando las funciones cniSqlCreateStatement, cniSqlSelect, cniSqlDeleteStatement y cniSqlExecute.
Por ejemplo, para llenar el elemento de resultado a partir del contenido de una columna de una tabla de base de datos:
{ ... 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 obtener más información sobre ESQL, consulte el apartado Visión general de ESQL.
Si su nodo definido por el usuario utiliza principalmente ESQL, piense en utilizar un nodo Compute, consulte Nodo Compute.
cniFinalize(&rc, outMsg, CCI_FINALIZE_NONE);
if (terminalObject) { if (cniIsTerminalAttached(&rc, terminalObject)) { if (rc == CCI_SUCCESS) { cniPropagate(&rc, terminalObject, destinationList, exceptionList, outMsg); } }
En el ejemplo anterior, se utiliza la función cniIsTerminalAttached para probar si se puede propagar el mensaje al terminal especificado. Si no utiliza la función cniIsTerminalAttached y el terminal no está conectado a otro nodo por un conector, el mensaje no se propaga y no se devuelve ningún mensaje de aviso. Utilice la función cniIsTerminalAttached para evitar que esto suceda.
cniDeleteMessage(&rc, outMsg);
{ ... cniWriteBuffer(&rc, message); writeToDevice(cniBufferPointer(&rc, message), cniBufferSize(&rc, message)); ... }En este ejemplo, el método writeToDevice es un método escrito por el usuario que escribe una corriente de bits en un dispositivo de salida.
Tenga en cuenta que un mensaje sólo se puede serializar una vez.