/// <summary> /// Recursively scripts all objects in the collection while walking the dependency tree to ensure /// child or parent objects are dropped/created appropriately /// </summary> protected virtual void RecurseScript(Server server, StringCollection output, ScriptNameObjectBase dbobject, ScriptingOptions scriptOptions, ScriptEntity entity, bool parents) { if (dbobject == null || entity == null) return; LogMessage("Checking {0} '{1}'", dbobject.GetType().Name, dbobject.Name); if (CheckIsSystemObject(dbobject) || entity.HasBeenScripted || !Filter.IsMatch(dbobject.Name)) return; entity.HasBeenScripted = true; var dependencies = parents ? entity.EntitiesWhichIDependOn : entity.EntitiesWhichDependOnMe; foreach (var dependencyEntity in dependencies) { if (dependencyEntity != entity && dependencyEntity.HasBeenScripted == false) { RecurseScript(server, output, GetObjectByName(dependencyEntity.Schema, dependencyEntity.Name), scriptOptions, dependencyEntity, parents); } } LogMessage("Scripting {0} '{1}'", dbobject.GetType().Name, dbobject.Name); var scriptOutput = ((IScriptable)dbobject).Script(scriptOptions); var entries = new string[scriptOutput.Count + 1]; scriptOutput.CopyTo(entries, 0); entries[entries.Length - 1] = "GO"; output.AddRange(entries); }