cniSqlCreateModifyablePathExpression

创建可修改的 SqlPathExpression 对象,此对象表示路径参数所指定的路径。可修改意味着,当浏览时如果路径元素尚未存在,则将创建它们。此函数将指针返回到 PathExpression 对象,从而用作浏览路径的函数(即 cniSqlNavigatePath 系列)的输入。创建此表达式时会产生开销,因此如果您要对每个消息是使用同一路径表达式,则应调用一次此函数,并且应在调用 cniSqlNavigate 时对每个消息使用返回的 CciSqlPathExpression*。您可以在不同于创建 CciSqlPathExpression 的线程上使用此对象。

语法

CciSqlPathExpression* cniSqlCreateModifiablePathExpression( 
  int*                returnCode,
  CciNode*           nodeObject,
  CciChar*           dataSourceName,
CciChar* path );

参数

returnCode(输出)
NULL 指针输入表示用户定义的节点不要处理错误。在执行此调用期间别的任何异常都重新抛出到流中的下一个上行节点。如果输入不是 NULL,则输出表示调用的成功状态。如果执行期间发生异常,则 *returnCode 设置为输出上的 CCI_EXCEPTION。如果调用 cciGetLastExceptionData,则将提供异常的详细信息。如果传递了无效的 nodeObject 参数,则 returnCode 将设置为 CCI_INV_NODE_OBJECT。如果传递了无效的路径参数(如 NULL 或空字符串),则 returnCode 将设置为 CCI_INV_ESQL_PATH_EXPR。
nodeObject(输入)
指定 ESQL 路径表达式所属的消息流处理节点。此指针被传递到 cniCreateNodeContext 实施函数。该参数不能为 NULL。
dataSourceName(输入)
如果语句引用外部数据库,则它是要使用的 ODBC 数据源名称。该参数可以为 NULL。
path(输入)
此指针指向以 NULL 结束的 CciChars 字符串。它按 ESQL 字段引用语法图所定义的那样指定要创建的 ESQL 路径表达式,但它不能包含本地 ESQL 变量、ESQL 引用变量、用户定义的函数、ESQL 名称空间常量,这是因为它们无法进行声明。该参数不能为 NULL。

返回值

如果成功,则会返回 SQLPathExpression 对象的地址。如果发生错误,则会返回 CCI_NULL_ADDR,并且此返回码参数会表明发生错 误的原因。一旦不再需要 SQLPathExpression(通常在删除节点时),应通过调用 cniSqlDeletePathExpression 来删除它。

示例

将以下代码添加到 Transform 节点样本后,只需进行一次函数调用就能很容易地创建元素以及所有必需的祖代。

我们将在 _Transform_createNodeContext 函数中创建 CciSQLPathExpression

 {
        CciChar ucsPathExpressionString[32];
        char*   mbPathExpressionString =
                           "OutputRoot.XML.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,/*we do not reference Database*/
                                 ucsPathExpressionString);
    }

稍后,我们则可以在 _Transform_evaluate 函数中使用 CciSqlPathExpression

{
      CciElement* newElement = 
               cniSqlNavigatePath(
                     NULL,
                    ((NODE_CONTEXT_ST *)context)->pathExpression,
                     message,
                                                  destinationList, 
                                                  exceptionList, 
                     outMsg,
                     NULL,/*we do not reference OutputLocalEnvironment*/
                     NULL/*we do not reference OutputLExceptionList*/);
}

因此在输入消息 PluginSample.change.xml 中传递:

<Request
type="change">
  <CustomerAccount>01234567</CustomerAccount>
  <CustomerPhone>555-0000</CustomerPhone>
</Request>

我们将看到以下输出消息。

<Request
type="modify">
  <CustomerAccount>01234567</CustomerAccount>
  <CustomerPhone>555-0000</CustomerPhone>
  <A>
    <B>
      <C>
        <D/>
      </C>
    </B>
  </A>
</Request>
使用此方法(而不是使用 cniCreateElementAsLastChild 等)具有以下优点:
  • 路径更动态 - 路径字符串可以在部署时确定,例如,根据节点属性来确定(我们可以在 cniSetAttribute 实施函数中创建 CciSQLPathExpression)。
  • 当浏览至此元素并对它进行创建时,我们仅作一次函数调用(而非多次)。当目标元素在树结构的深处时,此优点将更明显。
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
as08032_