Exemplo n.º 1
0
        private List <nHydrateGeneratorProject> BuildModelList(nHydrateModel model, Microsoft.VisualStudio.Modeling.Diagrams.Diagram diagram, Microsoft.VisualStudio.Modeling.Shell.ModelingDocData docData)
        {
            var genList = new List <nHydrateGeneratorProject>();

            var genProject = new nHydrateGeneratorProject();

            genList.Add(genProject);
            var root = CreatePOCOModel(model, diagram);

            root.SetKey(model.Id.ToString());
            root.GeneratorProject            = genProject;
            genProject.RootController.Object = root;
            var fi = new System.IO.FileInfo(docData.FileName);

            genProject.FileName = docData.FileName + ".generating";
            var document = new System.Xml.XmlDocument();

            document.LoadXml("<modelRoot guid=\"" + model.Id + "\" type=\"nHydrate.Generator.nHydrateGeneratorProject\" assembly=\"nHydrate.Generator.dll\"><ModelRoot></ModelRoot></modelRoot>");
            ((nHydrate.Generator.Common.GeneratorFramework.IXMLable)root).XmlAppend(document.DocumentElement.ChildNodes[0]);
            System.IO.File.WriteAllText(genProject.FileName, document.ToIndentedString());

            ProcessRenamed(genProject.FileName + ".sql.lastgen", root);

            root.RemovedTables.AddRange(model.RemovedTables);

            //NOTE: This caused diff scripts to be generated EVERY time so removed for now
            //Remove associative tables since they cause issues if they exist
            //root.RemovedTables.AddRange(model.Entities.Where(x => x.IsAssociative && x.IsGenerated).Select(x => x.Name));

            root.RemovedViews.AddRange(model.RemovedViews);
            //Remove EnumOnly type-tables from the project
            root.RemovedTables.AddRange(model.Entities.Where(x => x.TypedEntity == TypedEntityConstants.EnumOnly).Select(x => x.Name));

            return(genList);
        }
Exemplo n.º 2
0
        private static void ProcessRenamed(string lastGenFile, ModelRoot root)
        {
            if (!File.Exists(lastGenFile))
            {
                return;
            }

            var genProjectLast = new nHydrateGeneratorProject();
            var xDoc           = new XmlDocument();

            xDoc.Load(lastGenFile);
            genProjectLast.XmlLoad(xDoc.DocumentElement);

            var oldRoot = (genProjectLast.RootController.Object as nHydrate.Generator.Models.ModelRoot);

            foreach (nHydrate.Generator.Models.Table t in root.Database.Tables)
            {
                //Find renamed tables
                {
                    var renamedItem = oldRoot.Database.Tables.FirstOrDefault(x => x.Key == t.Key && x.PascalName.ToLower() != t.PascalName.ToLower());
                    if (renamedItem != null)
                    {
                        root.RemovedTables.Add(renamedItem.Name);
                    }
                }

                //Find renamed views
                {
                    var renamedItem = oldRoot.Database.CustomViews.FirstOrDefault(x => x.Key == t.Key && x.PascalName.ToLower() != t.PascalName.ToLower());
                    if (renamedItem != null)
                    {
                        root.RemovedViews.Add(renamedItem.Name);
                    }
                }

                //Find tables that WERE generated last time but NOT generated this time, remove the tables
                {
                    var item1 = oldRoot.Database.Tables.FirstOrDefault(x => x.Key == t.Key && x.PascalName.ToLower() == t.PascalName.ToLower());
                    var item2 = root.Database.Tables.FirstOrDefault(x => x.Key == t.Key && x.PascalName.ToLower() != t.PascalName.ToLower());
                    if (item1 != null && item2 != null)
                    {
                        root.RemovedTables.Add(item2.Name);
                    }
                }
            }
        }
Exemplo n.º 3
0
        private void wizard1_BeforeSwitchPages(object sender, nHydrate.Wizard.Wizard.BeforeSwitchPagesEventArgs e)
        {
            if (e.OldIndex == 0)
            {
                this.Cursor = Cursors.WaitCursor;
                try
                {
                    DatabaseConnectionControl1.PersistSettings();
                    var connectionString = DatabaseConnectionControl1.ImportOptions.GetConnectionString();

                    if (!SqlSchemaToModel.IsValidConnectionString(connectionString))
                    {
                        this.Cursor = Cursors.Default;
                        e.Cancel    = true;
                        MessageBox.Show("This not a valid connection string!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    //Setup new model
                    var project = new nHydrateGeneratorProject();
                    SqlSchemaToModel.SetupNewProject(project, connectionString);
                    this.NewDatabase = (project.Model as ModelRoot).Database;
                    SqlSchemaToModel.GetProjectFromSqlSchema(project, connectionString, false, chkInheritance.Checked);

                    //Load the tree
                    this.Populate();

                    if (!this.AreChanges())
                    {
                        this.Cursor = Cursors.Default;
                        e.Cancel    = true;
                        MessageBox.Show("This model is up-to-date. There are no changes to refresh.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    this.Cursor = Cursors.Default;
                }
            }
        }
Exemplo n.º 4
0
        /*
         *  --model=C:\code\nHydrateTestAug\ConsoleApp1\Model1.nhydrate --output=C:\code\nHydrateTestAug --generators=nHydrate.Generator.EFCodeFirstNetCore.EFCodeFirstNetCoreProjectGenerator,nHydrate.Generator.PostgresInstaller.PostgresDatabaseProjectGenerator,nHydrate.Generator.SQLInstaller.Core.DatabaseProjectGenerator
         */

        static int Main(string[] args)
        {
            IConfiguration Configuration = new ConfigurationBuilder()
                                           .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                                           .AddJsonFile("appsettings.development.json", optional: true, reloadOnChange: true)
                                           .AddCommandLine(args)
                                           .Build();

            var modelFile  = string.Empty;
            var output     = string.Empty;
            var generators = new string[0];

            //AppSettings
            var allValues = Configuration.GetChildren().Select(x => new { x.Key, x.Value }).ToDictionary(x => x.Key.ToString(), x => x.Value?.ToString());

            if (allValues.ContainsKey(ModelKey))
            {
                modelFile = allValues[ModelKey];
            }
            if (allValues.ContainsKey(OutputKey))
            {
                output = allValues[OutputKey];
            }
            if (allValues.ContainsKey(GeneratorsKey))
            {
                generators = allValues[GeneratorsKey].Split(",", StringSplitOptions.RemoveEmptyEntries);
            }

            if (modelFile.IsEmpty())
            {
                return(ShowError("The model is required."));
            }
            if (output.IsEmpty())
            {
                return(ShowError("The output folder is required."));
            }

            //If there are no generators specified on the command line then check for the file "nhydrate.generators"
            if (!generators.Any())
            {
                var folderName = (new FileInfo(modelFile)).DirectoryName;
                var genDefFile = Path.Combine(folderName, "nhydrate.generators");
                if (File.Exists(genDefFile))
                {
                    generators = File.ReadAllLines(genDefFile).Where(x => x.Trim() != string.Empty).ToArray();
                }
                if (!generators.Any())
                {
                    return(ShowError("The generators are required."));
                }
            }

            Console.WriteLine($"modelFile='{modelFile}'");
            Console.WriteLine($"output='{output}'");
            Console.WriteLine($"generators='{string.Join(",", generators)}'");

            //NOTE: Yaml Model files must end with ".nhydrate.yaml"
            //Old Xml file ends with ".nhydrate"

            //Specified a folder so look for the file
            string actualFile = null;

            if (Directory.Exists(modelFile))
            {
                var folderName = modelFile;

                //Look for new Yaml file
                var f = Directory.GetFiles(folderName, "*" + FileManagement.ModelExtension).FirstOrDefault();
                if (File.Exists(f))
                {
                    actualFile = f;
                }

                //Look for old xml file
                if (actualFile.IsEmpty())
                {
                    f = Directory.GetFiles(folderName, "*" + FileManagement.OldModelExtension).FirstOrDefault();
                    if (File.Exists(f))
                    {
                        actualFile = f;
                    }
                }

                if (actualFile.IsEmpty())
                {
                    //Back 1 folder
                    folderName = (new DirectoryInfo(folderName)).Parent.FullName;

                    f = Directory.GetFiles(folderName, "*" + FileManagement.ModelExtension).FirstOrDefault();
                    if (File.Exists(f))
                    {
                        actualFile = f;
                    }

                    //Look for old xml file
                    if (actualFile.IsEmpty())
                    {
                        f = Directory.GetFiles(folderName, "*" + FileManagement.OldModelExtension).FirstOrDefault();
                        if (File.Exists(f))
                        {
                            actualFile = f;
                        }
                    }
                }
            }
            else
            {
                //Is this the Yaml model?
                if (modelFile.EndsWith(FileManagement.ModelExtension))
                {
                    actualFile = modelFile;
                }

                //Is this the Xml model?
                if (modelFile.EndsWith(FileManagement.OldModelExtension))
                {
                    actualFile = modelFile;
                }

                //Look one folder back for Yaml
                if (actualFile.IsEmpty())
                {
                    var folderName = (new FileInfo(modelFile)).Directory.Parent.FullName;
                    var f          = Directory.GetFiles(folderName, "*" + FileManagement.ModelExtension).FirstOrDefault();
                    if (File.Exists(f))
                    {
                        actualFile = f;
                    }
                }
            }

            if (actualFile.IsEmpty())
            {
                return(ShowError("Model file not found."));
            }
            modelFile = actualFile;

            var timer       = System.Diagnostics.Stopwatch.StartNew();
            var formatModel = (allValues.ContainsKey("formatmodel") && allValues["formatmodel"] == "true");

            //TODO: when model files missing ID, it generates all fields as first one

            nHydrate.Generator.Common.Models.ModelRoot model = null;
            try
            {
                Console.WriteLine();
                Console.WriteLine("Loading model...");
                model = ModelHelper.CreatePOCOModel(modelFile, formatModel);
            }
            catch (ModelException ex)
            {
                //All YAML validation errors will come here
                Console.WriteLine(ex.Message);
                return(1);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unknown error.");
                return(1);
            }

            //Generate
            if (model != null && !formatModel)
            {
                Console.WriteLine("Loading generators...");
                var genHelper = new nHydrate.Command.Core.GeneratorHelper(output);
                genHelper.ProjectItemGenerated += new nHydrate.Generator.Common.GeneratorFramework.ProjectItemGeneratedEventHandler(g_ProjectItemGenerated);

                var genList    = new List <nHydrateGeneratorProject>();
                var genProject = new nHydrateGeneratorProject();
                genList.Add(genProject);
                model.ResetKey(model.Key);
                model.GeneratorProject = genProject;
                genProject.Model       = model;
                genProject.FileName    = $"{modelFile}.generating";
                var document = new System.Xml.XmlDocument();
                document.LoadXml($"<modelRoot guid=\"{model.Key}\" type=\"nHydrate.Generator.nHydrateGeneratorProject\" assembly=\"nHydrate.Generator.dll\"><ModelRoot></ModelRoot></modelRoot>");
                ((nHydrate.Generator.Common.GeneratorFramework.IXMLable)model).XmlAppend(document.DocumentElement.ChildNodes[0]);
                System.IO.File.WriteAllText(genProject.FileName, document.ToIndentedString());

                var allgenerators = genHelper.GetProjectGenerators(genProject);
                var excludeList   = allgenerators.Where(x => !generators.Contains(x.FullName)).ToList();

                //Get the last version we generated on this machine
                //We will use this to determine if any other generations have been performed on other machines
                var cacheFile = new nHydrate.Generator.Common.ModelCacheFile(genList.First());
                var cachedGeneratedVersion = cacheFile.GeneratedVersion;
                var generatedVersion       = cachedGeneratedVersion + 1;
                model.GeneratedVersion = generatedVersion;

                Console.WriteLine($"Generating code...");
                foreach (var item in genList)
                {
                    genHelper.GenerateAll(item, excludeList);
                }

                //Save local copy of last generated version
                cacheFile.GeneratedVersion = generatedVersion;
                cacheFile.ModelerVersion   = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
                cacheFile.Save();

                if (File.Exists(genProject.FileName))
                {
                    File.Delete(genProject.FileName);
                }

                //Write stats
                Console.WriteLine();
                Console.WriteLine("Generation Summary");
                Console.WriteLine($"Total Files: {_stats.ProcessedFileCount}");
                Console.WriteLine($"Files Success: {_stats.FilesSuccess}");
                Console.WriteLine($"Files Skipped: {_stats.FilesSkipped}");
                Console.WriteLine($"Files Failed: {_stats.FilesFailed}");
                Console.WriteLine();
            }
            else if (!formatModel)
            {
                Console.WriteLine("The model could not be loaded.");
            }

            timer.Stop();
            Console.WriteLine($"Generation complete. Elapsed={timer.ElapsedMilliseconds}ms");
            return(0);
        }
Exemplo n.º 5
0
		private void wizard1_BeforeSwitchPages(object sender, nHydrate.Wizard.Wizard.BeforeSwitchPagesEventArgs e)
		{
			if (e.OldIndex == 0)
			{
				this.Cursor = Cursors.WaitCursor;
				try
				{
					DatabaseConnectionControl1.PersistSettings();
					var connectionString = DatabaseConnectionControl1.ImportOptions.GetConnectionString();

					if (!SqlSchemaToModel.IsValidConnectionString(connectionString))
					{
						this.Cursor = Cursors.Default;
						e.Cancel = true;
						MessageBox.Show("This not a valid connection string!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
						return;
					}

					//Setup new model
					var project = new nHydrateGeneratorProject();
					SqlSchemaToModel.SetupNewProject(project, connectionString);
					this.NewDatabase = (project.Model as ModelRoot).Database;
					SqlSchemaToModel.GetProjectFromSqlSchema(project, connectionString, false, chkInheritance.Checked);

					//Load the tree
					this.Populate();

					if (!this.AreChanges())
					{
						this.Cursor = Cursors.Default;
						e.Cancel = true;
						MessageBox.Show("This model is up-to-date. There are no changes to refresh.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
					}

				}
				catch (Exception)
				{
					throw;
				}
				finally
				{
					this.Cursor = Cursors.Default;
				}
			}

		}
Exemplo n.º 6
0
        /*
         *  /model:C:\code\nHydrateTestAug\ConsoleApp1\Model1.nhydrate /output:C:\code\nHydrateTestAug /generators:nHydrate.Generator.EFCodeFirstNetCore.EFCodeFirstNetCoreProjectGenerator,nHydrate.Generator.PostgresInstaller.PostgresDatabaseProjectGenerator,nHydrate.Generator.SQLInstaller.Core.DatabaseProjectGenerator
         */

        static int Main(string[] args)
        {
            var commandParams = GetCommandLineParameters();

            if (!commandParams.ContainsKey(ModelKey))
            {
                return(ShowError("The model is required."));
            }
            if (!commandParams.ContainsKey(OutputKey))
            {
                return(ShowError("The output folder is required."));
            }
            if (!commandParams.ContainsKey(GeneratorsKey))
            {
                return(ShowError("The generators are required."));
            }

            var modelFile  = commandParams[ModelKey];
            var output     = commandParams[OutputKey];
            var generators = commandParams[GeneratorsKey].Split(",", StringSplitOptions.RemoveEmptyEntries);

            nHydrate.Generator.Common.Models.ModelRoot model = null;
            try
            {
                model = ModelHelper.CreatePOCOModel(modelFile);
            }
            catch (ModelException ex)
            {
                Console.WriteLine(ex.Message);
                return(1);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unknown error.");
                return(1);
            }

            //Generate
            if (model != null)
            {
                var genHelper = new nHydrate.Command.Core.GeneratorHelper(output);

                var genList    = new List <nHydrateGeneratorProject>();
                var genProject = new nHydrateGeneratorProject();
                genList.Add(genProject);
                model.SetKey(model.Id.ToString());
                model.GeneratorProject = genProject;
                genProject.Model       = model;
                genProject.FileName    = modelFile + ".generating";
                var document = new System.Xml.XmlDocument();
                document.LoadXml("<modelRoot guid=\"" + model.Id + "\" type=\"nHydrate.Generator.nHydrateGeneratorProject\" assembly=\"nHydrate.Generator.dll\"><ModelRoot></ModelRoot></modelRoot>");
                ((nHydrate.Generator.Common.GeneratorFramework.IXMLable)model).XmlAppend(document.DocumentElement.ChildNodes[0]);
                System.IO.File.WriteAllText(genProject.FileName, document.ToIndentedString());

                var allgenerators = genHelper.GetProjectGenerators(genProject);

                var excludeList = allgenerators.Where(x => !generators.Contains(x.FullName)).ToList();

                foreach (var item in genList)
                {
                    genHelper.GenerateAll(item, excludeList);
                }
            }

            return(0);
        }