コード例 #1
0
ファイル: ModelCopier.cs プロジェクト: anthrax3/PJCAdmin
        public static RoutineModel copyRoutineToModel(Routine r)
        {
            if (r == null)
            {
                return(null);
            }

            RoutineModel newRoutine = new RoutineModel()
            {
                expectedDuration = r.expectedDuration,
                isNotifiable     = r.isNotifiable,
                isTimed          = r.isTimed,
                routineTitle     = r.routineTitle,
                assigneeUserName = r.assigneeUserName,
                isDisabled       = r.isDisabled,
            };

            foreach (Task t in r.Tasks)
            {
                newRoutine.Tasks.Add(copyTaskToModel(t));
            }

            foreach (Feedback f in r.Feedbacks)
            {
                newRoutine.Feedbacks.Add(copyFeedbackToModel(f));
            }

            return(newRoutine);
        }
コード例 #2
0
        private static string GenerateMultiResultStatement(Routine procedure, RoutineModel model, bool useAsyncCalls)
        {
            if (procedure.Results.Count == 1)
            {
                return(null);
            }

            var ids = new List <string>();
            int i   = 1;

            foreach (var resultSet in procedure.Results)
            {
                var suffix = $"{i++}";

                var typeName = GenerateIdentifierName(procedure, model) + "Result" + suffix;

                if (useAsyncCalls)
                {
                    ids.Add($"(await reader.ReadAsync<{typeName}>()).ToList()");
                }
                else
                {
                    ids.Add($"(reader.Read<{typeName}>()).ToList()");
                }
            }

            return($"({string.Join(", ", ids)})");
        }
コード例 #3
0
ファイル: RoutineHelper.cs プロジェクト: anthrax3/PJCAdmin
        /* Creates a new routine for the given user from
         * the given model.
         * @param creatorUsername: The username of the
         * user who created the routine.
         * @param model: The model of the routine to create
         * from.
         */
        public void createRoutine(string creatorUsername, RoutineModel model)
        {
            Routine r = new Routine()
            {
                assigneeUserName = model.assigneeUserName,
                creatorUserName  = creatorUsername,
                expectedDuration = model.expectedDuration,
                isDisabled       = model.isDisabled,
                isNotifiable     = model.isNotifiable,
                isTimed          = model.isTimed,
                routineTitle     = model.routineTitle,
                updatedDate      = DateTime.Now
            };

            r = helper.createRoutine(r);

            foreach (TaskModel t in model.Tasks)
            {
                taskHelper.createTask(r.routineID, t);
            }

            foreach (FeedbackModel f in model.Feedbacks)
            {
                feedbackHelper.createRoutineFeedback(r.routineID, f);
            }
        }
コード例 #4
0
        private void GenerateOnModelCreating(RoutineModel model)
        {
            Sb.AppendLine();
            Sb.AppendLine("protected void OnModelCreatingGeneratedProcedures(ModelBuilder modelBuilder)");
            Sb.AppendLine("{");

            using (Sb.Indent())
            {
                foreach (var procedure in model.Routines.Cast <Procedure>())
                {
                    if (procedure.NoResultSet)
                    {
                        continue;
                    }

                    int i = 1;
                    foreach (var resultSet in procedure.Results)
                    {
                        var suffix = $"{i++}";

                        if (!procedure.SupportsMultipleResultSet)
                        {
                            suffix = string.Empty;
                        }

                        var typeName = GenerateIdentifierName(procedure, model) + "Result" + suffix;

                        Sb.AppendLine($"modelBuilder.Entity<{typeName}>().HasNoKey().ToView(null);");
                    }
                }
            }

            Sb.AppendLine("}");
        }
コード例 #5
0
        private void GenerateFunctionStub(Routine function, RoutineModel model)
        {
            var paramStrings = function.Parameters
                               .Select(p => $"{code.Reference(p.ClrType())} {p.Name}");

            var identifier = GenerateIdentifierName(function, model);

            _sb.AppendLine();

            _sb.AppendLine($"[DbFunction(\"{function.Name}\", \"{function.Schema}\")]");

            if ((function as Function) !.IsScalar)
            {
                var returnType = paramStrings.First();
                var parameters = string.Empty;

                if (function.Parameters.Count > 1)
                {
                    parameters = string.Join(", ", paramStrings.Skip(1));
                }

                _sb.AppendLine($"public static {returnType}{identifier}({parameters})");

                _sb.AppendLine("{");
                using (_sb.Indent())
                {
                    _sb.AppendLine("throw new NotSupportedException(\"This method can only be called from Entity Framework Core queries\");");
                }
                _sb.AppendLine("}");
            }
コード例 #6
0
        protected string GenerateIdentifierName(Routine routine, RoutineModel model)
        {
            if (routine == null)
            {
                throw new ArgumentNullException(nameof(routine));
            }

            return(CreateIdentifier(GenerateUniqueName(routine, model)).Item1);
        }
コード例 #7
0
        public ScaffoldedModel ScaffoldModel(RoutineModel model, ModuleScaffolderOptions scaffolderOptions, ref List <string> errors)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            var result = new ScaffoldedModel();

            errors = model.Errors;

            foreach (var routine in model.Routines.Where(r => !(r is Function f) || !f.IsScalar))
            {
                int i = 1;

                foreach (var resultSet in routine.Results)
                {
                    var suffix = string.Empty;
                    if (routine.Results.Count > 1)
                    {
                        suffix = $"{i++}";
                    }

                    var typeName = GenerateIdentifierName(routine, model) + "Result" + suffix;

                    var classContent = WriteResultClass(resultSet, scaffolderOptions, typeName);

                    result.AdditionalFiles.Add(new ScaffoldedFile
                    {
                        Code = classContent,
                        Path = scaffolderOptions.UseSchemaFolders
                                ? Path.Combine(routine.Schema, $"{typeName}.cs")
                                : $"{typeName}.cs"
                    });
                }
            }

            var dbContext = WriteDbContext(scaffolderOptions, model);

            var fileNameSuffix = this switch
            {
                SqlServerStoredProcedureScaffolder _ => "Procedures",
                SqlServerFunctionScaffolder _ => ".Functions",
                _ => throw new InvalidOperationException($"Unknown type '{GetType().Name}'"),
            };

            result.ContextFile = new ScaffoldedFile
            {
                Code = dbContext,
                Path = Path.GetFullPath(Path.Combine(scaffolderOptions.ContextDir, scaffolderOptions.ContextName + $"{fileNameSuffix}.cs")),
            };

            return(result);
        }
コード例 #8
0
ファイル: SQLiteHelper.cs プロジェクト: TallStack/MinoxBeard
 public Task <int> SaveItemAsync(RoutineModel obj)
 {
     if (obj.RoutineID != 0)
     {
         return(db.UpdateAsync(obj));
     }
     else
     {
         return(db.InsertAsync(obj));
     }
 }
コード例 #9
0
        public void modifyExistingRoutine(string routineName, RoutineModel model)
        {
            Routine rout = getRoutineAssignedToByName(routineName);

            rout.isTimed          = model.isTimed;
            rout.expectedDuration = model.expectedDuration;
            rout.isNotifiable     = model.isNotifiable;
            rout.isDisabled       = model.isDisabled;
            rout.updatedDate      = DateTime.Now;

            taskHelper.modifyExistingTasks(rout.Tasks.ToList(), model.Tasks.ToList(), true);
            feedbackHelper.updateRoutineFeedbacks(rout.routineID, model.Feedbacks.ToList());

            helper.updateRoutine(rout);
        }
コード例 #10
0
        public ActionResult Edit(RoutineModel model, string routineName, string mockUser = "")
        {
            if (!(Roles.IsUserInRole("Administrator") || Roles.IsUserInRole("Job Coach") || Roles.IsUserInRole("Parent")))
            {
                Response.Redirect("~/Unauthorized");
                return(View());
            }

            if (!ModelState.IsValid)
            {
                EnumHelper enumhelp = new EnumHelper();
                ViewData["TaskCategories"] = enumhelp.getAllTaskCategoryNames().ToList();
                ViewData["FeedbackTypes"]  = enumhelp.getAllFeedbackTypeNames().ToList();
                ViewData["MediaTypes"]     = enumhelp.getAllMediaTypeNames().ToList();

                ViewData["mockUser"] = mockUser;

                return(View(model));
            }

            if (Roles.IsUserInRole("Administrator"))
            {
                if (mockUser == null || mockUser.Equals("") || !accountHelper.userExists(mockUser))
                {
                    Response.Redirect("~/Routine");
                    return(View());
                }
                else
                {
                    if (!helper.routineExists(mockUser, routineName, model.assigneeUserName))
                    {
                        return(HttpNotFound());
                    }

                    helper.updateRoutine(mockUser, routineName, model);
                    return(RedirectToAction("List", "Routine", new { mockUser = mockUser }));
                }
            }

            if (!helper.routineExists(routineName, model.assigneeUserName))
            {
                return(HttpNotFound());
            }

            helper.updateRoutine(routineName, model);

            return(RedirectToAction("List"));
        }
コード例 #11
0
        private string GenerateUniqueName(Routine routine, RoutineModel model)
        {
            if (!string.IsNullOrEmpty(routine.NewName))
            {
                return(routine.NewName);
            }

            var numberOfNames = model.Routines.Where(p => p.Name == routine.Name).Count();

            if (numberOfNames > 1)
            {
                return(routine.Name + CultureInfo.InvariantCulture.TextInfo.ToTitleCase(routine.Schema));
            }

            return(routine.Name);
        }
コード例 #12
0
        private void GenerateModelCreation(RoutineModel model)
        {
            _sb.AppendLine();
            _sb.AppendLine("protected void OnModelCreatingGeneratedFunctions(ModelBuilder modelBuilder)");
            _sb.AppendLine("{");

            using (_sb.Indent())
            {
                foreach (var function in model.Routines.Cast <Function>().Where(f => !f.IsScalar))
                {
                    var typeName = GenerateIdentifierName(function, model) + "Result";

                    _sb.AppendLine($"modelBuilder.Entity<{typeName}>().HasNoKey();");
                }
            }

            _sb.AppendLine("}");
        }
コード例 #13
0
ファイル: RoutineHelper.cs プロジェクト: anthrax3/PJCAdmin
        /* Updates the most recent routine created by the
         * given user that matches the given name. Creates
         * a new routine if no routine matches the given
         * name or if the matched routine already has jobs
         * associated with it.
         * @param creatorUsername: The username of the
         * user who is to be the creator of the routine.
         * @param routineName: The routine name to match.
         * @param model: The model to update or create
         * a routine from.
         */
        public void updateRoutine(string creatorUsername, string routineName, RoutineModel model)
        {
            if (!routineExists(creatorUsername, routineName, model.assigneeUserName))
            {
                createRoutine(creatorUsername, model);
            }

            if (routineHasJobs(creatorUsername, routineName, model.assigneeUserName))
            { // Cannot edit routines that have existing jobs
                //Except if times are same and steps are still in same order
                //TODO add check for similarity
                disableAllRoutinesByName(creatorUsername, routineName, model.assigneeUserName);
                createRoutine(creatorUsername, model);
            }
            else
            {
                modifyExistingRoutine(creatorUsername, routineName, model);
            }
        }
コード例 #14
0
        private static string GenerateMultiResultId(Routine procedure, RoutineModel model)
        {
            if (procedure.Results.Count == 1)
            {
                return(null);
            }

            var ids = new List <string>();
            int i   = 1;

            foreach (var resultSet in procedure.Results)
            {
                var suffix = $"{i++}";

                var typeName = GenerateIdentifierName(procedure, model) + "Result" + suffix;
                ids.Add($"List<{typeName}> Result{suffix}");
            }

            return($"({string.Join(", ", ids)})");
        }
コード例 #15
0
        public RoutineModel GetRoutineInfo(string token, string username, string routineTitle)
        {
            RoutineModel routineInfo = new RoutineModel();

            if (username == null)
            {
                return(null);
            }
            auth.authorizeToken(token);
            //UserInfoModel temp = helper.getRoutineInfo(username);
            //userInfo.Add(temp.userName);
            //userInfo.Add(temp.phone);
            //userInfo.Add(temp.email);


            Routine temp = helper.getRoutineAssignedToByName(routineTitle);

            //routineInfo = (RoutineModel) temp;
            return(routineInfo);
        }
コード例 #16
0
        public async Task <bool> SaveRoutine()
        {
            DateTime dateTime = DateTime.Now;

            if (!string.IsNullOrEmpty(_applicationType) || !string.IsNullOrEmpty(_note) || !string.IsNullOrEmpty(_daytype) || _time == null)
            {
                RoutineModel routine = new RoutineModel()
                {
                    RoutineType  = _applicationType,
                    Date         = DateTime.Now,
                    Color        = "Gold",
                    DaySelection = _daytype,
                    Time         = _time,
                    Notes        = _note,
                    MoreInfos    = new ObservableCollection <MoreInfo> {
                        new MoreInfo {
                            Notes = _note, Time = _time
                        }
                    }
                };

                //Add New Usage
                await App.SQLiteDb.SaveItemAsync(routine);

                ApplicationType = string.Empty;
                Note            = string.Empty;
                DayType         = string.Empty;
                await PopupNavigation.Instance.PushAsync(new MessageModal("Added Routine"), true);

                return(true);
            }
            else
            {
                await PopupNavigation.Instance.PushAsync(new MessageModal("Whoops!! Please try again"), true);

                return(false);
            }
        }
コード例 #17
0
        public HttpResponseMessage PostRoutine(PostRoutineRequest data)
        {
            string token  = data.token;
            string create = data.create;

            PJCAdmin.Classes.Helpers.MVCModelHelpers.RoutineHelper helper = new Classes.Helpers.MVCModelHelpers.RoutineHelper();
            RoutineModel routine = Json.Decode <RoutineModel>(data.model.ToString());

            switch (create)
            {
            case "c":     //create new job
                //create the model in the database
                helper.createRoutine(auth.getUserNameFromToken(token), routine);
                break;

            case "m":     //modify existing job
                //find the routine that matches
                //update the database for routine
                try
                {
                    helper.modifyExistingRoutine(auth.getUserNameFromToken(token), routine.routineTitle, routine);
                }catch (InvalidOperationException)
                {
                    helper.updateRoutine(auth.getUserNameFromToken(token), routine.routineTitle, routine);
                }
                break;

            case "d":     //delete existing job
                //find the routine that matches
                //delete the matching routine from the database
                helper.deleteRoutine(auth.getUserNameFromToken(token), routine.routineTitle, routine.assigneeUserName, false);
                return(Request.CreateResponse <string>(HttpStatusCode.OK, "Job Deleted"));

            default: return(Request.CreateResponse <string>(HttpStatusCode.BadRequest, "Create Code Not Recognized"));
            }

            return(Request.CreateResponse <string>(HttpStatusCode.Created, "Job Created"));
        }
コード例 #18
0
        protected override string WriteDbContextInterface(ModuleScaffolderOptions scaffolderOptions, RoutineModel model)
        {
            if (scaffolderOptions is null)
            {
                throw new ArgumentNullException(nameof(scaffolderOptions));
            }

            if (model is null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            Sb = new IndentedStringBuilder();

            Sb.AppendLine(PathHelper.Header);

            var usings = CreateUsings(scaffolderOptions, model);

            foreach (var statement in usings)
            {
                Sb.AppendLine($"{statement};");
            }

            Sb.AppendLine();
            Sb.AppendLine($"namespace {scaffolderOptions.ContextNamespace}");
            Sb.AppendLine("{");

            using (Sb.Indent())
            {
                Sb.AppendLine($"public partial interface I{scaffolderOptions.ContextName}Procedures");
                Sb.AppendLine("{");
                using (Sb.Indent())
                {
                    foreach (var procedure in model.Routines)
                    {
                        GenerateProcedure(procedure, model, true, scaffolderOptions.UseAsyncCalls);
                        Sb.AppendLine(";");
                    }
                }

                Sb.AppendLine("}");
            }

            Sb.AppendLine("}");

            return(Sb.ToString());
        }
コード例 #19
0
ファイル: RoutineHelper.cs プロジェクト: anthrax3/PJCAdmin
 /* Updates the most recent routine created by the
  * currently logged in user that matches the given
  * name. Creates a new routine if no routine matches
  * the given name or if the matched routine already
  * has jobs associated with it.
  * @param routineName: The routine name to match.
  * @param model: The model to update or create
  * a routine from.
  */
 public void updateRoutine(string routineName, RoutineModel model)
 {
     updateRoutine(AccountHelper.getCurrentUsername(), routineName, model);
 }
コード例 #20
0
        protected override string WriteDbContext(ModuleScaffolderOptions scaffolderOptions, RoutineModel model)
        {
            _sb = new IndentedStringBuilder();

            _sb.AppendLine(PathHelper.Header);

            _sb.AppendLine("using Microsoft.EntityFrameworkCore;");
            _sb.AppendLine("using System;");
            _sb.AppendLine("using System.Linq;");
            _sb.AppendLine($"using {scaffolderOptions.ModelNamespace};");

            _sb.AppendLine();
            _sb.AppendLine($"namespace {scaffolderOptions.ContextNamespace}");
            _sb.AppendLine("{");

            using (_sb.Indent())
            {
                _sb.AppendLine($"public partial class {scaffolderOptions.ContextName}");

                _sb.AppendLine("{");

                using (_sb.Indent())
                {
                    foreach (var function in model.Routines)
                    {
                        GenerateFunctionStub(function, model);
                    }

                    GenerateModelCreation(model);
                }
                _sb.AppendLine("}");
            }

            _sb.AppendLine("}");

            return(_sb.ToString());
        }
コード例 #21
0
 public ScaffoldedModel ScaffoldModel(RoutineModel model, ModuleScaffolderOptions scaffolderOptions, ref List <string> errors)
 {
     throw new NotSupportedException();
 }
コード例 #22
0
        protected override string WriteDbContext(ModuleScaffolderOptions scaffolderOptions, RoutineModel model)
        {
            if (scaffolderOptions is null)
            {
                throw new ArgumentNullException(nameof(scaffolderOptions));
            }

            if (model is null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            Sb = new IndentedStringBuilder();

            Sb.AppendLine(PathHelper.Header);

            Sb.AppendLine("using Microsoft.EntityFrameworkCore;");
            Sb.AppendLine("using System;");
            Sb.AppendLine("using System.Data;");
            Sb.AppendLine("using System.Linq;");
            Sb.AppendLine($"using {scaffolderOptions.ModelNamespace};");
            if (model.Routines.SelectMany(r => r.Parameters).Any(p => p.ClrType() == typeof(Geometry)))
            {
                Sb.AppendLine("using NetTopologySuite.Geometries;");
            }

            Sb.AppendLine();
            Sb.AppendLine($"namespace {scaffolderOptions.ContextNamespace}");
            Sb.AppendLine("{");

            using (Sb.Indent())
            {
                Sb.AppendLine($"public partial class {scaffolderOptions.ContextName}");

                Sb.AppendLine("{");

                using (Sb.Indent())
                {
                    foreach (var function in model.Routines)
                    {
                        GenerateFunctionStub(function, model);
                    }

                    GenerateModelCreation(model);
                }

                Sb.AppendLine("}");
            }

            Sb.AppendLine("}");

            return(Sb.ToString());
        }
コード例 #23
0
ファイル: RoutineHelper.cs プロジェクト: anthrax3/PJCAdmin
        /* Updates the most recent routine created by the
         * given user that matches the given name, using
         * the given model.
         * @param creatorUsername: The username of the
         * user who created the routine.
         * @param routineName: The routine name to match.
         * @param model: The model to use for updating
         * the existing routine.
         */
        private void modifyExistingRoutine(string creatorUsername, string routineName, RoutineModel model)
        {
            Routine r = getMostRecentRoutineAssignedToByName(creatorUsername, routineName, model.assigneeUserName);

            r.isTimed          = model.isTimed;
            r.expectedDuration = model.expectedDuration;
            r.isNotifiable     = model.isNotifiable;
            r.isDisabled       = model.isDisabled;
            r.updatedDate      = DateTime.Now;

            taskHelper.modifyExistingTasks(r.Tasks.ToList(), model.Tasks.ToList(), true);
            feedbackHelper.updateRoutineFeedbacks(r.routineID, model.Feedbacks.ToList());

            helper.updateRoutine(r);
        }
コード例 #24
0
        protected override string WriteDbContext(ModuleScaffolderOptions scaffolderOptions, RoutineModel model)
        {
            if (scaffolderOptions is null)
            {
                throw new ArgumentNullException(nameof(scaffolderOptions));
            }

            if (model is null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            Sb = new IndentedStringBuilder();

            Sb.AppendLine(PathHelper.Header);

            var usings = CreateUsings(scaffolderOptions, model);

            foreach (var statement in usings)
            {
                Sb.AppendLine($"{statement};");
            }

            Sb.AppendLine();
            Sb.AppendLine($"namespace {scaffolderOptions.ContextNamespace}");
            Sb.AppendLine("{");

            using (Sb.Indent())
            {
                Sb.AppendLine($"public partial class {scaffolderOptions.ContextName}");
                Sb.AppendLine("{");
                using (Sb.Indent())
                {
                    Sb.AppendLine($"private I{scaffolderOptions.ContextName}Procedures _procedures;");
                    Sb.AppendLine();
                    Sb.AppendLine($"public virtual I{scaffolderOptions.ContextName}Procedures Procedures");
                    Sb.AppendLine("{");
                    using (Sb.Indent())
                    {
                        Sb.AppendLine("get");
                        Sb.AppendLine("{");
                        using (Sb.Indent())
                        {
                            Sb.AppendLine($"if (_procedures is null) _procedures = new {scaffolderOptions.ContextName}Procedures(this);");
                            Sb.AppendLine("return _procedures;");
                        }

                        Sb.AppendLine("}");
                        Sb.AppendLine("set");
                        Sb.AppendLine("{");
                        using (Sb.Indent())
                        {
                            Sb.AppendLine("_procedures = value;");
                        }

                        Sb.AppendLine("}");
                    }

                    Sb.AppendLine("}");
                    Sb.AppendLine();
                    Sb.AppendLine($"public I{scaffolderOptions.ContextName}Procedures GetProcedures()");
                    Sb.AppendLine("{");
                    using (Sb.Indent())
                    {
                        Sb.AppendLine("return Procedures;");
                    }

                    Sb.AppendLine("}");
                    GenerateOnModelCreating(model);
                }

                Sb.AppendLine("}");
                Sb.AppendLine();

                Sb.AppendLine($"public partial class {scaffolderOptions.ContextName}Procedures : I{scaffolderOptions.ContextName}Procedures");
                Sb.AppendLine("{");

                using (Sb.Indent())
                {
                    Sb.AppendLine($"private readonly {scaffolderOptions.ContextName} _context;");
                    Sb.AppendLine();
                    Sb.AppendLine($"public {scaffolderOptions.ContextName}Procedures({scaffolderOptions.ContextName} context)");
                    Sb.AppendLine("{");

                    using (Sb.Indent())
                    {
                        Sb.AppendLine($"_context = context;");
                    }

                    Sb.AppendLine("}");
                }

                foreach (var procedure in model.Routines)
                {
                    GenerateProcedure(procedure, model, false, scaffolderOptions.UseAsyncCalls);
                }

                if (model.Routines.Any(r => r.SupportsMultipleResultSet))
                {
                    GenerateDapperSupport(scaffolderOptions.UseAsyncCalls);
                }

                Sb.AppendLine("}");
            }

            Sb.AppendLine("}");

            return(Sb.ToString());
        }
コード例 #25
0
        private void GenerateProcedure(Routine procedure, RoutineModel model, bool signatureOnly, bool useAsyncCalls)
        {
            var paramStrings = procedure.Parameters.Where(p => !p.Output)
                               .Select(p => $"{Code.Reference(p.ClrType(asMethodParameter: true))} {Code.Identifier(p.Name)}")
                               .ToList();

            var allOutParams = procedure.Parameters.Where(p => p.Output).ToList();

            var outParams = allOutParams.SkipLast(1).ToList();

            var retValueName = allOutParams.Last().Name;

            var outParamStrings = outParams
                                  .Select(p => $"OutputParameter<{Code.Reference(p.ClrType())}> {Code.Identifier(p.Name)}")
                                  .ToList();

            string fullExec = GenerateProcedureStatement(procedure, retValueName, useAsyncCalls);

            var multiResultId = GenerateMultiResultId(procedure, model);

            var identifier = GenerateIdentifierName(procedure, model);

            var returnClass = identifier + "Result";

            if (!string.IsNullOrEmpty(procedure.MappedType))
            {
                returnClass = procedure.MappedType;
            }

            var line = GenerateMethodSignature(procedure, outParams, paramStrings, retValueName, outParamStrings, identifier, multiResultId, signatureOnly, useAsyncCalls, returnClass);

            if (signatureOnly)
            {
                Sb.Append(line);
                return;
            }

            using (Sb.Indent())
            {
                Sb.AppendLine();

                Sb.AppendLine(line);
                Sb.AppendLine("{");

                using (Sb.Indent())
                {
                    foreach (var parameter in allOutParams)
                    {
                        GenerateParameterVar(parameter, procedure);
                    }

                    Sb.AppendLine();

                    Sb.AppendLine("var sqlParameters = new []");
                    Sb.AppendLine("{");
                    using (Sb.Indent())
                    {
                        foreach (var parameter in procedure.Parameters)
                        {
                            if (parameter.Output)
                            {
                                Sb.Append($"{ParameterPrefix}{parameter.Name}");
                            }
                            else
                            {
                                GenerateParameter(parameter, procedure);
                            }

                            Sb.AppendLine(",");
                        }
                    }

                    Sb.AppendLine("};");

                    if (procedure.HasValidResultSet && (procedure.Results.Count == 0 || procedure.Results[0].Count == 0))
                    {
                        Sb.AppendLine(useAsyncCalls
                            ? $"var _ = await _context.Database.ExecuteSqlRawAsync({fullExec});"
                            : $"var _ = _context.Database.ExecuteSqlRaw({fullExec});");
                    }
                    else
                    {
                        if (procedure.SupportsMultipleResultSet)
                        {
                            Sb.AppendLine();
                            Sb.AppendLine("var dynamic = CreateDynamic(sqlParameters);");
                            Sb.AppendLine($"{multiResultId}  _;");
                            Sb.AppendLine();
                            Sb.AppendLine($"using (var reader = {(useAsyncCalls ? "await GetMultiReaderAsync" : "GetMultiReader")}(_context, dynamic, \"[{procedure.Schema}].[{procedure.Name}]\"))");
                            Sb.AppendLine("{");

                            using (Sb.Indent())
                            {
                                var statements = GenerateMultiResultStatement(procedure, model, useAsyncCalls);
                                Sb.AppendLine($"_ = {statements};");
                            }

                            Sb.AppendLine("}");
                        }
                        else
                        {
                            Sb.AppendLine(useAsyncCalls
                                ? $"var _ = await _context.SqlQueryAsync<{returnClass}>({fullExec});"
                                : $"var _ = _context.SqlQuery<{returnClass}>({fullExec});");
                        }
                    }

                    Sb.AppendLine();

                    foreach (var parameter in outParams)
                    {
                        Sb.AppendLine($"{Code.Identifier(parameter.Name)}.SetValue({ParameterPrefix}{parameter.Name}.Value);");
                    }

                    if (procedure.SupportsMultipleResultSet)
                    {
                        Sb.AppendLine($"{retValueName}?.SetValue(dynamic.Get<int>(\"{retValueName}\"));");
                    }
                    else
                    {
                        Sb.AppendLine($"{retValueName}?.SetValue({ParameterPrefix}{retValueName}.Value);");
                    }

                    Sb.AppendLine();

                    Sb.AppendLine("return _;");
                }

                Sb.AppendLine("}");
            }
        }
コード例 #26
0
        private void GenerateProcedure(Routine procedure, RoutineModel model)
        {
            var paramStrings = procedure.Parameters.Where(p => !p.Output)
                               .Select(p => $"{code.Reference(p.ClrType())} {p.Name}")
                               .ToList();

            var allOutParams = procedure.Parameters.Where(p => p.Output).ToList();

            var outParams = allOutParams.SkipLast(1).ToList();

            var retValueName = allOutParams.Last().Name;

            var outParamStrings = outParams
                                  .Select(p => $"OutputParameter<{code.Reference(p.ClrType())}> {p.Name}")
                                  .ToList();

            string fullExec = GenerateProcedureStatement(procedure, retValueName);

            var identifier = GenerateIdentifierName(procedure, model);

            var line = GenerateMethodSignature(procedure, outParams, paramStrings, retValueName, outParamStrings, identifier);

            using (_sb.Indent())
            {
                _sb.AppendLine();

                _sb.AppendLine(line);
                _sb.AppendLine("{");

                using (_sb.Indent())
                {
                    foreach (var parameter in allOutParams)
                    {
                        GenerateParameterVar(parameter);
                    }

                    _sb.AppendLine();

                    _sb.AppendLine("var sqlParameters = new []");
                    _sb.AppendLine("{");
                    using (_sb.Indent())
                    {
                        foreach (var parameter in procedure.Parameters)
                        {
                            if (parameter.Output)
                            {
                                _sb.Append($"{parameterPrefix}{parameter.Name}");
                            }
                            else
                            {
                                GenerateParameter(parameter);
                            }
                            _sb.AppendLine(",");
                        }
                    }
                    _sb.AppendLine("};");

                    if (procedure.HasValidResultSet && procedure.ResultElements.Count == 0)
                    {
                        _sb.AppendLine($"var _ = await _context.Database.ExecuteSqlRawAsync({fullExec});");
                    }
                    else
                    {
                        _sb.AppendLine($"var _ = await _context.SqlQueryAsync<{identifier}Result>({fullExec});");
                    }

                    _sb.AppendLine();

                    foreach (var parameter in outParams)
                    {
                        _sb.AppendLine($"{parameter.Name}.SetValue({parameterPrefix}{parameter.Name}.Value);");
                    }

                    _sb.AppendLine($"{retValueName}?.SetValue({parameterPrefix}{retValueName}.Value);");

                    _sb.AppendLine();

                    _sb.AppendLine("return _;");
                }

                _sb.AppendLine("}");
            }
        }
コード例 #27
0
        private static List <string> CreateUsings(ModuleScaffolderOptions scaffolderOptions, RoutineModel model)
        {
            var usings = new List <string>()
            {
                "using Microsoft.EntityFrameworkCore",
                "using Microsoft.Data.SqlClient",
                "using System",
                "using System.Collections.Generic",
                "using System.Data",
                "using System.Threading",
                "using System.Threading.Tasks",
                $"using {scaffolderOptions.ModelNamespace}",
            };

            if (model.Routines.Any(r => r.SupportsMultipleResultSet))
            {
                usings.AddRange(new List <string>()
                {
                    "using Dapper",
                    "using Microsoft.EntityFrameworkCore.Storage",
                    "using System.Linq",
                });
            }

            if (model.Routines.SelectMany(r => r.Parameters).Any(p => p.ClrType() == typeof(Geometry)))
            {
                usings.AddRange(new List <string>()
                {
                    "using NetTopologySuite.Geometries",
                });
            }

            usings.Sort();
            return(usings);
        }
コード例 #28
0
ファイル: RoutineHelper.cs プロジェクト: anthrax3/PJCAdmin
 /* Creates a new routine for the currently logged in
  * user from the given model.
  * @param model: The model of the routine to create
  * from.
  */
 public void createRoutine(RoutineModel model)
 {
     createRoutine(AccountHelper.getCurrentUsername(), model);
 }
コード例 #29
0
        protected override string WriteDbContext(ModuleScaffolderOptions procedureScaffolderOptions, RoutineModel model)
        {
            _sb = new IndentedStringBuilder();

            _sb.AppendLine(PathHelper.Header);

            _sb.AppendLine("using Microsoft.EntityFrameworkCore;");
            _sb.AppendLine("using Microsoft.Data.SqlClient;");
            _sb.AppendLine("using System;");
            _sb.AppendLine("using System.Collections.Generic;");
            //To support System.Data.DataTable
            _sb.AppendLine("using System.Data;");
            _sb.AppendLine("using System.Threading;");
            _sb.AppendLine("using System.Threading.Tasks;");
            _sb.AppendLine($"using {procedureScaffolderOptions.ModelNamespace};");

            _sb.AppendLine();
            _sb.AppendLine($"namespace {procedureScaffolderOptions.ContextNamespace}");
            _sb.AppendLine("{");

            using (_sb.Indent())
            {
                _sb.AppendLine($"public partial class {procedureScaffolderOptions.ContextName}");
                _sb.AppendLine("{");
                using (_sb.Indent())
                {
                    _sb.AppendLine($"private {procedureScaffolderOptions.ContextName}Procedures _procedures;");
                    _sb.AppendLine();
                    _sb.AppendLine($"public virtual {procedureScaffolderOptions.ContextName}Procedures Procedures");
                    _sb.AppendLine("{");
                    using (_sb.Indent())
                    {
                        _sb.AppendLine("get");
                        _sb.AppendLine("{");
                        using (_sb.Indent())
                        {
                            _sb.AppendLine($"if (_procedures is null) _procedures = new {procedureScaffolderOptions.ContextName}Procedures(this);");
                            _sb.AppendLine("return _procedures;");
                        }
                        _sb.AppendLine("}");
                        _sb.AppendLine("set");
                        _sb.AppendLine("{");
                        using (_sb.Indent())
                        {
                            _sb.AppendLine("_procedures = value;");
                        }
                        _sb.AppendLine("}");
                    }
                    _sb.AppendLine("}");
                    _sb.AppendLine("");
                    _sb.AppendLine($"public {procedureScaffolderOptions.ContextName}Procedures GetProcedures()");
                    _sb.AppendLine("{");
                    using (_sb.Indent())
                    {
                        _sb.AppendLine("return Procedures;");
                    }
                    _sb.AppendLine("}");
                }
                _sb.AppendLine("}");
                _sb.AppendLine();

                _sb.AppendLine($"public partial class {procedureScaffolderOptions.ContextName}Procedures");
                _sb.AppendLine("{");

                using (_sb.Indent())
                {
                    _sb.AppendLine($"private readonly {procedureScaffolderOptions.ContextName} _context;");
                    _sb.AppendLine();
                    _sb.AppendLine($"public {procedureScaffolderOptions.ContextName}Procedures({procedureScaffolderOptions.ContextName} context)");
                    _sb.AppendLine("{");

                    using (_sb.Indent())
                    {
                        _sb.AppendLine($"_context = context;");
                    }

                    _sb.AppendLine("}");
                }

                foreach (var procedure in model.Routines)
                {
                    GenerateProcedure(procedure, model);
                }

                _sb.AppendLine("}");
            }

            _sb.AppendLine("}");

            return(_sb.ToString());
        }
コード例 #30
0
 protected abstract string WriteDbContext(ModuleScaffolderOptions scaffolderOptions, RoutineModel model);