// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. // #nullable disable using ScriptGenerator.Properties; using System.IO; using System.Text.RegularExpressions; namespace ScriptGenerator { public partial class Program { internal const string DefaultFileExtension = "Sql"; static readonly Regex ExtractDbName = CreateDbRegex(); static readonly Regex CreateTableRegex = CreateTableSyntaxRegex(); static readonly Regex AlterTableConstraintRegex = AlterTableSyntaxRegex(); static readonly Regex CreateViewRegex = CreateViewSyntaxRegex(); static readonly Regex CreateProcedureRegex = CreateProcedureSyntaxRegex(); static void Main(string[] args) { var options = new CommandOptions(args); for (int d = 1; d <= options.Databases; d++) { using (var writer = new StreamWriter(Path.ChangeExtension($@"{options.FilePathPrefix}{d}", DefaultFileExtension))) { string oldDbName = ExtractDbName.Match(Resources.AdventureWorks).Groups["dbName"].Value; string newDbName = $@"{oldDbName}{d}"; //Turn Off Strict Clr Mode writer.WriteLine(Resources.TurnOffClrStrictSecurityMode); //Put all original objects in the 'newDbName' database writer.WriteLine(Resources.AdventureWorks.Replace(oldDbName, newDbName)); // Multiple copies of Create Table statements for (int t = 1; t <= options.TablesMultiplier; t++) { string tablesScript = Resources.AdventureWorksTablesCreate.Replace(oldDbName, newDbName); tablesScript = CreateTableRegex.Replace(tablesScript, "${begin}" + t + "${middle}" + t + "${end}"); writer.WriteLine(AlterTableConstraintRegex.Replace(tablesScript, "${begin}"+ t + "${middle}" + t + "${end}")); } // Multiple copies of Create View statements for (int v = 1; v <= options.ViewsMultiplier; v++) { string viewScript = Resources.AdventureWorksViewsCreate.Replace(oldDbName, newDbName); writer.WriteLine(CreateViewRegex.Replace(viewScript, "${begin}" + v + "${end}")); } // Multiple copies of Create Procedure statements for (int s = 1; s <= options.StoredProceduresMultiplier; s++) { string spScript = Resources.AdventureWorksStoredProceduresCreate.Replace(oldDbName, newDbName); writer.WriteLine(CreateProcedureRegex.Replace(spScript, "${begin}" + s + "${end}")); } //Turn On Strict Clr Mode writer.WriteLine(Resources.TurnOnClrStrictSecurityMode); } } } [GeneratedRegex("CREATE\\s+DATABASE\\s+\\[(?\\w+)\\]", RegexOptions.IgnoreCase | RegexOptions.Compiled, "en-CA")] private static partial Regex CreateDbRegex(); [GeneratedRegex("(?CREATE\\s+TABLE\\s+.*)(?\\](?![\\.])[\\s\\S]*?CONSTRAINT\\s+\\[\\w+?)(?\\](?![\\.]))", RegexOptions.IgnoreCase | RegexOptions.Compiled, "en-CA")] private static partial Regex CreateTableSyntaxRegex(); [GeneratedRegex("(?ALTER\\s+TABLE\\s+.*?)(?\\](?![\\.])\\s*\\b(?:ADD|WITH|CHECK)\\b[\\s\\S]*?CONSTRAINT\\s+\\[\\w+?)(?\\](?![\\.]))", RegexOptions.IgnoreCase | RegexOptions.Compiled, "en-CA")] private static partial Regex AlterTableSyntaxRegex(); [GeneratedRegex("(?CREATE\\s+VIEW\\s+.*?)(?\\](?![\\.])[\\s\\S]*?\\bAS\\b)", RegexOptions.IgnoreCase | RegexOptions.Compiled, "en-CA")] private static partial Regex CreateViewSyntaxRegex(); [GeneratedRegex("(?CREATE\\s+PROCEDURE\\s+.*?)(?\\](?![\\.])[\\s\\S]*?(?:@|WITH|AS))", RegexOptions.IgnoreCase | RegexOptions.Compiled, "en-CA")] private static partial Regex CreateProcedureSyntaxRegex(); } }