Changes additional information / documentation of a method in the EDMdatabase.
The purpose of the user defined method signatures is to provide information about the methods and their input parameters to the users. The methods in question are Express-X mapping schemas and query functions.
This is the only way to add classification and description to a query function method. For Express-X schema maps, this information may also be given by edmiRemoteDefineMethodsignature.
Header:
#include "sdai.h"
Prototype:
EdmiError edmiRemoteModifyMethodSignature(SdaiServerContext serverContextId,
SdaiString methodType,
SdaiString methodName,
SdaiString schemaName,
SdaiString methodClass,
SdaiPrimitiveType returnValueDataType,
SdaiInstance returnValueDomainId,
SdaiString parameterNames[],
SdaiPrimitiveType parameterDatatype[],
SdaiInstance parameterDomainIds[],
SdaiString description,
SdaiInvocationId *edmiInvocationId);
Arguments:
serverContextId |
Context identification, from edmiDefineServerContext |
methodType |
"XPX" if the method is an Express-X Schema Map. |
methodName |
If the method is an Express-X Schema Map, this shall be the method name that was assigned to the method when it was defined with edmiDefineMethodSignature. |
schemaName |
If the method is an Express-X Schema Map, this variable shall be the name of the mapping schema. E.g "MySchemaMap". |
methodClass |
User defined classification of the method. This parameter is optional: Examples: ifc_checkin, ifc_checkout, ifc_heal. |
returnValueDataType |
|
returnValueDomainId |
|
parameterNames[] |
NULL terminated list of parameter names |
parameterDatatype[] |
list of parameter data types |
parameterDomainIds[] |
Optional, zero terminated buffer of parameter domainIds. |
description |
User added information/documentation, explaining the purpose of the method. |
edmiInvocationId |
Currently not used. |
Returns:
A completion code of datatype EdmiError is the returned function value. The completion code has the following values:
Completion code = 0 : Operation successfully performed.
Completion code != 0: Error in operation. Completion code is an _EDMinterface_ error code. Use edmiGetErrorText to get the error text corresponding to the error code.
Example:
EdmiError rstat;
SdaiInteger nErr, nWrn;
SdaiServerContext myContext;
/* Define Remote Server Context */
rstat = edmiDefineServerContext("MyRemoteServerContext",
"Johnny", "Supervisor", "cf37ftr",
"TCP", "9090", "MyServerHost",
NULL, NULL, NULL, NULL, NULL, &myContext);
/* Define Schemas */
rstat = edmiRemoteDefineSchema(myContext, EXPRESS_SCHEMA_TYPE,
"c:/data/person.exp", "c:/temp/person.dia", "Person",
DELETING_EXISTING_SCHEMAS | STORING_SOURCE,
&nWrn, &nErr, NULL);
rstat = edmiRemoteDefineSchema(myContext, EXPRESS_X_SCHEMA_TYPE,
"c:/data/person_maps.xpx", "c:/temp/person_maps.dia",
"InsertPerson", DELETING_EXISTING_SCHEMAS | STORING_SOURCE,
&nWrn, &nErr, NULL);
rstat = edmiRemoteDefineSchema(myContext, QUERY_SCHEMA_TYPE,
"c:/data/person_queries.xpx", "c:/temp/person_queries.dia",
"queries", DELETING_EXISTING_SCHEMAS | STORING_SOURCE,
&nWrn, &nErr, NULL);
/* Define XPX Method Signature */
{
SdaiString _parNamesXpx[4] = {"Name", "Sex", "Weight", NULL};
SdaiPrimitiveType _parTypesXpx[3] = {sdaiSTRING, sdaiINTEGER, sdaiREAL};
rstat = edmiRemoteDefineMethodSignature(myContext, "XPX",
"Insert a Person", "InsertPerson",
"CLASS_INPUT", _parNamesXpx, _parTypesXpx,
"Inserts a new person", NULL);
}
/* Get QEX Method Signature */
{
SdaiInstance _qexMethodId;
SdaiString _qexMethodClass, _qexDesc, *_qexArgNames;
SdaiPrimitiveType _qexReturnType, *_qexArgTypes;
SdaiInteger _nArgs;
rstat = edmiRemoteGetMethodSignatureBN(myContext, "QEX",
"SexHeavierThan", "Person.Queries",
&_qexMethodId, &_qexMethodClass,
&_nArgs, &_qexReturnType, &_qexArgNames,
&_qexArgTypes, &_qexDesc, NULL);
}
/* Modify QEX Method Signature */
rstat = edmiRemoteModifyMethodSignature(myContext, "QEX",
"SexHeavierThan", "Person.Queries", "CLASS_OUTPUT",
NULL, NULL, "Returns all persons of a given sex \
exceeding a given threshold weight", NULL);
/* List Query Method Signatures */
{
SdaiString _typeFilter = "method_type = QEX";
SdaiString _nameFilter = "name LIKE 'SEX*'";
SdaiString _schemaFilter = "name = 'PERSON'";
SdaiString _extraSchemaFilter = "name = 'QUERIES'";
SdaiString _classFilter = "class = 'CLASS_OUTPUT'";
SdaiString _ownerFilter = NULL;
SdaiString _groupFilter = NULL;
SdaiString *_methodNames = NULL;
rstat = edmiRemoteListMethodSignatures(myContext, _typeFilter,
_nameFilter, _schemaFilter, _extraSchemaFilter,
_classFilter, _ownerFilter, _groupFilter, 0,
&_methodNames, NULL);
while(*_methodNames) {
printf("\nMethod %s", *_methodNames);
++_methodNames;
}
}
/* Delete the XPX Method Signature */
edmiRemoteDeleteMethodSignature(myContext, "XPX",
"INSERT A PERSON", "InsertPerson", NULL);
. . .
Express Schema
– --------------------------------------------------------------
– File : c:/data/person.exp
– --------------------------------------------------------------
SCHEMA person;
ENTITY aperson;
name : STRING;
sex : STRING;
weight : REAL;
END_ENTITY;
END_SCHEMA;
Express-X Schema
– --------------------------------------------------------------
– File : c:/data/person_maps.xpx
– --------------------------------------------------------------
SCHEMA_MAP InsertPerson;
GLOBAL
DECLARE src INSTANCE OF SOURCE_SCHEMA person;
DECLARE tar INSTANCE OF TARGET_SCHEMA person;
END_GLOBAL;
STATEMENTS;
LOCAL
npar : INTEGER;
fail : BOOLEAN := FALSE;
name : STRING;
sex : INTEGER;
weight : REAL;
parType : INTEGER;
END_LOCAL;
IF (xpxGetNumberOfUserParameters() = 3) THEN
xpxGetUserParameter(1, name);
xpxGetUserParameter(2, sex);
xpxGetUserParameter(3, weight);
xpxCreateInstanceAndPutAttrsBN(XPXTARGETMODELID, "aperson", 3,
xpxSTRING, name, xpxINTEGER, sex, xpxREAL, weight);
}
END_STATEMENTS;
END_SCHEMA_MAP;
Query Schema.
– --------------------------------------------------------------
– File : c:/data/person_queries.qex
– --------------------------------------------------------------
QUERY_SCHEMA queries FOR person;
GLOBAL
DECLARE src INSTANCE OF person;
END_GLOBAL;
VIEW_ENTITY PersonView;
name : STRING;
sex : INTEGER;
weight : REAL;
END_VIEW_ENTITY;
QUERY_FUNCTION SexHeavierThan ( p_sex:INTEGER; p_weight:REAL)
: SET OF PersonView;
LOCAL
result : SET of PersonView;
currView : PersonView;
END_LOCAL;
FROM(s:src::aperson)
WHEN TRUE;
BEGIN
IF((s.sex = p_sex) AND (s.weight > p_weight)) THEN
NEW currView;
currView.name := s.name;
currView.sex := s.sex;
currView.weight := s.weight;
result ++ currView;
END_IF;
END;
RETURN(result);
END_QUERY_FUNCTION;
END_QUERY_SCHEMA;