示例#1
0
        public ActionResult ExecuteScript([FromRoute] Guid server, [FromRoute] Guid database, [FromRoute] Guid script)
        {
            DatabaseServer srv = Metadata.Servers.Where(srv => srv.Identity == server).FirstOrDefault();

            if (srv == null)
            {
                return(NotFound());
            }
            DatabaseInfo db = srv.Databases.Where(db => db.Identity == database).FirstOrDefault();

            if (db == null)
            {
                return(NotFound());
            }
            MetaScript scr = db.Scripts.Where(scr => scr.Identity == script).FirstOrDefault();

            if (scr == null)
            {
                return(NotFound());
            }

            Dictionary <string, object> parameters = ParseParameters(HttpContext);

            string responseJson = "[]";
            string errorMessage = string.Empty;

            string sourceCode = ReadScriptSourceCode(srv, db, scr);

            IMetadataService metadata = Services.GetService <IMetadataService>();

            metadata.AttachDatabase(string.IsNullOrWhiteSpace(srv.Address) ? srv.Name : srv.Address, db);
            metadata.UseCredentials(db.UserName, db.Password);

            IScriptingService  scripting   = Services.GetService <IScriptingService>();
            string             sql         = string.Empty;
            IList <ParseError> parseErrors = null;

            if (parameters.Count > 0)
            {
                sql = scripting.PrepareScript(sourceCode, parameters, out parseErrors);
            }
            else
            {
                sql = scripting.PrepareScript(sourceCode, out parseErrors);
            }
            foreach (ParseError error in parseErrors)
            {
                errorMessage += error.Message + Environment.NewLine;
            }
            if (parseErrors.Count > 0)
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, errorMessage));
            }

            try
            {
                responseJson = scripting.ExecuteJson(sql, out IList <ParseError> executeErrors);
                foreach (ParseError error in executeErrors)
                {
                    errorMessage += error.Message + Environment.NewLine;
                }
                if (executeErrors.Count > 0)
                {
                    return(StatusCode(StatusCodes.Status500InternalServerError, errorMessage));
                }
            }
            catch (Exception ex)
            {
                errorMessage = ExceptionHelper.GetErrorText(ex);
                return(StatusCode(StatusCodes.Status500InternalServerError, errorMessage));
            }

            return(Content(responseJson));
        }