Reads the additional information / documentation of a method, identified by its method name, in a remote 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.
Related functions: edmiRemoteDefineMethodSignature, edmiRemoteDeleteMethodSignature, edmiRemoteGetMethodSignature, edmiRemoteListMethodSignatures, edmiRemoteModifyMethodSignature.
Header:
#include "sdai.h"
Prototype:
EdmiError edmiRemoteGetMethodSignatureBN(SdaiServerContext serverContextId,
SdaiString methodType,
SdaiString methodName,
SdaiString schemaName,
SdaiInstance *methodId,
SdaiString *methodClass,
SdaiInteger *arguments,
SdaiPrimitiveType *returnValueDatatype,
SdaiInstance *returnValueDomainId,
SdaiString **argumentNames,
SdaiPrimitiveType **argumentDatatypes,
SdaiInstance **argumentDomainIds,
SdaiString *description,
SdaiString *textualSignature,
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". |
methodId |
Variable that will receive the instance Id that uniquely identifies the method in the remote _EDMdatabase_ . This is an instance of the EDM_METHOD entity in the ExpressDataManager model |
methodClass |
Variable that will receive the optional and user defined method class. Method classification may be used to organize methods in the remote EDMdatabase |
arguments |
This variable will receive the number of input parameters for the given method. |
returnValueDatatype |
Variable that will receive the type of the return value from the method. This is only applicable for query function methods. |
returnValueDomainId |
|
argumentNames |
A buffer that will receive a null terminated list of the input parameter names. |
argumentDatatypes |
A buffer that will receive a list of the input parameter types that correspond to the argument names in <argumentNames> |
argumentDomainIds |
|
description |
Variable that will receive the user defined description of the method. |
textualSignature |
Optional, method signature in text. |
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;
}
}
. . .
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;