in src/PDWScripter/PDWscripter.cs [1479:1602]
private void getDML(PDWscripter c, string outFile)
{
StreamWriter sw = null;
FileStream fs = null;
Regex r = new Regex(this.ExcludeObjectSuffixList, RegexOptions.IgnoreCase);
string ModuleName;
if (outFile != "")
{
fs = new FileStream(outFile, FileMode.Create);
sw = new StreamWriter(fs);
}
Console.Write("DML>");
// get generated statistics
String description = "-- script generated the : " + String.Format("{0:d/M/yyyy HH:mm:ss}", DateTime.Now);
cmd.CommandText = "select count(1) from sys.sql_modules";
int objectcount = (int)cmd.ExecuteScalar();
description += "\r\n-- objects scripted - objects = " + objectcount.ToString();
Console.Write("objects scripted - objects = " + objectcount.ToString());
sw.WriteLine(description);
// Adaptation to sort by dependency
cmd.CommandText = "SELECT definition, object_name(M.object_id) from sys.sql_modules m JOIN SYS.OBJECTS o ON M.OBJECT_ID = o.OBJECT_ID " +
"WHERE SCHEMA_NAME(SCHEMA_ID) +'.' + object_name(M.object_id) LIKE '" + filterSpec + "' order by definition;";
//cmd.CommandText = "select definition, object_name(object_id) from sys.sql_modules order by definition;";
rdr = cmd.ExecuteReader();
String createUseDbTxt = "USE " + c.sourceDb + "\r\nGO\r\n";
sw.WriteLine(createUseDbTxt);
List<KeyValuePair<String, String>> lstDbObjectDefinitions = new List<KeyValuePair<string, string>>();
while (rdr.Read())
{
ModuleName = rdr.GetString(1);
if (!r.IsMatch(ModuleName))
{
IDataRecord record = (IDataRecord)rdr;
KeyValuePair<String, String> kvpObjNameDef = new KeyValuePair<String, String>(String.Format("{0}", record[1]), String.Format("{0}", record[0]));
if (!lstDbObjectDefinitions.Exists(objDef => objDef.Key == kvpObjNameDef.Key))
{
// Object doesn't exist
if (!lstDbObjectDefinitions.Any(objDef => objDef.Value.Contains(kvpObjNameDef.Key)))
{
// Object never used by an other object
lstDbObjectDefinitions.Add(kvpObjNameDef);
}
else
{
// Object already used by an other object, we had it previously to the calling one
int idxCallingObj = lstDbObjectDefinitions.IndexOf(lstDbObjectDefinitions.First(objDef => objDef.Value.Contains(kvpObjNameDef.Key)));
lstDbObjectDefinitions.Insert(idxCallingObj, kvpObjNameDef);
}
}
}
}
int nbObjectDefinitions = lstDbObjectDefinitions.Count();
int index = 0;
string prevDbObjectDefinition = String.Empty;
foreach (KeyValuePair<String, String> dbObjectDefinition in lstDbObjectDefinitions)
{
if (prevDbObjectDefinition != dbObjectDefinition.Value)
{
prevDbObjectDefinition = dbObjectDefinition.Value;
if (scriptMode == "Delta")
{
// Add object Drop
string strObjectFullName = dbObjectDefinition.Value.Substring(12, dbObjectDefinition.Value.IndexOf(' ', 13) - 12);
string strObjectType = dbObjectDefinition.Value.Substring(7, 4);
string strDropObjectQuery = "DROP " + strObjectType + " " + strObjectFullName + ";";
sw.WriteLine(strDropObjectQuery);
sw.WriteLine("");
if (index != nbObjectDefinitions - 1)
{
sw.WriteLine("GO");
}
sw.WriteLine("");
sw.WriteLine("");
}
// Add object Create
sw.WriteLine(dbObjectDefinition.Value.ToString());
sw.WriteLine("");
sw.WriteLine("GO");
sw.WriteLine("");
sw.WriteLine("");
Console.Write(".");
}
index++;
}
sw.WriteLine("PRINT 'END'");
if (outFile != "")
{
sw.Close();
}
rdr.Close();
Console.WriteLine("done");
}