この関数を使用して、path 引数により指定されたパスを表す SqlPathExpression オブジェクトを作成します。 ナビゲートの際、パスのエレメントがまだ存在していないとしても、これが作成されます。この関数は、PathExpression オブジェクトへのポインターを戻します。これは、パスをナビゲートする関数、すなわち cniSqlNavigatePath ファミリーへの入力として使用されます。
式の作成にはオーバーヘッドが伴うため、すべてのメッセージに同じパス式が使用される場合には、この関数を 1 回呼び出し、戻された CciSqlPathExpression* を使用して、cniSqlNavigate をそれぞれのメッセージごとに呼び出すようにします。 作成されたスレッドとは別のスレッド上にある CciSqlPathExpression を使用することができます。
CciSqlPathExpression* cniSqlCreateModifiablePathExpression(
int* returnCode,
CciNode* nodeObject,
CciChar* dataSourceName,
CciChar* path);
成功した場合、SQLPathExpression オブジェクトのアドレスが戻されます。 エラーが発生した場合、CCI_NULL_ADDR が戻され、戻りコード・パラメーターがエラーの理由を示します。 SQLPathExpression が不要になったら (通常はノードが削除されるとき)、cniSqlDeletePathExpression を呼び出してそれを削除します。
以下のコードを Transform ノード・サンプルに追加することにより、1 回の関数呼び出しで、エレメントと必要な上位エレメントすべてを作成することができます。
以下のようにして、CciSQLPathExpression を _Transform_createNodeContext 関数で作成します。
{
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);
}
その後、この CciSqlPathExpression を、以下のように後で _Transform_evaluate 関数内で使用することができます。
{
CciElement* newElement =
cniSqlNavigatePath(
NULL,
((NODE_CONTEXT_ST *)context)->pathExpression,
message,
localEnvironment,
exceptionList,
outMsg,
NULL,/* do not reference OutputLocalEnvironment*/
NULL/* 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>