Crea un objeto SqlPathExpression modificable que representa la vía de acceso especificada por el argumento de la vía de acceso. Modificable significa que cuando se recorre, se crean elementos de vía de acceso si todavía no existen. Esta función devuelve un puntero al objeto PathExpression que se utiliza como entrada a las funciones que recorren la vía de acceso, es decir, la familia cniSqlNavigatePath. Al crear la expresión se genera una carga general, de forma que si la misma expresión de vía de acceso se va a utilizar para cada mensaje, entonces esta función debe llamarse una vez y el objeto CciSqlPathExpression* que se devuelve debe utilizarse en una llamada a cniSqlNavigate para cada mensaje. Es posible utilizar CciSqlPathExpression en una hebra distinta de la que se ha creado.
CciSqlPathExpression* cniSqlCreateModifiablePathExpression( int* returnCode, CciNode* nodeObject, CciChar* dataSourceName, CciChar* path);
Si la ejecución se realiza satisfactoriamente, se devuelve la dirección del objeto SQLPathExpression. Si se produce un error, se devuelve CCI_NULL_ADDR y el parámetro del código de retorno indica el motivo del error. Una vez ya no se necesita SQLPathExpression, (normalmente cuando se suprime el nodo) debe suprimirse llamando a cniSqlDeletePathExpression.
Añadiendo el código siguiente al ejemplo de nodo Transform, podríamos crear fácilmente un elemento y todos los elementos ascendientes necesarios, con una llamada a una función.
Creamos CciSQLPathExpression en la función _Transform_createNodeContext:
{ CciChar ucsPathExpressionString[32]; char* mbPathExpressionString = "OutputRoot.XML.Request.A.B.C.D.E"; /* convertir la serie de vía de acceso a unicode*/ cciMbsToUcs(NULL, mbPathExpressionString, ucsPathExpressionString, 32, BIP_DEF_COMP_CCSID); p->pathExpression = cniSqlCreateModifiablePathExpression( NULL, nodeObject, NULL, /*no se hace referencia a base de datos*/ ucsPathExpressionString); }
y luego podemos utilizar este objeto CciSqlPathExpression en la función _Transform_evaluate
{ CciElement* newElement = cniSqlNavigatePath( NULL, ((NODE_CONTEXT_ST *)context)->pathExpression, message, destinationList, exceptionList, outMsg, NULL, /*no se hace referencia a OutputLocalEnvironment*/ NULL/*no se hace referencia a OutputLExceptionList*/); }
Así, al pasar el mensaje de entrada PluginSample.change.xml:
<Request type="change"> <CustomerAccount>01234567</CustomerAccount> <CustomerPhone>555-0000</CustomerPhone> </Request>
veríamos el siguiente mensaje de salida.
<Request type="modify"> <CustomerAccount>01234567</CustomerAccount> <CustomerPhone>555-0000</CustomerPhone> <A> <B> <C> <D/> </C> </B> </A> </Request>