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(); } }
// 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(); }
// 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(); } }