public void SaveState(ModulesGraph dg)
        {
            Module[] symbolTable = dg.CreateMemento().State;
            int[][]  jaggedArray = dg.Digraph.CreateMemento().State;

            // Save
            using (var ctx = new DependencyGraphContext(_connectionString))
            {
                ctx.Database.ExecuteSqlCommand("TRUNCATE TABLE Module;");
                ctx.Database.ExecuteSqlCommand("TRUNCATE TABLE ModulesGraph;");

                foreach (var module in symbolTable)
                {
                    ctx.Modules.Add(new SqlStorage.Module {
                        ModuleId = module.Id.Value, Name = module.Name, Version = module.Version, Description = module.Description
                    });
                }

                for (int i = 0; i < jaggedArray.Length; i++)
                {
                    var json = JsonConvert.SerializeObject(jaggedArray[i]);
                    ctx.ModuleVertices.Add(new ModuleVertex {
                        VertexId = i, AdjacencyListJson = json
                    });
                }
                ctx.SaveChanges();
            }
        }
示例#2
0
 // TODO: The problem is that projects and packages never get deleted
 // We can either truncate the tables or remove orphants before each run.
 public void SaveProject(Project project)
 {
     SqlStorage.Project sqlProject = _engine.Map <SqlStorage.Project>(project);
     sqlProject = GetOrAddEntity(_context.Projects, sqlProject, m => m.Name == project.Name);
     sqlProject.Packages.Clear(); // This project can have fewer nugets than project in db
     foreach (var nugetPackage in project.Packages)
     {
         SqlStorage.Package sqlPackage = _engine.Map <SqlStorage.Package>(nugetPackage);
         sqlPackage = GetOrAddEntity(_context.Packages, sqlPackage, m => m.Name == nugetPackage.Name && m.Version == nugetPackage.Version); // There can be more than one NuGet version
         sqlPackage.Projects.Add(sqlProject);
     }
     _context.SaveChanges();
 }
示例#3
0
        // SaveState wipes out graph but keeps DatabaseObjects because:
        //  TODO: We could try updating modified vertices only.
        public void SaveState(DatabaseObjectsGraph dg)
        {
            DatabaseObject[] symbolTable = dg.CreateMemento().State;
            int[][]          jaggedArray = dg.Digraph.CreateMemento().State;

            // Save
            using (var ctx = new DependencyGraphContext(_connectionString))
            {
                ctx.Database.ExecuteSqlCommand("TRUNCATE TABLE DatabaseObjectsGraph;");

                foreach (var databaseObject in symbolTable)
                {
                    switch (databaseObject.ObjectState)
                    {
                    case ObjectState.VertexAdded:
                        var sqlStorageDatabaseObject = _engine.Map <SqlStorage.DatabaseObject>(databaseObject);
                        ctx.DatabaseObjects.Add(sqlStorageDatabaseObject);
                        break;

                    case ObjectState.PropertiesModified:
                        // Properties can be addedd, deleted or change values
                        var objectInDatabase = ctx.DatabaseObjects.SingleOrDefault(f => f.FullyQualifiedName == databaseObject.FullyQualifiedName);
                        if (objectInDatabase == null)
                        {
                            // We can't add a property to an object that hasn't been saved yet.
                            throw new ArgumentException(nameof(objectInDatabase));
                        }
                        objectInDatabase.Properties.Clear();
                        foreach (var property in databaseObject.Properties)
                        {
                            objectInDatabase.Properties.Add(DatabaseObjectConverter.Convert(property));
                        }
                        ctx.Entry(objectInDatabase).State = EntityState.Modified;
                        break;
                    }
                }

                for (int i = 0; i < jaggedArray.Length; i++)
                {
                    var json = JsonConvert.SerializeObject(jaggedArray[i]);
                    ctx.DatabaseObjectVertices.Add(new DatabaseObjectVertex()
                    {
                        VertexId = i, AdjacencyListJson = json
                    });
                }
                ctx.SaveChanges();
            }
        }