Creates a SqlPathExpression object that represents the path that is specified by the path argument. When they are navigated, path elements are created if they do not already exist. This function returns a pointer to the PathExpression object which is used as input to the functions that navigate the path, namely the cniSqlNavigatePath family.
Because an overhead is incurred in creating the expression, if the same path expression is to be used for every message, call this function once, and use the CciSqlPathExpression* that is returned in a call to cniSqlNavigate for each message. You can use the CciSqlPathExpression on threads other than the one on which it was created.
CciSqlPathExpression* cniSqlCreateModifiablePathExpression( int* returnCode, CciNode* nodeObject, CciChar* dataSourceName, CciChar* path);
If successful, the address of the SQLPathExpression object is returned. If an error occurs, CCI_NULL_ADDR is returned, and the return code parameter indicates the reason for the error. When the SQLPathExpression is no longer needed, (typically when the node is deleted) call cniSqlDeletePathExpression to delete it.
If you add the following code to the Transform node sample, you can create an element, and all necessary ancestor elements, with one function call.
Create the CciSQLPathExpression in the _Transform_createNodeContext function:
{ CciChar ucsPathExpressionString[32]; char* mbPathExpressionString = "OutputRoot.XMLNS.Request.A.B.C.D.E"; /* convert our path string to unicode*/ cciMbsToUcs(NULL, mbPathExpressionString, ucsPathExpressionString, 32, BIP_DEF_COMP_CCSID); p->pathExpression = cniSqlCreateModifiablePathExpression( NULL, nodeObject, NULL,/* do not reference Database*/ ucsPathExpressionString); }
Now use the CciSqlPathExpression later in the _Transform_evaluate function
{ CciElement* newElement = cniSqlNavigatePath( NULL, ((NODE_CONTEXT_ST *)context)->pathExpression, message, localEnvironment, exceptionList, outMsg, NULL,/* do not reference OutputLocalEnvironment*/ NULL/* do not reference OutputLExceptionList*/); }
Therefore passing in the input message PluginSample.change.xml:
<Request type="change"> <CustomerAccount>01234567</CustomerAccount> <CustomerPhone>555-0000</CustomerPhone> </Request>
The following output message is generated:
<Request type="modify"> <CustomerAccount>01234567</CustomerAccount> <CustomerPhone>555-0000</CustomerPhone> <A> <B> <C> <D/> </C> </B> </A> </Request>