Prima di iniziare
In molti casi, il nodo definito dall'utente ha necessità di accedere al contenuto del messaggio ricevuto sul relativo terminale di input. Il messaggio è rappresentato come una struttura ad albero degli elementi di sintassi. Gruppi di funzioni di utilità vengono forniti per la gestione dei messaggi, l'accesso al buffer di messaggi, la navigazione e l'acceso all'elemento di sintassi. Per informazioni dettagliate sulle funzioni di utilità, fare riferimento a Funzioni di utilità del nodo in C.
Ad esempio per eseguire la query del nome e del tipo del primo child del contenuto:
void cniEvaluate( ... ){ ... /* Naviga sull'elemento di destinazione */ rootElement = cniRootElement(&rc, message); bodyElement = cniLastChild(&rc, rootElement); bodyFirstChild = cniFirstChild(&rc, bodyElement); /* Esegue la query del nome del valore dell'elemento di destinazione */ cniElementName(&rc, bodyFirstChild, (CciChar*)&elementname, sizeof(elementName)); bytes = cniElementCharacterValue( &rc, bodyfirstChild, (CciChar*)&eValue, sizeof(eValue)); ... }
Per accedere alla rappresentazione del flusso di bit della struttura al albero di un elemento è possibile utilizzare la funzione cniElementAsBitstream. Mediante tale funzione, è possibile ottenere la rappresentazione del flusso di bit di un elemento in un messaggio. Per informazioni dettagliate su come utilizzare questa funzione e il codice di esempio, fare riferimento a cniElementAsBitstream.
Il messaggio di input ricevuto è si sola lettura quindi, prima che un messaggio possa essere trasformato, è necessario scriverlo su un nuovo messaggio di output utilizzando la funzione cniCreateMessage. E' possibile copiare gli elementi dal messaggio di input oppure è possibile creare nuovi elementi e collegarli al messaggio. I nuovi elementi sono generalmente in un dominio del programma di analisi.
{ ... context = cniGetMessageContext(&rc, message)); outMsg = cniCreateMessage(&rc, context)); ... }
cniCopyElementTree(&rc, sourceElement, targetElement);
cniSetElementIntegerValue(&rc, targetElement, L"newValue", 8);
cniDeleteMessage(&rc, outMsg);
cniCreateElementAsFirstChildUsingParser cniCreateElementAsLastChildUsingParser cniCreateElementAfterUsingParser cniCreateElementBeforeUsingParserQueste funzioni devono essere utilizzate in quanto sono specifiche dell'assegnazione di un programma di analisi ad una cartella della struttura ad albero del messaggio.
cniCreateElementAsFirstChild cniCreateElementAsLastChild cniCreateElementAfter cniCreateElementBefore
I nodi possono richiamare espressioni ESQL utilizzando la sintassi ESQL del nodo Compute. E' possibile creare e modificare i componenti del messaggio utilizzando espressioni ESQL ed è possibile fare riferimento agli elementi sia del messaggio di input che dei dati provenienti da un database esterno utilizzando le funzioni cniSqlCreateStatement, cniSqlSelect, cniSqlDeleteStatement e cniSqlExecute.
Ad esempio, per popolare l'elemento Result con il contenuto di una colonna in una tabella di database:
{ ... 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); ... }
Per ulteriori informazioni su ESQL, fare riferimento a Panoramica di ESQL.
Se il nodo definito dall'utente utilizza principalmente ESQL è possibile considerare l'utilizzo di un nodo compute, vedere Nodo Compute.
cniFinalize(&rc, outMsg, CCI_FINALIZE_NONE);
if (terminalObject) { if (cniIsTerminalAttached(&rc, terminalObject)) { if (rc == CCI_SUCCESS) { cniPropagate(&rc, terminalObject, destinationList, exceptionList, outMsg); } }
Nell'esempio riportato in precedenza, la funzione cniIsTerminalAttached viene utilizzata per verificare se il messaggio può essere distribuito al terminale specificato. Se la funzione cniIsTerminalAttached non viene utilizzata e il terminale non è collegato ad un altro nodo mediante un connettore, il messaggio non viene distribuito e nessun messaggio di avviso viene restituito. Utilizzare la funzione cniIsTerminalAttached per prevenire questo problema.
cniDeleteMessage(&rc, outMsg);
{ ... cniWriteBuffer(&rc, message); writeToDevice(cniBufferPointer(&rc, message), cniBufferSize(&rc, message)); ... }In questo esempio, il metodo writeToDevice è scritto dall'utente che scrive un flusso di bit su un'unità di output.
Tenere presente che è possibile eseguire la serializzazione di un messaggio solo una volta.