public object Evaluate(string statement, IEnumerable <KeyValuePair <string, object> > args) { CheckActive(); var session = _server.Connect(new SessionInfo()); var process = session.StartProcess(new ProcessInfo()); DataParam[] paramsValue = DataFhirMarshal.ArgsToDataParams(process, args); var result = Execute(process, statement, paramsValue); return(result); }
private DataFhirServerResult Execute(IServerProcess process, string statement, DataParam[] paramsValue) { IServerScript script = process.PrepareScript(statement); try { if (script.Batches.Count != 1) { throw new ArgumentException("Execution statement must contain one, and only one, batch."); } IServerBatch batch = script.Batches[0]; DataParams dataParams = DataFhirMarshal.ParamsArrayToDataParams(process, paramsValue); DataFhirServerResult result = new DataFhirServerResult(); result.Params = paramsValue; if (batch.IsExpression()) { IServerExpressionPlan expressionPlan = batch.PrepareExpression(dataParams); try { if (expressionPlan.DataType is TableType) { IServerCursor cursor = expressionPlan.Open(dataParams); try { result.Value = DataFhirMarshal.ServerCursorToValue(process, cursor); } finally { expressionPlan.Close(cursor); } } else { using (IDataValue tempValue = expressionPlan.Evaluate(dataParams)) { result.Value = DataFhirMarshal.DataValueToValue(process, tempValue); } } } finally { batch.UnprepareExpression(expressionPlan); } } else { IServerStatementPlan statementPlan = batch.PrepareStatement(dataParams); try { statementPlan.Execute(dataParams); } finally { batch.UnprepareStatement(statementPlan); } } //DotNetMarshal.SetNativeOutputParams(process, result.Params, dataParams); return(result); } finally { process.UnprepareScript(script); } }