Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Current »


 
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.
"QEX" if the method is a query function.

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.
If the method is a query function, the method name shall be the name of the query function it self.

schemaName

If the method is an Express-X Schema Map, this variable shall be the name of the mapping schema. E.g "MySchemaMap".
If the method is a query function, this variable shall be the name of the query schema containing the query in question, qualified with the name of the parent Express schema. E.g: "MySchema.MyQuerySchema"

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;

  • No labels