Ejemplo n.º 1
0
        public async Task <ServerCommandResult> Execute(RequestCommand cmd, ExpandoObject dataToExec)
        {
            if (String.IsNullOrEmpty(cmd.procedure))
            {
                throw new RequestModelException("A procedure must be specified for sql-type command");
            }
            IDataModel model = await _dbContext.LoadModelAsync(cmd.CurrentSource, cmd.CommandProcedure, dataToExec, cmd.commandTimeout);

            //_host.CheckTypes(cmd.Path, cmd.checkTypes, model);

            String invokeTarget = cmd.GetInvokeTarget();

            if (invokeTarget != null)
            {
                var clr = new ClrInvoker();
                clr.EnableThrow();
                clr.Invoke(invokeTarget, dataToExec);                 // after execute
            }
            var r = new ServerCommandResult();

            if (model == null)
            {
                r.Data = "{}";
            }
            else
            {
                r.Data = JsonConvert.SerializeObject(model.Root, JsonHelpers.StandardSerializerSettings);
            }
            return(r);
        }
Ejemplo n.º 2
0
        public IModelHandler GetHookHandler()
        {
            if (String.IsNullOrEmpty(hook))
            {
                return(null);
            }
            var regex = new Regex(@"^\s*clr-type\s*:\s*([\w\.]+)\s*;\s*assembly\s*=\s*([\w\.]+)\s*$");
            var match = regex.Match(hook);

            if (match.Groups.Count != 3)
            {
                String errorMsg = $"Invalid hook definition: '{hook}'. Expected: 'clr-type:TypeName;assembly=AssemblyName'";
                throw new RequestModelException(errorMsg);
            }
            String assemblyName = match.Groups[2].Value;
            String typeName     = match.Groups[1].Value;

            var modelHandler = System.Activator.CreateInstance(assemblyName: assemblyName, typeName: typeName,
                                                               ignoreCase: false, bindingAttr: 0,
                                                               binder: null,
                                                               args: null,
                                                               culture: null,
                                                               activationAttributes: null).Unwrap();

            if (!(modelHandler is IModelHandler))
            {
                throw new RequestModelException($"{typeName} must implement interface IModelHandler");
            }

            ClrInvoker.CallInject(modelHandler);
            return(modelHandler as IModelHandler);
        }
Ejemplo n.º 3
0
        internal async Task SaveDataObj(Action <ExpandoObject> setParams, ExpandoObject dataToSave, TextWriter writer)
        {
            String baseUrl = dataToSave.Get <String>("baseUrl");

            if (NormalizeBaseUrl != null)
            {
                baseUrl = NormalizeBaseUrl(baseUrl);
            }
            ExpandoObject data = dataToSave.Get <ExpandoObject>("data");
            var           rm   = await RequestModel.CreateFromBaseUrl(_host, baseUrl);

            RequestView rw   = rm.GetCurrentAction();
            var         prms = new ExpandoObject();

            setParams?.Invoke(prms);
            prms.Append(rw.parameters);
            CheckUserState(prms);
            IDataModel model = null;

            IModelHandler handler      = rw.GetHookHandler();
            String        invokeTarget = rw.GetInvokeTarget();

            if (handler != null)
            {
                Int64 userId  = prms.Get <Int64>("UserId");
                var   handled = await handler.BeforeSave(userId, data);

                if (!handled)
                {
                    model = await _dbContext.SaveModelAsync(rw.CurrentSource, rw.UpdateProcedure, data, prms);

                    await handler.AfterSave(userId, data, model.Root);
                }
            }
            else if (invokeTarget != null)
            {
                model = await _dbContext.SaveModelAsync(rw.CurrentSource, rw.UpdateProcedure, data, prms);

                var clr = new ClrInvoker();
                clr.EnableThrow();
                clr.Invoke(invokeTarget, prms);                 // after save
            }
            else
            {
                model = await _dbContext.SaveModelAsync(rw.CurrentSource, rw.UpdateProcedure, data, prms);
            }
            var eh = rw?.events?.afterSave;

            if (eh != null)
            {
                // new model data
                await _dbContext.SaveModelAsync(eh.CurrentSource(rw), eh.UpdateProcedure(rw), model.Root, prms);
            }
            WriteDataModel(model, writer);
        }
Ejemplo n.º 4
0
        async Task <Object> DoUploadClr(RequestFile ru, ExpandoObject prms)
        {
            var    invoker = new ClrInvoker();
            Object result;

            if (ru.async)
            {
                result = await invoker.InvokeAsync(ru.clrType, prms);
            }
            else
            {
                result = invoker.Invoke(ru.clrType, prms);
            }
            return(result);
        }
Ejemplo n.º 5
0
        async Task ExecuteClrCommand(RequestCommand cmd, ExpandoObject dataToInvoke, Guid apiGuid)
        {
            TextWriter writer = Response.Output;

            if (String.IsNullOrEmpty(cmd.clrType))
            {
                throw new RequestModelException($"clrType must be specified for command '{cmd.command}'");
            }
            var invoker = new ClrInvoker();

            invoker.SetRequestInfo(RequestInfo);
            Object result = null;

            if (cmd.async)
            {
                result = await invoker.InvokeAsync(cmd.clrType, dataToInvoke, apiGuid);
            }
            else
            {
                result = invoker.Invoke(cmd.clrType, dataToInvoke, apiGuid);
            }
            if (result == null)
            {
                return;
            }
            if (result is String)
            {
                _logger.LogApi($"response: {result}", Request.UserHostAddress, apiGuid);
                writer.Write(result.ToString());
            }
            else if (result is XDocument xDoc)
            {
                Response.ContentType = "text/xml";
                using (var xmlWriter = XmlWriter.Create(writer))
                {
                    xDoc.WriteTo(xmlWriter);
                }
            }
            else
            {
                String json = JsonConvert.SerializeObject(result, JsonHelpers.StandardSerializerSettings);
                _logger.LogApi($"response: {json}", Request.UserHostAddress, apiGuid);
                writer.Write(json);
            }
        }
Ejemplo n.º 6
0
        async Task ExecuteSqlCommand(RequestCommand cmd, ExpandoObject dataToExec, TextWriter writer)
        {
            if (String.IsNullOrEmpty(cmd.procedure))
            {
                throw new RequestModelException("A procedure must be specified for sql-type command");
            }
            IDataModel model = await _dbContext.LoadModelAsync(cmd.CurrentSource, cmd.CommandProcedure, dataToExec, cmd.commandTimeout);

            String invokeTarget = cmd.GetInvokeTarget();

            if (invokeTarget != null)
            {
                var clr = new ClrInvoker();
                clr.EnableThrow();
                clr.Invoke(invokeTarget, dataToExec);                 // after execute
            }
            WriteDataModel(model, writer);
        }
Ejemplo n.º 7
0
        async Task ExecuteClrCommand(RequestCommand cmd, ExpandoObject dataToExec, TextWriter writer)
        {
            if (String.IsNullOrEmpty(cmd.clrType))
            {
                throw new RequestModelException($"clrType must be specified for command '{cmd.command}'");
            }
            var    invoker = new ClrInvoker();
            Object result;

            if (cmd.async)
            {
                result = await invoker.InvokeAsync(cmd.clrType, dataToExec);
            }
            else
            {
                result = invoker.Invoke(cmd.clrType, dataToExec);
            }
            writer.Write(JsonConvert.SerializeObject(result, StandardSerializerSettings));
        }
Ejemplo n.º 8
0
        public async Task <ServerCommandResult> Execute(RequestCommand cmd, ExpandoObject dataToExec)
        {
            if (String.IsNullOrEmpty(cmd.clrType))
            {
                throw new RequestModelException($"clrType must be specified for command '{cmd.command}'");
            }
            var    invoker = new ClrInvoker();
            Object result;

            if (cmd.async)
            {
                result = await invoker.InvokeAsync(cmd.clrType, dataToExec);
            }
            else
            {
                result = invoker.Invoke(cmd.clrType, dataToExec);
            }
            return(new ServerCommandResult(JsonConvert.SerializeObject(result, JsonHelpers.StandardSerializerSettings)));
        }
Ejemplo n.º 9
0
        async Task ExecuteClrCommand(RequestCommand cmd, ExpandoObject dataToInvoke)
        {
            TextWriter writer = Response.Output;

            if (String.IsNullOrEmpty(cmd.clrType))
            {
                throw new RequestModelException($"clrType must be specified for command '{cmd.command}'");
            }
            var    invoker = new ClrInvoker();
            Object result  = null;

            if (cmd.async)
            {
                result = await invoker.InvokeAsync(cmd.clrType, dataToInvoke);
            }
            else
            {
                result = invoker.Invoke(cmd.clrType, dataToInvoke);
            }
            if (result == null)
            {
                return;
            }
            if (result is String)
            {
                writer.Write(result.ToString());
            }
            else if (result is XDocument xDoc)
            {
                Response.ContentType = "text/xml";
                using (var xmlWriter = XmlWriter.Create(writer))
                {
                    xDoc.WriteTo(xmlWriter);
                }
            }
            else
            {
                writer.Write(JsonConvert.SerializeObject(result, BaseController.StandardSerializerSettings));
            }
        }