private async Task CreateAsync(IEnumerable <BuildItem> items) { var scriptsToDependencies = items.ToDictionary(x => x, y => y.Dependencies.ToList()); Action <BuildItem> onSuccess = i => i.ReportSuccess(); Action <BuildItem, Exception> onFailure = (i, ex) => { // Script failed, set its status i.ReportError(new BuildError(ex)); // Set status of referencers DependencyError.SetDependencyErrorStatus(i.Referencers, Enumerable.Repeat(i, 1)); }; await ApplyScriptsAsync(scriptsToDependencies, new ScriptCreateExecutor(_connection, _transaction), x => x.Referencers, y => y.Status == BuildItem.BuildStatusType.None, onSuccess, onFailure); }
private ICollection <BuildItem> CreateItems(IDictionary <ScriptFile, ISet <DatabaseObject> > scriptDependencies, ISet <DatabaseObject> existingObjects) { var buildItems = new Dictionary <DatabaseObject, BuildItem>(scriptDependencies.Count, new DatabaseObjectComparer()); var buildItemToDependencies = new Dictionary <BuildItem, List <BuildItem> >(scriptDependencies.Count); var buildItemToReferencers = new Dictionary <BuildItem, List <BuildItem> >(scriptDependencies.Count); foreach (var s in scriptDependencies) { var dependencies = new List <BuildItem>(); var referencers = new List <BuildItem>(); bool objectExists = existingObjects.Contains(s.Key.ScriptObject); var bi = new BuildItem(s.Key, dependencies, referencers, objectExists); buildItemToDependencies.Add(bi, dependencies); buildItemToReferencers.Add(bi, referencers); buildItems.Add(bi.DatabaseObject, bi); } foreach (var item in buildItems) { var itemDependencies = scriptDependencies[item.Value.Script].Select(x => buildItems[x]); buildItemToDependencies[item.Value].AddRange(itemDependencies); var itemReferencers = buildItems.Values.Where(x => scriptDependencies[x.Script].Contains(item.Key)); buildItemToReferencers[item.Value].AddRange(itemReferencers); } foreach (var item in buildItems.Values) { if (item.Status == BuildItem.BuildStatusType.ScriptError) { DependencyError.SetDependencyErrorStatus(item.Referencers, Enumerable.Repeat(item, 1)); } if (item.BuildAction == BuildItem.BuildActionType.DropAndCreate) { SetDropCreateBuildAction(item.Referencers); } } return(buildItems.Values); }