创建不可修改的 SqlPathExpression 对象,此对象表示路径参数所指定的路径。不可修改意味着,如果路径元素尚未存在,则浏览的路径不会创建这些路径元素。此函数将指针返回到 PathExpression 对象,从而用作浏览路径的函数(即 cniSqlNavigatePath 系列)的输入。
创建此表达式时会产生开销,因此如果您要对每个消息是使用同一路径表达式,则应调用一次此函数,并且应在调用 cniSqlNavigate 时对每个消息使用返回的 CciSqlPathExpression*。您可以在不同于创建 CciSqlPathExpression* 的线程上使用此对象。
CciSqlPathExpression* cniSqlCreateReadOnlyPathExpression( int* returnCode, CciNode* nodeObject, CciChar* dataSourceName, CciChar* path );
如果成功,则会返回 SQLPathExpression 对象的地址。如果发生错误,则会返回 CCI_NULL_ADDR,并且此返回码参数会表明发生错 误的原因。一旦不再需要 SQLPathExpression(通常在删除节点时),应通过调用 cniSqlDeletePathExpression 来删除它。
Switch 节点样本显示了如何使用 cniFirstChild 之类的函数浏览至语法元素。您可以使用以下代码来获取相同的结果。
在 _Switch_createNodeContext 函数中,我们将创建 CciSqlPathExpression ,以供将来使用。
{ CciChar ucsPathExpressionString[32]; char* mbPathExpressionString = "InputBody.Request.type"; /* convert our path string to unicode*/ cciMbsToUcs( NULL, mbPathExpressionString, ucsPathExpressionString, 32, BIP_DEF_COMP_CCSID); p->pathExpression = cniSqlCreateReadOnlyPathExpression( NULL, nodeObject, NULL, /*we do not reference Database*/ ucsPathExpressionString); }
然后,我们可以在 _Switch_evaluate 函数中使用该 CciSqlPathExpression。
CciElement* targetElement = cniSqlNavigatePath( NULL, ((NODE_CONTEXT_ST *)context)->pathExpression, message, destinationList, exceptionList, NULL, /*we do not reference any output trees*/ NULL, NULL);