1. The calling QEX methods:
-- ------------------------------------------------------------------------
-- Author : Olav Liestøl, EPM Technology A/S
-- Description : Test
-- ------------------------------------------------------------------------
QUERY_SCHEMA test_cpp_plugin FOR ap209_multidisciplinary_analysis_and_design_mim_lf;
GLOBAL
DECLARE src INSTANCE OF ap209_multidisciplinary_analysis_and_design_mim_lf;
END_GLOBAL;
VIEW_ENTITY result_value;
elementId: STRING;
varableName: STRING;
fieldVarId: INTEGER;
END_VIEW_ENTITY;
VIEW_ENTITY query_results;
status: STRING;
variable_values : LIST OF result_value;
END_VIEW_ENTITY;
VIEW_ENTITY variable_def;
selectName: STRING;
variableName: STRING;
END_VIEW_ENTITY;
VIEW_ENTITY variable_definitions;
status: STRING;
definitions : LIST OF variable_def;
END_VIEW_ENTITY;
QUERY_FUNCTION GetFemResults (repositoryName, modelName, loadCase : STRING; variables : LIST OF STRING) : STRING;
LOCAL
vars : LIST OF INTEGER;
rk : STRING;
result : query_results;
END_LOCAL;
vars ++ 29;
vars ++ 30;
vars ++ 31;
vars ++ 32;
result := xpfCppPluginInvoke('AP209queriesBin', 'AP209qexQueries.dll', 'getFemResults',
'InitialRepository', 'AP209_2', vars, vars, '*', 0, 10);
Return (result.status);
END_QUERY_FUNCTION;
QUERY_FUNCTION GetVariableDefinitions : LIST OF STRING;
LOCAL
result : variable_definitions;
output : LIST OF STRING;
o : STRING;
END_LOCAL;
result := xpfCppPluginInvoke('AP209queriesBin', 'AP209qexQueries.dll', 'getVariableDefinitions');
REPEAT i:=1 TO xpfSizeOf(result.definitions);
o := result.definitions[i].variableName;
output ++ o;
END_REPEAT;
Return (output);
END_QUERY_FUNCTION;
END_QUERY_SCHEMA;
2. The called C++ plugin:
#include "stdafx.h"
#include "AP209queries.h"
#include "AP209qexQueries.h"
/*===================================================================================================================*/
AP209qexQueries::AP209qexQueries(Database *_db, Repository *_rep, AP209model *_m)
/*===================================================================================================================*/
{
dllMa = new CMemoryAllocator(0x100000); resultMa = NULL; db = _db; rep = _rep; m = _m;
}
/*===================================================================================================================*/
AP209qexQueries::~AP209qexQueries()
/*===================================================================================================================*/
{
if (resultMa) delete resultMa;
delete dllMa;
}
/*===================================================================================================================*/
void AP209qexQueries::openModel(char *repName, char *modelName)
/*===================================================================================================================*/
{
rep->init(db, repName);
m->open(modelName, sdaiRO);
}
/*===================================================================================================================*/
EDMLONG AP209qexQueries::getFemResults(char *rep, char *model, char *parameterString, SdaiAggr variableIds, tSdaiSelect *returnValue,
int maxNoOfResultsReturned, int firstResultReturned)
/*===================================================================================================================*/
{
EdmiError rstat = OK;
Container<EDMULONG> varTypes(m->getMemoryAllocator());
InstanceId resId, qresId;
SdaiAggr vvAggrId;
ADB myADB;
openModel(rep, model);
AP209queries query(m);
Iterator<EDMULONG, ap209::entityType> varTypeIter(variableIds, m);
for (EDMULONG var=varTypeIter.first(); varTypeIter.moreElems(); var=varTypeIter.next()) {
varTypes.add(var);
}
Container<femResult> *results = query.getResults(parameterString, &varTypes, maxNoOfResultsReturned, firstResultReturned) ;
CHECK(vmCreateInstanceBN ("ap209_multidisciplinary_analysis_and_design_mim_lf", "test_cpp_plugin", "query_results", &qresId));
myADB.type = sdaiSTRING; myADB.value.stringVal = "OK"; myADB.value_set = true;
CHECK(vmPutAttrBN(qresId, "status", &myADB));
returnValue->type = sdaiINSTANCE; returnValue->value.instVal = qresId; returnValue->nTypes = 0;
CHECK(vmCreateAggrBN (qresId, "variable_values", &vvAggrId));
for (femResult *res = results->firstp(); res; res = results->nextp()) {
CHECK(vmCreateInstanceBN ("ap209_multidisciplinary_analysis_and_design_mim_lf", "test_cpp_plugin", "result_value", &resId));
myADB.type = sdaiINSTANCE; myADB.value.instVal = resId; myADB.value_set = true;
CHECK(vmAddToAggr(vvAggrId, &myADB));
}
return rstat;
}
/*===================================================================================================================*/
EDMLONG AP209qexQueries::getVariableDefinitions(tSdaiSelect *returnValue)
/*===================================================================================================================*/
{
EdmiError rstat = OK;
int nOfVars;
AP209queries query(m);
InstanceId vardefId, defsId;
SdaiAggr defsAggrId;
ADB myADB;
FieldVariableDescriptor *fvDescriptors = query.getTheFieldVariableDescriptors(&nOfVars);
CHECK(vmCreateInstanceBN ("ap209_multidisciplinary_analysis_and_design_mim_lf", "test_cpp_plugin", "variable_definitions", &defsId));
myADB.type = sdaiSTRING; myADB.value.stringVal = "OK"; myADB.value_set = true;
CHECK(vmPutAttrBN(defsId, "status", &myADB));
returnValue->type = sdaiINSTANCE; returnValue->value.instVal = defsId; returnValue->nTypes = 0;
CHECK(vmCreateAggrBN (defsId, "definitions", &defsAggrId));
for (int i=0; i < nOfVars; i++) {
CHECK(vmCreateInstanceBN ("ap209_multidisciplinary_analysis_and_design_mim_lf", "test_cpp_plugin", "variable_def", &vardefId));
myADB.type = sdaiINSTANCE; myADB.value.instVal = vardefId; myADB.value_set = true;
CHECK(vmAddToAggr(defsAggrId, &myADB));
myADB.type = sdaiSTRING;
myADB.value.stringVal = fvDescriptors[i].selectName; CHECK(vmPutAttrBN(vardefId, "selectName", &myADB));
myADB.value.stringVal = fvDescriptors[i].variableName; CHECK(vmPutAttrBN(vardefId, "variableName", &myADB));
}
return rstat;
}
/*================================================================================================*/
void myExceptionHandler(EDMLONG errcode, char *message, char *file, int lineNo)
/*================================================================================================*/
{
throw new CedmError(errcode,message,file, lineNo);
}
/*===================================================================================================================*/
extern "C" EDMLONG DLL_EXPORT dll_main(char *methodName, tSdaiSelect *inputParameters, EDMINT nOfParameters,
tSdaiSelect *returnValue)
/*===================================================================================================================*/
{
EdmiError rstat = OK;
try {
defineExceptionHandler(&myExceptionHandler);
CMemoryAllocator the_ma(0x100000);
Database the_db("", "", "");
Repository the_rep(&the_db, "");
AP209model the_model(&the_ma, &the_rep);elementelement
AP209qexQueries queryEngine(&the_db, &the_rep, &the_model);
if (strEQL(methodName, "getFemResults")) {
rstat = queryEngine.getFemResults(inputParameters[0].value.stringVal, inputParameters[1].value.stringVal, inputParameters[4].value.stringVal,
inputParameters[2].value.aggrVal, returnValue, inputParameters[4].value.intVal, inputParameters[5].value.intVal);
} else if (strEQL(methodName, "getVariableDefinitions")) {
rstat = queryEngine.getVariableDefinitions(returnValue);
}
} catch (CedmError *e) {
rstat = e->rstat; delete e;
} catch (...) {
rstat = sdaiESYSTEM;
}
return rstat;
}
extern "C" EDMLONG DLL_EXPORT dll_version()
{
return 1;
}
extern "C" void DLL_EXPORT *dll_malloc(void *threadObject, EDMLONG bufSize)
{
AP209qexQueries *plugin = (AP209qexQueries*)threadObject;
if (plugin) {
return plugin->alloc(bufSize);
} else {
return NULL;
}
}
extern "C" EDMLONG DLL_EXPORT dll_freeAll(void *threadObject)
{
AP209qexQueries *plugin = (AP209qexQueries*)threadObject;
delete plugin;
return OK;
}