この関数を使用して、path 引数により指定されたパスを表す SqlPathExpression オブジェクトを作成します。 パスのエレメントがまだ存在していないなら、パスをナビゲートしてもそれらのエレメントは作成されません。 この関数は、PathExpression オブジェクトへのポインターを戻します。これは、パスをナビゲートする関数、すなわち cniSqlNavigatePath ファミリーへの入力として使用されます。
式の作成にはオーバーヘッドが伴うため、すべてのメッセージに同じパス式が使用される場合には、この関数を 1 回呼び出し、戻された CciSqlPathExpression* を使用して、cniSqlNavigate をそれぞれのメッセージごとに呼び出すようにします。 作成されたスレッドとは別のスレッド上にある 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, /* do not reference Database*/
ucsPathExpressionString);
}
このコードは、フィールド CciSqlPathExpression* pathExpression を NODE_CONTEXT_ST 構造に追加することを前提にしています。
ここで、その CciSqlPathExpression を _Switch_evaluate 関数で使用できます。
CciElement* targetElement = cniSqlNavigatePath(
NULL,
((NODE_CONTEXT_ST *)context)->pathExpression,
message,
localEnvironment,
exceptionList,
NULL, /* do not reference any output trees*/
NULL,
NULL);