/// <summary> /// Executes the passed-in code /// </summary> /// <param name="lang">ICodeLanguage</param> /// <param name="sourceCode">the code</param> /// <param name="methodName">the entry point method</param> /// <param name="parameters">the params</param> public static void RunAndExecute(ICodeLanguage lang, string sourceCode, string methodName, object[] parameters) { Console.WriteLine("Compiling source code..."); string[] source = new string[1]; source[0] = sourceCode; CompilerParameters compileParams = new CompilerParameters(); //Gonna create an assembly on the fly //so we need all the standard DLL's referenced from the GAC compileParams.ReferencedAssemblies.Add("System.Configuration.dll"); compileParams.ReferencedAssemblies.Add("System.Web.dll"); compileParams.ReferencedAssemblies.Add("System.Data.dll"); compileParams.ReferencedAssemblies.Add("System.dll"); compileParams.ReferencedAssemblies.Add("System.Xml.dll"); //add a dash of COM interop compileParams.ReferencedAssemblies.Add("mscorlib.dll"); //have to make sure SubSonic is added in compileParams.ReferencedAssemblies.Add("SubSonic.dll"); CompilerResults results = lang.CreateCodeProvider().CompileAssemblyFromSource(compileParams, source); if (results.Errors.Count > 0 || results.CompiledAssembly == null) { if (results.Errors.Count > 0) { StringBuilder sbError = new StringBuilder(); foreach (CompilerError error in results.Errors) { sbError.AppendLine(error.ErrorText); } //fails throw new Exception("Compile errors: \r\n" + sbError); } if (results.CompiledAssembly == null) { throw new Exception("Compiler errors: the code won't compile"); } return; } Console.WriteLine("Done!"); Console.WriteLine("Executing " + methodName); const string stubTypeName = "SubSonic.MigrationRunner"; //instance up the class object instance = results.CompiledAssembly.CreateInstance(stubTypeName); Type instanceType = instance.GetType(); //grab the method we're looking for MethodInfo method = instanceType.GetMethod(methodName); method.Invoke(instance, parameters); }
/// <summary> /// Builds the Enum template. /// </summary> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static TurboTemplate BuildEnumTemplate(ICodeLanguage language, DataProvider provider) { DataService.LoadProviders(); List <Replacement> list = new List <Replacement> { new Replacement(ReplacementVariable.Provider, provider.Name) }; return(PrepareTemplate("Enums - " + provider.Name, TemplateType.Enum, list, language, provider)); }
/// <summary> /// Executes the passed-in code /// </summary> /// <param name="lang">ICodeLanguage</param> /// <param name="sourceCode">the code</param> /// <param name="methodName">the entry point method</param> /// <param name="parameters">the params</param> public static void RunAndExecute(ICodeLanguage lang, string sourceCode, string methodName, object[] parameters) { Console.WriteLine("Compiling source code..."); string[] source = new string[1]; source[0] = sourceCode; CompilerParameters compileParams = new CompilerParameters(); //Gonna create an assembly on the fly //so we need all the standard DLL's referenced from the GAC compileParams.ReferencedAssemblies.Add("System.Configuration.dll"); compileParams.ReferencedAssemblies.Add("System.Web.dll"); compileParams.ReferencedAssemblies.Add("System.Data.dll"); compileParams.ReferencedAssemblies.Add("System.dll"); compileParams.ReferencedAssemblies.Add("System.Xml.dll"); //add a dash of COM interop compileParams.ReferencedAssemblies.Add("mscorlib.dll"); //have to make sure SubSonic is added in compileParams.ReferencedAssemblies.Add("SubSonic.dll"); CompilerResults results = lang.CreateCodeProvider().CompileAssemblyFromSource(compileParams, source); if(results.Errors.Count > 0 || results.CompiledAssembly == null) { if(results.Errors.Count > 0) { StringBuilder sbError = new StringBuilder(); foreach(CompilerError error in results.Errors) sbError.AppendLine(error.ErrorText); //fails throw new Exception("Compile errors: \r\n" + sbError); } if(results.CompiledAssembly == null) throw new Exception("Compiler errors: the code won't compile"); return; } Console.WriteLine("Done!"); Console.WriteLine("Executing " + methodName); const string stubTypeName = "SubSonic.MigrationRunner"; //instance up the class object instance = results.CompiledAssembly.CreateInstance(stubTypeName); Type instanceType = instance.GetType(); //grab the method we're looking for MethodInfo method = instanceType.GetMethod(methodName); method.Invoke(instance, parameters); }
/// <summary> /// Builds the view template. /// </summary> /// <param name="tableName">Name of the table.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static TurboTemplate BuildViewTemplate(string tableName, ICodeLanguage language, DataProvider provider) { DataService.LoadProviders(); if (ShouldGenerate(tableName, provider.Name)) { List <Replacement> list = new List <Replacement>(); list.Add(new Replacement(ReplacementVariable.View, tableName)); list.Add(new Replacement(ReplacementVariable.Provider, provider.Name)); return(PrepareTemplate(String.Concat("View - ", provider.Name, ": ", tableName), TemplateType.ReadOnly, list, language, provider)); } Utility.WriteTrace(String.Format("View {0} is excluded from generation", tableName)); return(null); }
/// <summary> /// Adds the template. /// </summary> /// <param name="template">The template.</param> public void AddTemplate(TurboTemplate template) { if (template != null) { if (templates.Count == 0) { References = template.References; Language = template.CompileLanguage; } template.EntryPoint = "Render"; template.GeneratedRenderType = String.Concat("Parser", Templates.Count); template.TemplateText = Utility.FastReplace(template.TemplateText, "#TEMPLATENUMBER#", Templates.Count.ToString(), StringComparison.InvariantCultureIgnoreCase); templates.Add(template); } }
/// <summary> /// Builds the ODS template. /// </summary> /// <param name="tableName">Name of the table.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static TurboTemplate BuildODSTemplate(string tableName, ICodeLanguage language, DataProvider provider) { DataService.LoadProviders(); if (ShouldGenerate(tableName, provider.Name) && provider.GenerateODSControllers) { List <Replacement> list = new List <Replacement> { new Replacement(ReplacementVariable.Table, tableName), new Replacement(ReplacementVariable.Provider, provider.Name) }; return(PrepareTemplate(String.Concat("ODS Controller - ", provider.Name, ": ", tableName), TemplateType.ODSController, list, language, provider)); } Utility.WriteTrace(String.Format("{0} is excluded from generation", tableName)); return(null); }
/// <summary> /// Cleans the template. /// </summary> /// <param name="templateInputText">The template input text.</param> /// <param name="language">The language.</param> /// <returns></returns> private static string CleanTemplate(string templateInputText, ref ICodeLanguage language) { //// Modify this part if you want to read the <%@ tags also you can implement your own tags here. templateInputText = regexProperty.Replace(templateInputText, String.Empty); templateInputText = regexAssembly.Replace(templateInputText, String.Empty); templateInputText = regexImport.Replace(templateInputText, String.Empty); templateInputText = regexCodeTemplate.Replace(templateInputText, String.Empty); templateInputText = ParseTemplate(templateInputText); templateInputText = regexCleanCalls.Replace(templateInputText, new MatchEvaluator(CleanCalls)); templateInputText = regexEmptyBrackets.Replace(templateInputText, String.Empty); templateInputText = regexCleanCodeTags.Replace(templateInputText, new MatchEvaluator(CleanCodeTags)); // strip the directive templateInputText = regexPage.Replace(templateInputText, String.Empty); StringBuilder sb = new StringBuilder(HEADER); sb.Append(templateInputText); sb.Append(FOOTER); return(sb.ToString().Trim()); }
/// <summary> /// Runs the structs. /// </summary> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static string RunStructs(ICodeLanguage language, DataProvider provider) { TurboTemplate tt = BuildStructsTemplate(language, provider); return(tt.Render()); }
/// <summary> /// Gets the template text. /// </summary> /// <param name="t">The t.</param> /// <param name="language">The language.</param> /// <returns></returns> private static string GetTemplateText(TemplateType t, ICodeLanguage language) { string template; string templateText = null; switch(t) { case TemplateType.Class: template = TemplateName.CLASS; break; case TemplateType.ReadOnly: template = TemplateName.VIEW; break; case TemplateType.SP: template = TemplateName.STORED_PROCEDURE; break; case TemplateType.Enum: template = TemplateName.ENUM; break; case TemplateType.Structs: template = TemplateName.STRUCTS; break; case TemplateType.ODSController: template = TemplateName.ODS_CONTROLLER; break; case TemplateType.DynamicScaffold: template = TemplateName.DYNAMIC_SCAFFOLD; break; case TemplateType.GeneratedScaffoldCodeBehind: template = TemplateName.GENERATED_SCAFFOLD_CODE_BEHIND; break; case TemplateType.GeneratedScaffoldMarkup: template = TemplateName.GENERATED_SCAFFOLD_MARKUP; break; case TemplateType.Schemes: template = TemplateName.SCHEMA; break; default: template = TemplateName.CLASS; break; } template = String.Concat(language.TemplatePrefix, template, FileExtension.DOT_ASPX); // decide where to pull the text from if(!String.IsNullOrEmpty(templateDirectory)) { Utility.WriteTrace(String.Concat("Looking for template ", template, " in ", templateDirectory)); // make sure the template exists string templatePath = Path.Combine(templateDirectory, template); if(File.Exists(templatePath)) templateText = Files.GetFileText(templatePath); else Utility.WriteTrace(String.Concat("Template ", template, " NOT FOUND in directory ", templateDirectory, "; using embedded resource template instead...")); } if(String.IsNullOrEmpty(templateText)) { Utility.WriteTrace(String.Format("Loading template from resource: {0}", template)); templateText = TurboTemplate.LoadTextFromManifest(template); } if(String.IsNullOrEmpty(templateText)) throw new Exception(String.Format("The template \"{0}\" is empty or cannot be found.", template)); return templateText; }
public static string GetEnumScript(DataProvider provider, TableSchema.Table tbl, bool GenerateEnumDebugText, string[] EnumSettings, string[] EnumSettingsExclude, ICodeLanguage language) { string rtn = ""; bool IsVb = (language.Identifier=="VB.NET"); string commentmarker = (IsVb ? "'" : "//"); if (GenerateEnumDebugText) { rtn += "\r\n\r\n\t\t" + commentmarker + " tbl: " + tbl.Name; } for (int k = 0; k < EnumSettings.Length; k++) { string enumSetting = EnumSettings[k]; string enumSettingExlude = ""; if (EnumSettingsExclude.Length > k) { enumSettingExlude = EnumSettingsExclude[k]; } string[] settings = enumSetting.Split(new char[] { ':' }); string regExFind = ""; if (settings.Length > 0) { regExFind = settings[0].Trim(); } bool matched = regExFind.Length > 0 && Regex.IsMatch(tbl.Name, regExFind, RegexOptions.IgnoreCase); bool excluded = enumSettingExlude.Trim() != "" && Regex.IsMatch(tbl.Name, enumSettingExlude.Trim(), RegexOptions.IgnoreCase); bool found = matched && !excluded; if (GenerateEnumDebugText) { rtn += "\r\n\t\t" + commentmarker + " " + k.ToString() + ": " + (matched ? "" : "not ") + "matched '" + regExFind + "'"; } if (GenerateEnumDebugText) { rtn += "\r\n\t\t" + commentmarker + " " + k.ToString() + ": " + (excluded ? "" : "not ") + "excluded '" + enumSettingExlude.Trim() + "'"; } if (found) { string SqlScript = ""; //if (GenerateEnumDebugText) { SqlScript += "\r\n\t\t// tbl: " + tbl.Name + "\r\n\t\t// match: " + enumSetting; } // Get Enum Details string EnumName = ""; string IdCol = ""; string DescriptionCol = ""; string multiKeyCol = ""; string SqlWhereClause = ""; bool idColIsString = false; bool isMulti = false; bool idColFound = false; bool descColFound = false; bool multiKeyColFound = false; if (settings.Length > 1) { EnumName = settings[1].Trim(); } if (EnumName.StartsWith(MultiMarker, StringComparison.InvariantCultureIgnoreCase)) { isMulti = true; multiKeyCol = EnumName.Substring(MultiMarker.Length); } if (settings.Length > 2) { IdCol = settings[2].Trim(); } if (settings.Length > 3) { DescriptionCol = settings[3].Trim(); } if (settings.Length > 4) { SqlWhereClause = settings[4].Trim(); } // check the cols do actually exist if specified foreach (var col in tbl.Columns) { if (IdCol == "" && col.IsPrimaryKey) { IdCol = col.ColumnName; } if (DescriptionCol == "" && !col.IsPrimaryKey && !col.IsForeignKey && col.DataType == System.Data.DbType.String) { DescriptionCol = col.ColumnName; } if (IdCol == col.ColumnName) { idColFound = true; idColIsString = (col.DataType == System.Data.DbType.String); } if (DescriptionCol == col.ColumnName) { descColFound = true; } if (isMulti && multiKeyCol == col.ColumnName) { multiKeyColFound = true; } } if (EnumName == "") { EnumName = GetEnumName(tbl.ClassName, idColIsString); } // generate the script or a warning message if (!idColFound || !descColFound || (isMulti && !multiKeyColFound)) { SqlScript += "\r\n\t\t" + commentmarker + " " + tbl.Name + ": enumSetting could not be matched to ID" + (isMulti ? ", Key " : "") + " and Description columns. Setting=" + enumSetting + "\r\n"; } else { //pull the tables in a reader int rowCount = 0; List<string> enumValList = new List<string>(); string enumMemberScript = ""; string lastKeyVal = ""; string sql = GetEnumSql(IdCol, DescriptionCol, multiKeyCol, tbl.Name, SqlWhereClause); try { using (IDataReader rdr = provider.GetReader(new QueryCommand(sql))) { while (rdr.Read()) { string enumMemberName = CleanUp(rdr[DescriptionCol].ToString()); if (enumValList.Contains(enumMemberName)) { int uniqueVal = 0; string tempMemberName = enumMemberName; while (enumValList.Contains(tempMemberName)) { tempMemberName = enumMemberName + (++uniqueVal).ToString(); } enumMemberName = tempMemberName; } string enumMemberValue = rdr[IdCol].ToString(); string enumKeyVal = (isMulti ? CleanUp(rdr[multiKeyCol].ToString()) : ""); if (rowCount != 0 && lastKeyVal != enumKeyVal) { // we are doing a multi read, use the key val to generate an enum for each block of key values string tempEnumName = GetEnumName(lastKeyVal, idColIsString); SqlScript += GetEnumHeaderFooter(tbl.Name, tempEnumName, IdCol, DescriptionCol, enumMemberScript, idColIsString, IsVb); enumMemberScript = ""; } if (IsVb) { if (idColIsString) { enumMemberScript += "\t\t\tPublic Const " + enumMemberName + " As String = \"" + enumMemberValue + "\";\r\n"; } else { enumMemberScript += "\t\t\t" + enumMemberName + " = " + enumMemberValue; } } else { if (idColIsString) { enumMemberScript += "\t\t\tpublic const string " + enumMemberName + " = \"" + enumMemberValue + "\";\r\n"; } else { enumMemberScript += (enumMemberScript == "" ? "" : ",\r\n"); enumMemberScript += "\t\t\t" + enumMemberName + " = " + enumMemberValue; } } enumValList.Add(enumMemberName); lastKeyVal = enumKeyVal; rowCount++; } } if (rowCount == 0) { SqlScript += "\r\n\t\t" + commentmarker + " " + tbl.Name + ": enum generation was specfied but the database table had no records\r\n"; } else { string tempEnumName = (isMulti ? GetEnumName(lastKeyVal, idColIsString) : EnumName); SqlScript += GetEnumHeaderFooter(tbl.Name, tempEnumName, IdCol, DescriptionCol, enumMemberScript, idColIsString, IsVb); } } catch (Exception ex) { SqlScript += "\r\n\t\t" + commentmarker + " SQL fetch error in SQL \"" + sql + "\" : " + ex.Message; } } rtn += SqlScript; } } return rtn; }
/// <summary> /// Runs the class. /// </summary> /// <param name="tableName">Name of the table.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static string RunSchemes(string tableName, ICodeLanguage language, DataProvider provider) { TurboTemplate tt = BuildSchemaTemplate(tableName, language, provider); return tt.Render(); }
/// <summary> /// Not currently used, but will be the basis for user defined templates. Please don't remove! /// </summary> /// <param name="templateFile">The template file.</param> /// <param name="values">The values.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static string RunTemplate(string templateFile, NameValueCollection values, ICodeLanguage language, DataProvider provider) { string templatePath = Path.Combine(TemplateDirectory, templateFile); string templateText = Files.GetFileText(templatePath); for(int i = 0; i < values.Count; i++) templateText = templateText.Replace(values.GetKey(i), values.Get(i)); TurboTemplate t = new TurboTemplate(templateText, language, provider); return t.Render(); }
/// <summary> /// Executes the passed-in code /// </summary> /// <param name="lang">ICodeLanguage</param> /// <param name="sourceCode">the code</param> /// <param name="methodName">the entry point method</param> /// <param name="parameters">the params</param> public static void RunAndExecute(ICodeLanguage lang, string sourceCode, string methodName, object[] parameters) { string[] source = new string[1]; source[0] = sourceCode; CompilerParameters compileParams = new CompilerParameters { GenerateInMemory = true }; //Gonna create an assembly on the fly //so we need all the standard DLL's referenced from the GAC compileParams.ReferencedAssemblies.Add("System.Configuration.dll"); compileParams.ReferencedAssemblies.Add("System.Web.dll"); compileParams.ReferencedAssemblies.Add("System.Data.dll"); compileParams.ReferencedAssemblies.Add("System.dll"); compileParams.ReferencedAssemblies.Add("System.Xml.dll"); //add a dash of COM interop compileParams.ReferencedAssemblies.Add("mscorlib.dll"); //have to make sure SubSonic is added in. Since this assembly is //generated in memory it needs to be told exactly where the SubSonic.dll is //because SubSonic.dll doesn't live in the Framework folder, so lets grab //the same SubSonic.dll that is already loaded and use that one. Not //sure how much of a hack this is but it works for me. // //this is a little sketch because if the SubSonic.dll hasn't been //loaded yet then this will fail. Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); Assembly subsonicAssembly = Array.Find( assemblies, delegate(Assembly a) { AssemblyName an = a.GetName(); return an.Name == "SubSonic"; } ); if(subsonicAssembly == null) throw new Exception("Unable to location the SubSonic.dll. Make sure it's referenced in your project."); Uri subsonicUri = new Uri(subsonicAssembly.CodeBase); compileParams.ReferencedAssemblies.Add(subsonicUri.LocalPath); //compile the assembly CompilerResults results = lang.CreateCodeProvider().CompileAssemblyFromSource(compileParams, source); if(results.Errors.Count > 0 || results.CompiledAssembly == null) { if(results.Errors.Count > 0) { StringBuilder sbError = new StringBuilder(); foreach(CompilerError error in results.Errors) sbError.AppendLine(error.ErrorText); //fails throw new Exception("Compile errors: \r\n" + sbError); } if(results.CompiledAssembly == null) throw new Exception("Compiler errors: the code won't compile"); return; } string typeName = GetTypeName(sourceCode, lang); //instance up the class object instance = results.CompiledAssembly.CreateInstance(typeName); //if the instance is null, it means we haven't parsed the namespace/classname properly if(instance == null) throw new InvalidOperationException("SubSonic was not able to parse the namespace/class name of your Migration class properly - cannot find it: " + typeName); Type instanceType = instance.GetType(); //grab the method we're looking for MethodInfo method = instanceType.GetMethod(methodName); method.Invoke(instance, parameters); }
private static void GenerateTables() { //if (DataService.Provider == null) SetProvider(); string fileExt = FileExtension.DOT_CS; string lang = _language; if (FileExtension.IsVB(lang)) { language = new VBCodeLanguage(); fileExt = FileExtension.DOT_VB; } //string usings = ParseUtility.GetUsings(language); if (DataService.Providers.Count == 0) { Console.WriteLine("There's a problem with the providers - none were loaded and no exceptions where thrown."); } else { //loop the providers, and if there's more than one, output to their own folder //for tidiness foreach (DataProvider provider in DataService.Providers) { //get the table list string[] tables = DataService.GetTableNames(provider.Name); string message = "Generating classes for " + provider.Name + " (" + tables.Length + " total)"; if (tables.Length > 200) { message += " that's a serious amount of tables to generate. But we can handle it. You just will need to be patient and go get some coffee while we do this thang..."; } else if (tables.Length > 100) { message += " that's a lot of tables. This could take a few minutes..."; } else if (tables.Length > 50) { message += " - moderate amount of tables... this could take 30 seconds or so..."; } AddLogEntry(LogState.Information, message); string outDir = GetOutSubDir(provider); /* * ArrayList evalTables = new ArrayList(); * foreach (string tbl in tables) * { * TableSchema.Table t = DataService.GetTableSchema(tbl, provider.Name); * Console.Write("."); * if(t.ForeignKeys.Count > 0) * { * provider.GetManyToManyTables(t, evalTables); * } * } */ foreach (string tbl in tables) { if (IsInList(tbl) && !IsExcluded(tbl) && CodeService.ShouldGenerate(tbl, provider.Name)) { string className = DataService.GetSchema(tbl, provider.Name, TableType.Table).ClassName; TurboTemplate tt = CodeService.BuildClassTemplate(tbl, language, provider); tt.OutputPath = Path.Combine(outDir, className + fileExt); turboCompiler.AddTemplate(tt); } } } AddLogEntry(LogState.Information, "Finished"); } }
/// <summary> /// Generates the editor. /// </summary> /// <param name="table">The table.</param> /// <param name="outDir">The out dir.</param> private static void GenerateEditor(string table, string outDir) { bool haveError = false; WriteVersionInformation(String.Empty); if(table == String.Empty) { Console.WriteLine("No table name was entered; please specify the name of the table using /table"); haveError = true; } if(!haveError) { Console.WriteLine("Generating editor for " + table); if(DataService.Provider == null) SetProvider(); language = CodeLanguageFactory.GetByShortName(GetArg("lang")); TableSchema.Table tableSchema = DataService.GetSchema(table, DataService.Provider.Name, TableType.Table); string pageName = tableSchema.ClassName + "Editor.aspx"; string codePageName = pageName + language.FileExtension; string pageFile = Path.Combine(outDir, pageName); string codeFile = Path.Combine(outDir, codePageName); //generate up the editor try { //string page = ScaffoldCodeGenerator.GeneratePage(DataService.Provider.Name, table, pageName, "", langType); //string code = ScaffoldCodeGenerator.GenerateCode(pageName, DataService.Provider.Name, table, langType); //string page = ""; //string code = ""; //Clipboard.SetData(System.Windows.Forms.DataFormats.StringFormat, page); //OutputFile(pageFile, page); //OutputFile(codeFile, code); //Console.WriteLine("Copied to clipboard" + pageName); } catch { Console.WriteLine("ERROR: Can't generate editor for " + table + "."); Console.WriteLine("Please check the table name and that the you specified the right provider (you can set the provider by using /provider)"); } } else ThrowHelp(false); }
protected void btnGo_Click(object sender, EventArgs e) { string sOutPath = txtOut.Text; if (!Directory.Exists(sOutPath)) { Directory.CreateDirectory(sOutPath); } try { ICodeLanguage language = CodeLanguageFactory.GetByShortName(languageSelect.SelectedValue); string providerName = (string)Session[PROVIDER_NAME]; if (!String.IsNullOrEmpty(providerName)) { DataProvider provider = DataService.GetInstance(providerName); if (provider != null) { TurboCompiler turboCompiler = new TurboCompiler(); StringBuilder sbTableList = new StringBuilder(); foreach (ListItem item in chkTables.Items) { if (item.Selected) { sbTableList.AppendLine(item.Value); } } foreach (ListItem item in chkTables.Items) { if (item.Selected) { TableSchema.Table t = DataService.GetTableSchema(item.Value, provider.Name, TableType.Table); if (t.ForeignKeys.Count > 0) { //provider.GetManyToManyTables(t, evalTables); } string className = DataService.GetTableSchema(item.Value, providerName, TableType.Table).ClassName; string filePath = Path.Combine(sOutPath, className + language.FileExtension); TurboTemplate classTemplate = CodeService.BuildClassTemplate(item.Value, language, provider); classTemplate.OutputPath = filePath; turboCompiler.AddTemplate(classTemplate); //SubSonic.Sugar.Files.CreateToFile(filePath, usings + CodeService.RunClass(item.Value, providerName, language)); if (chkODS.Checked) { filePath = Path.Combine(sOutPath, className + "Controller" + language.FileExtension); TurboTemplate odsTemplate = CodeService.BuildODSTemplate(item.Value, language, provider); odsTemplate.OutputPath = filePath; turboCompiler.AddTemplate(odsTemplate); //SubSonic.Sugar.Files.CreateToFile(filePath, usings + CodeService.RunODS(item.Value, providerName, language)); } } } //output the Views foreach (ListItem item in chkViews.Items) { if (item.Selected) { string className = DataService.GetTableSchema(item.Value, providerName, TableType.View).ClassName; string filePath = Path.Combine(sOutPath, className + language.FileExtension); TurboTemplate viewTemplate = CodeService.BuildViewTemplate(item.Value, language, provider); viewTemplate.OutputPath = filePath; turboCompiler.AddTemplate(viewTemplate); //SubSonic.Sugar.Files.CreateToFile(filePath, usings + CodeService.RunReadOnly(item.Value, providerName, language)); } } //output the SPs if (chkSP.Checked) { string filePath = Path.Combine(sOutPath, "StoredProcedures" + language.FileExtension); TurboTemplate spTemplate = CodeService.BuildSPTemplate(language, provider); spTemplate.OutputPath = filePath; turboCompiler.AddTemplate(spTemplate); //SubSonic.Sugar.Files.CreateToFile(filePath, usings + CodeService.RunSPs(providerName, language)); } //structs string structPath = Path.Combine(sOutPath, "AllStructs" + language.FileExtension); TurboTemplate structsTemplate = CodeService.BuildStructsTemplate(language, provider); structsTemplate.OutputPath = structPath; turboCompiler.AddTemplate(structsTemplate); //SubSonic.Sugar.Files.CreateToFile(structPath, usings + CodeService.RunStructs(language)); if (turboCompiler.Templates.Count > 0) { turboCompiler.Run(); foreach (TurboTemplate template in turboCompiler.Templates) { Utility.WriteTrace("Writing " + template.TemplateName + " as " + template.OutputPath.Substring(template.OutputPath.LastIndexOf("\\") + 1)); SubSonic.Sugar.Files.CreateToFile(template.OutputPath, template.FinalCode); } } lblResult.Text = "View your files: <a href='file://" + sOutPath + "'>" + sOutPath + "</a>"; } } } catch (Exception x) { lblResult.Text = "Error: " + x.Message; } }
/// <summary> /// Scrubs the output. /// </summary> /// <param name="result">The result.</param> /// <param name="language">The language.</param> /// <returns></returns> private static string ScrubOutput(string result, ICodeLanguage language) { if(!String.IsNullOrEmpty(result)) { // the generator has an issue with adding extra lines. Trim them out result = regLineFix.Replace(result, "\r\n"); // now, for readability, add a space after the end of the method/class if(language is CSharpCodeLanguage) { result = regNamespace.Replace(result, "\r\nnamespace"); result = Utility.FastReplace(result, "public class ", "\r\npublic class ", StringComparison.InvariantCulture); } else { // trailing space needed to address class names that begin with "Class" result = Utility.FastReplace(result, "Public Class ", "\r\nPublic Class ", StringComparison.InvariantCulture); } result = Utility.FastReplace(result, "[<]", "<", StringComparison.InvariantCultureIgnoreCase); result = Utility.FastReplace(result, "[>]", ">", StringComparison.InvariantCultureIgnoreCase); // This is should be executed last. While this value will ultimately be removed, it can be inserted in a template to keep an earlier operation from executing. // For example: <System.ComponentModel.DataObject()> Public Class MyController would normally wrap to a second line due upstream processing, which would // result in VB code that won't compile. However, <System.ComponentModel.DataObject()> Public [MONKEY_WRENCH]Class MyController, would not. // Nice Eric... :P // result = Utility.FastReplace(result, "[MONKEY_WRENCH]", String.Empty, StringComparison.InvariantCultureIgnoreCase); // Not currently used, but please leave in case we need it in the future! } return result; }
/// <summary> /// Generates the S ps. /// </summary> private static void GenerateSPs() { SetProvider(); language = CodeLanguageFactory.GetByShortName(GetArg("lang")); //loop the providers, and if there's more than one, output to their own folder //for tidiness foreach(DataProvider provider in DataService.Providers) { string outDir = GetOutSubDir(provider); if(outDir == String.Empty) outDir = Directory.GetCurrentDirectory(); if(!Directory.Exists(outDir)) Directory.CreateDirectory(outDir); string outPath = Path.Combine(outDir, "StoredProcedures" + language.FileExtension); Console.WriteLine("Generating SPs to " + outPath); TurboTemplate tt = CodeService.BuildSPTemplate(language, provider); tt.OutputPath = outPath; turboCompiler.AddTemplate(tt); } Console.WriteLine("Finished"); }
/// <summary> /// Adds the template. /// </summary> /// <param name="template">The template.</param> public void AddTemplate(TurboTemplate template) { if(template != null) { if(templates.Count == 0) { References = template.References; Language = template.CompileLanguage; } template.EntryPoint = "Render"; template.GeneratedRenderType = String.Concat("Parser", Templates.Count); template.TemplateText = Utility.FastReplace(template.TemplateText, "#TEMPLATENUMBER#", Templates.Count.ToString(), StringComparison.InvariantCultureIgnoreCase); templates.Add(template); } }
protected void btnGo_Click(object sender, EventArgs e) { DataProvider provider = DataService.GetInstance(ddlProvider.SelectedValue); if (provider != null) { try { StringBuilder sbIndex = new StringBuilder(); ArrayList fileNames = new ArrayList(); bool outputCode = radOutputType.SelectedIndex == 0; ICodeLanguage language = CodeLanguageFactory.GetByShortName(languageSelect.SelectedValue); string masterPageText = masterPageName.Text.Trim(); foreach (ListItem item in chkTables.Items) { TurboCompiler turboCompiler = new TurboCompiler(); if (item.Selected) { string tableFileName = item.Value.Replace(SpecialString.SPACE, String.Empty); string tableName = item.Value; string className = DataService.GetSchema(tableName, provider.Name, TableType.Table).ClassName; string fileNameNoExtension = tbxPrefix.Text.Trim() + FormatTableName(tableFileName) + tbxSuffix.Text.Trim(); string fileName = fileNameNoExtension + FileExtension.DOT_ASPX; string filePath = txtOut.Text + "\\" + fileName; fileNames.Add(filePath); NameValueCollection nVal = new NameValueCollection(); nVal.Add(TemplateVariable.LANGUAGE, language.Identifier); nVal.Add(TemplateVariable.CLASS_NAME, className); nVal.Add(TemplateVariable.TABLE_NAME, tableName); nVal.Add(TemplateVariable.MASTER_PAGE, masterPageText); if (outputCode) { nVal.Add(TemplateVariable.LANGUAGE_EXTENSION, language.FileExtension); nVal.Add(TemplateVariable.PROVIDER, provider.Name); nVal.Add(TemplateVariable.PAGE_FILE, fileNameNoExtension); TurboTemplate scaffoldCodeBehind = CodeService.BuildTemplate(CodeService.TemplateType.GeneratedScaffoldCodeBehind, nVal, language, provider); scaffoldCodeBehind.AddUsingBlock = false; scaffoldCodeBehind.OutputPath = filePath.Replace(FileExtension.DOT_ASPX, (FileExtension.DOT_ASPX + language.FileExtension)); turboCompiler.AddTemplate(scaffoldCodeBehind); TurboTemplate scaffoldMarkup = CodeService.BuildTemplate(CodeService.TemplateType.GeneratedScaffoldMarkup, nVal, language, provider); scaffoldMarkup.AddUsingBlock = false; scaffoldMarkup.OutputPath = filePath; turboCompiler.AddTemplate(scaffoldMarkup); } else { TurboTemplate dynamicScaffold = CodeService.BuildTemplate(CodeService.TemplateType.DynamicScaffold, nVal, language, provider); dynamicScaffold.AddUsingBlock = false; dynamicScaffold.OutputPath = filePath; turboCompiler.AddTemplate(dynamicScaffold); } sbIndex.AppendLine("<a href=\"" + fileName + "\">" + FormatTableName(tableName) + "</a><br/>"); } if (turboCompiler.Templates.Count > 0) { turboCompiler.Run(); foreach (TurboTemplate template in turboCompiler.Templates) { Utility.WriteTrace("Writing " + template.TemplateName + " as " + template.OutputPath.Substring(template.OutputPath.LastIndexOf("\\") + 1)); SubSonic.Sugar.Files.CreateToFile(template.OutputPath, template.FinalCode); } } } if (chkIndexPage.Checked && tbxIndexName.Text != String.Empty) { string before = "<html><head><title>SubSonic Scaffold Index Page</title></head><body>"; string after = "</body></html>"; WriteToFile(txtOut.Text + "\\" + tbxIndexName.Text, before + sbIndex + after); } lblResult.Text = "Finished"; } catch (Exception x) { lblResult.Text = "Error: " + x.Message; } } }
/// <summary> /// Executes the passed-in code /// </summary> /// <param name="lang">ICodeLanguage</param> /// <param name="sourceCode">the code</param> /// <param name="methodName">the entry point method</param> /// <param name="parameters">the params</param> public static void RunAndExecute(ICodeLanguage lang, string sourceCode, string methodName, object[] parameters) { string[] source = new string[1]; source[0] = sourceCode; CompilerParameters compileParams = new CompilerParameters(); compileParams.GenerateInMemory = true; //Gonna create an assembly on the fly //so we need all the standard DLL's referenced from the GAC compileParams.ReferencedAssemblies.Add("System.Configuration.dll"); compileParams.ReferencedAssemblies.Add("System.Web.dll"); compileParams.ReferencedAssemblies.Add("System.Data.dll"); compileParams.ReferencedAssemblies.Add("System.dll"); compileParams.ReferencedAssemblies.Add("System.Xml.dll"); //add a dash of COM interop compileParams.ReferencedAssemblies.Add("mscorlib.dll"); //have to make sure SubSonic is added in. Since this assembly is //generated in memory it needs to be told exactly where the SubSonic.dll is //because SubSonic.dll doesn't live in the Framework folder, so lets grab //the same SubSonic.dll that is already loaded and use that one. Not //sure how much of a hack this is but it works for me. // //this is a little sketch because if the SubSonic.dll hasn't been //loaded yet then this will fail. Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); Assembly subsonicAssembly = Array.Find( assemblies, delegate(Assembly a) { AssemblyName an = a.GetName(); return(an.Name == "SubSonic"); } ); if (subsonicAssembly == null) { throw new Exception("Unable to location the SubSonic.dll. Make sure it's referenced in your project."); } Uri subsonicUri = new Uri(subsonicAssembly.CodeBase); compileParams.ReferencedAssemblies.Add(subsonicUri.LocalPath); //compile the assembly CompilerResults results = lang.CreateCodeProvider().CompileAssemblyFromSource(compileParams, source); if (results.Errors.Count > 0 || results.CompiledAssembly == null) { if (results.Errors.Count > 0) { StringBuilder sbError = new StringBuilder(); foreach (CompilerError error in results.Errors) { sbError.AppendLine(error.ErrorText); } //fails throw new Exception("Compile errors: \r\n" + sbError); } if (results.CompiledAssembly == null) { throw new Exception("Compiler errors: the code won't compile"); } return; } string typeName = GetTypeName(sourceCode, lang); //instance up the class object instance = results.CompiledAssembly.CreateInstance(typeName); //if the instance is null, it means we haven't parsed the namespace/classname properly if (instance == null) { throw new InvalidOperationException("SubSonic was not able to parse the namespace/class name of your Migration class properly - cannot find it: " + typeName); } Type instanceType = instance.GetType(); //grab the method we're looking for MethodInfo method = instanceType.GetMethod(methodName); method.Invoke(instance, parameters); }
/// <summary> /// Gets the template text. /// </summary> /// <param name="t">The t.</param> /// <param name="language">The language.</param> /// <returns></returns> private static string GetTemplateText(TemplateType t, ICodeLanguage language) { string template; string templateText = null; switch (t) { case TemplateType.Class: template = TemplateName.CLASS; break; case TemplateType.ReadOnly: template = TemplateName.VIEW; break; case TemplateType.SP: template = TemplateName.STORED_PROCEDURE; break; case TemplateType.Structs: template = TemplateName.STRUCTS; break; case TemplateType.ODSController: template = TemplateName.ODS_CONTROLLER; break; case TemplateType.DynamicScaffold: template = TemplateName.DYNAMIC_SCAFFOLD; break; case TemplateType.GeneratedScaffoldCodeBehind: template = TemplateName.GENERATED_SCAFFOLD_CODE_BEHIND; break; case TemplateType.GeneratedScaffoldMarkup: template = TemplateName.GENERATED_SCAFFOLD_MARKUP; break; default: template = TemplateName.CLASS; break; } template = String.Concat(language.TemplatePrefix, template, FileExtension.DOT_ASPX); // decide where to pull the text from if (!String.IsNullOrEmpty(templateDirectory)) { Utility.WriteTrace(String.Concat("Looking for template ", template, " in ", templateDirectory)); // make sure the template exists string templatePath = Path.Combine(templateDirectory, template); if (File.Exists(templatePath)) { templateText = Files.GetFileText(templatePath); } else { Utility.WriteTrace(String.Concat("Template ", template, " NOT FOUND in directory ", templateDirectory, "; using embedded resource template instead...")); } } if (String.IsNullOrEmpty(templateText)) { Utility.WriteTrace(String.Format("Loading template from resource: {0}", template)); templateText = TurboTemplate.LoadTextFromManifest(template); } if (String.IsNullOrEmpty(templateText)) { throw new Exception(String.Format("The template \"{0}\" is empty or cannot be found.", template)); } return(templateText); }
/// <summary> /// Builds the structs template. /// </summary> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static TurboTemplate BuildStructsTemplate(ICodeLanguage language, DataProvider provider) { DataService.LoadProviders(); List<Replacement> list = new List<Replacement> { new Replacement(ReplacementVariable.Provider, provider.Name) }; return PrepareTemplate("Structs Class", TemplateType.Structs, list, language, provider); }
/// <summary> /// Gets the name of the type. /// </summary> /// <param name="source">The source.</param> /// <param name="lang">The lang.</param> /// <returns></returns> private static string GetTypeName(string source, ICodeLanguage lang) { string classReplacement; string namespaceReplacement; Regex classRegex; Regex namespaceRegex; if (lang is VBCodeLanguage) { classReplacement = "${Class}"; namespaceReplacement = "${Namespace}"; classRegex = new Regex(@"Class (?<Class>\w*)"); namespaceRegex = new Regex(@"Namespace (?<Namespace>[a-zA-Z0-9.-[{]]*)"); } else { classReplacement = "${class}"; namespaceReplacement = "${namespace}"; classRegex = new Regex(@"class (?<class>\w*)"); //many thanks to rballonline!!! namespaceRegex = new Regex(@"namespace (?<namespace>[a-zA-Z0-9.-[{]]*)"); } string result = String.Empty; const string resultFormat = "{0}.{1}"; Match namespaceMatch = namespaceRegex.Match(source); Match classMatch = classRegex.Match(source); if(classMatch.Success && namespaceMatch.Success) result = string.Format(resultFormat, namespaceMatch.Result(namespaceReplacement), classMatch.Result(classReplacement)); return result; }
/// <summary> /// Builds the view template. /// </summary> /// <param name="tableName">Name of the table.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static TurboTemplate BuildViewTemplate(string tableName, ICodeLanguage language, DataProvider provider) { DataService.LoadProviders(); if(ShouldGenerate(tableName, provider.Name)) { List<Replacement> list = new List<Replacement> { new Replacement(ReplacementVariable.View, tableName), new Replacement(ReplacementVariable.Provider, provider.Name) }; return PrepareTemplate(String.Concat("View - ", provider.Name, ": ", tableName), TemplateType.ReadOnly, list, language, provider); } Utility.WriteTrace(String.Format("View {0} is excluded from generation", tableName)); return null; }
/// <summary> /// Generates the views. /// </summary> private static void GenerateViews() { SetProvider(); language = CodeLanguageFactory.GetByShortName(GetArg("lang")); //loop the providers, and if there's more than one, output to their own folder //for tidiness foreach(DataProvider provider in DataService.Providers) { //get the view list string[] views = DataService.GetViewNames(provider.Name); string baseDir = GetOutSubDir(provider); foreach(string tbl in views) { if(IsInList(tbl) && !IsExcluded(tbl) && CodeService.ShouldGenerate(tbl, provider.Name)) { TableSchema.Table tableSchema = DataService.GetSchema(tbl, provider.Name, TableType.View); string className = tableSchema.ClassName; TurboTemplate tt = CodeService.BuildViewTemplate(tbl, language, provider); string additionalPath = GetAdditionalPath(tableSchema, GenerationType.Views); string outDir = Path.Combine(baseDir, additionalPath); EnsureDirectoryExists(outDir); tt.OutputPath = Path.Combine(outDir, className + language.FileExtension); turboCompiler.AddTemplate(tt); } } } }
private static void GenerateODSControllers() { //if (DataService.Provider == null) SetProvider(); string fileExt = FileExtension.DOT_CS; string lang = _language; if (FileExtension.IsVB(lang)) { language = new VBCodeLanguage(); fileExt = FileExtension.DOT_VB; } if (DataService.Providers.Count == 0) { Console.WriteLine("There's a problem with the providers - none were loaded and no exceptions where thrown."); } else { //loop the providers, and if there's more than one, output to their own folder //for tidiness foreach (DataProvider provider in DataService.Providers) { //get the table list string[] tables = DataService.GetTableNames(provider.Name); string message = "Generating ODS Controllers for " + provider.Name + " (" + tables.Length + " total)"; if (tables.Length > 200) { message += " that's a serious amount of tables to generate. But we can handle it. You just will need to be patient and go get some coffee while we do this thang..."; } else if (tables.Length > 100) { message += " that's a lot of tables. This could take a few minutes..."; } else if (tables.Length > 50) { message += " - moderate amount of tables... this could take 30 seconds or so..."; } Console.WriteLine(message); string outDir = GetOutSubDir(provider); //foreach (string tbl in tables) //{ // if (IsInList(tbl) && !IsExcluded(tbl)) // { // string className = DataService.GetSchema(tbl, provider.Name, TableType.Table).ClassName; // string code = CodeService.RunODS(tbl, provider.Name, language); // if (!String.IsNullOrEmpty(code)) // { // string outPath = Path.Combine(outDir, className + "Controller" + fileExt); // Console.WriteLine("Generating ODS Controller for " + className + " to " + outPath); // SubSonic.Sugar.Files.CreateToFile(outPath, usings + code); // } // } //} foreach (string tbl in tables) { if (IsInList(tbl) && !IsExcluded(tbl) && CodeService.ShouldGenerate(tbl, provider.Name)) { string className = DataService.GetSchema(tbl, provider.Name, TableType.Table).ClassName; TurboTemplate tt = CodeService.BuildODSTemplate(tbl, language, provider); tt.OutputPath = Path.Combine(outDir, className + "Controller" + fileExt); turboCompiler.AddTemplate(tt); } } } Console.WriteLine("Finished"); } }
/// <summary> /// Generates the structs. /// </summary> private static void GenerateStructs() { SetProvider(); language = CodeLanguageFactory.GetByShortName(GetArg("lang")); string outDir = GetOutputDirectory(); if(outDir == String.Empty) outDir = Directory.GetCurrentDirectory(); if(!Directory.Exists(outDir)) Directory.CreateDirectory(outDir); string outPath = Path.Combine(outDir, "AllStructs" + language.FileExtension); Console.WriteLine("Generating Structs to " + outPath); TurboTemplate tt = CodeService.BuildStructsTemplate(language, DataService.Provider); tt.OutputPath = outPath; turboCompiler.AddTemplate(tt); Console.WriteLine("Finished"); }
public static string GetEnumScript(DataProvider provider, TableSchema.Table tbl, bool GenerateEnumDebugText, string[] EnumSettings, string[] EnumSettingsExclude, ICodeLanguage language) { string rtn = ""; bool IsVb = (language.Identifier == "VB.NET"); string commentmarker = (IsVb ? "'" : "//"); if (GenerateEnumDebugText) { rtn += "\r\n\r\n\t\t" + commentmarker + " tbl: " + tbl.Name; } for (int k = 0; k < EnumSettings.Length; k++) { string enumSetting = EnumSettings[k]; string enumSettingExlude = ""; if (EnumSettingsExclude.Length > k) { enumSettingExlude = EnumSettingsExclude[k]; } string[] settings = enumSetting.Split(new char[] { ':' }); string regExFind = ""; if (settings.Length > 0) { regExFind = settings[0].Trim(); } bool matched = regExFind.Length > 0 && Regex.IsMatch(tbl.Name, regExFind, RegexOptions.IgnoreCase); bool excluded = enumSettingExlude.Trim() != "" && Regex.IsMatch(tbl.Name, enumSettingExlude.Trim(), RegexOptions.IgnoreCase); bool found = matched && !excluded; if (GenerateEnumDebugText) { rtn += "\r\n\t\t" + commentmarker + " " + k.ToString() + ": " + (matched ? "" : "not ") + "matched '" + regExFind + "'"; } if (GenerateEnumDebugText) { rtn += "\r\n\t\t" + commentmarker + " " + k.ToString() + ": " + (excluded ? "" : "not ") + "excluded '" + enumSettingExlude.Trim() + "'"; } if (found) { string SqlScript = ""; //if (GenerateEnumDebugText) { SqlScript += "\r\n\t\t// tbl: " + tbl.Name + "\r\n\t\t// match: " + enumSetting; } // Get Enum Details string EnumName = ""; string IdCol = ""; string DescriptionCol = ""; string multiKeyCol = ""; string SqlWhereClause = ""; bool idColIsString = false; bool isMulti = false; bool idColFound = false; bool descColFound = false; bool multiKeyColFound = false; if (settings.Length > 1) { EnumName = settings[1].Trim(); } if (EnumName.StartsWith(MultiMarker, StringComparison.InvariantCultureIgnoreCase)) { isMulti = true; multiKeyCol = EnumName.Substring(MultiMarker.Length); } if (settings.Length > 2) { IdCol = settings[2].Trim(); } if (settings.Length > 3) { DescriptionCol = settings[3].Trim(); } if (settings.Length > 4) { SqlWhereClause = settings[4].Trim(); } // check the cols do actually exist if specified foreach (var col in tbl.Columns) { if (IdCol == "" && col.IsPrimaryKey) { IdCol = col.ColumnName; } if (DescriptionCol == "" && !col.IsPrimaryKey && !col.IsForeignKey && col.DataType == System.Data.DbType.String) { DescriptionCol = col.ColumnName; } if (IdCol == col.ColumnName) { idColFound = true; idColIsString = (col.DataType == System.Data.DbType.String); } if (DescriptionCol == col.ColumnName) { descColFound = true; } if (isMulti && multiKeyCol == col.ColumnName) { multiKeyColFound = true; } } if (EnumName == "") { EnumName = GetEnumName(tbl.ClassName, idColIsString); } // generate the script or a warning message if (!idColFound || !descColFound || (isMulti && !multiKeyColFound)) { SqlScript += "\r\n\t\t" + commentmarker + " " + tbl.Name + ": enumSetting could not be matched to ID" + (isMulti ? ", Key " : "") + " and Description columns. Setting=" + enumSetting + "\r\n"; } else { //pull the tables in a reader int rowCount = 0; List <string> enumValList = new List <string>(); string enumMemberScript = ""; string lastKeyVal = ""; string sql = GetEnumSql(IdCol, DescriptionCol, multiKeyCol, tbl.Name, SqlWhereClause); try { using (IDataReader rdr = provider.GetReader(new QueryCommand(sql))) { while (rdr.Read()) { string enumMemberName = CleanUp(rdr[DescriptionCol].ToString()); if (enumValList.Contains(enumMemberName)) { int uniqueVal = 0; string tempMemberName = enumMemberName; while (enumValList.Contains(tempMemberName)) { tempMemberName = enumMemberName + (++uniqueVal).ToString(); } enumMemberName = tempMemberName; } string enumMemberValue = rdr[IdCol].ToString(); string enumKeyVal = (isMulti ? CleanUp(rdr[multiKeyCol].ToString()) : ""); if (rowCount != 0 && lastKeyVal != enumKeyVal) { // we are doing a multi read, use the key val to generate an enum for each block of key values string tempEnumName = GetEnumName(lastKeyVal, idColIsString); SqlScript += GetEnumHeaderFooter(tbl.Name, tempEnumName, IdCol, DescriptionCol, enumMemberScript, idColIsString, IsVb); enumMemberScript = ""; } if (IsVb) { if (idColIsString) { enumMemberScript += "\t\t\tPublic Const " + enumMemberName + " As String = \"" + enumMemberValue + "\";\r\n"; } else { enumMemberScript += "\t\t\t" + enumMemberName + " = " + enumMemberValue; } } else { if (idColIsString) { enumMemberScript += "\t\t\tpublic const string " + enumMemberName + " = \"" + enumMemberValue + "\";\r\n"; } else { enumMemberScript += (enumMemberScript == "" ? "" : ",\r\n"); enumMemberScript += "\t\t\t" + enumMemberName + " = " + enumMemberValue; } } enumValList.Add(enumMemberName); lastKeyVal = enumKeyVal; rowCount++; } } if (rowCount == 0) { SqlScript += "\r\n\t\t" + commentmarker + " " + tbl.Name + ": enum generation was specfied but the database table had no records\r\n"; } else { string tempEnumName = (isMulti ? GetEnumName(lastKeyVal, idColIsString) : EnumName); SqlScript += GetEnumHeaderFooter(tbl.Name, tempEnumName, IdCol, DescriptionCol, enumMemberScript, idColIsString, IsVb); } } catch (Exception ex) { SqlScript += "\r\n\t\t" + commentmarker + " SQL fetch error in SQL \"" + sql + "\" : " + ex.Message; } } rtn += SqlScript; } } return(rtn); }
/// <summary> /// Generates the ODS controllers. /// </summary> private static void GenerateODSControllers() { SetProvider(); language = CodeLanguageFactory.GetByShortName(GetArg("lang")); if(DataService.Providers.Count == 0) Console.WriteLine("There's a problem with the providers - none were loaded and no exceptions where thrown."); else { //loop the providers, and if there's more than one, output to their own folder //for tidiness foreach(DataProvider provider in DataService.Providers) { if(provider.TableBaseClass == "ActiveRecord") { //get the table list string[] tables = DataService.GetTableNames(provider.Name); string message = "Generating ODS Controllers for " + provider.Name + " (" + tables.Length + " total)"; if(tables.Length > 200) { message += " that's a serious amount of tables to generate. But we can handle it. You just will need to be patient and go get some coffee while we do this thang..."; } else if(tables.Length > 100) message += " that's a lot of tables. This could take a few minutes..."; else if(tables.Length > 50) message += " - moderate amount of tables... this could take 30 seconds or so..."; Console.WriteLine(message); string baseDir = GetOutSubDir(provider); if(!Directory.Exists(baseDir)) Directory.CreateDirectory(baseDir); foreach(string tbl in tables) { if(IsInList(tbl) && !IsExcluded(tbl) && CodeService.ShouldGenerate(tbl, provider.Name)) { TableSchema.Table tableSchema = DataService.GetSchema(tbl, provider.Name, TableType.Table); string className = tableSchema.ClassName; TurboTemplate tt = CodeService.BuildODSTemplate(tbl, language, provider); string additionalPath = GetAdditionalPath(tableSchema, GenerationType.Controllers); string outDir = Path.Combine(baseDir, additionalPath); EnsureDirectoryExists(outDir); if(tt != null) { tt.OutputPath = Path.Combine(outDir, className + "Controller" + language.FileExtension); turboCompiler.AddTemplate(tt); } } } } } Console.WriteLine("Finished"); } }
/// <summary> /// Not currently used, but will be the basis for user defined templates. Please don't remove! /// </summary> /// <param name="templateFile">The template file.</param> /// <param name="values">The values.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static string RunTemplate(string templateFile, NameValueCollection values, ICodeLanguage language, DataProvider provider) { string templatePath = Path.Combine(TemplateDirectory, templateFile); string templateText = Files.GetFileText(templatePath); for (int i = 0; i < values.Count; i++) { templateText = templateText.Replace(values.GetKey(i), values.Get(i)); } TurboTemplate t = new TurboTemplate(templateText, language, provider); return(t.Render()); }
/// <summary> /// Builds the Enum template. /// </summary> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static TurboTemplate BuildEnumTemplate(ICodeLanguage language, DataProvider provider) { DataService.LoadProviders(); List<Replacement> list = new List<Replacement> { new Replacement(ReplacementVariable.Provider, provider.Name) }; return PrepareTemplate("Enums - " + provider.Name, TemplateType.Enum, list, language, provider); }
/// <summary> /// Builds the template. /// </summary> /// <param name="templateType">Type of the template.</param> /// <param name="values">The values.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static TurboTemplate BuildTemplate(TemplateType templateType, NameValueCollection values, ICodeLanguage language, DataProvider provider) { string templateText = GetTemplateText(templateType, language); for (int i = 0; i < values.Count; i++) { templateText = templateText.Replace(values.GetKey(i), values.Get(i)); } TurboTemplate t = new TurboTemplate(templateText, language, provider); return(t); }
/// <summary> /// Builds the template. /// </summary> /// <param name="templateType">Type of the template.</param> /// <param name="values">The values.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static TurboTemplate BuildTemplate(TemplateType templateType, NameValueCollection values, ICodeLanguage language, DataProvider provider) { string templateText = GetTemplateText(templateType, language); for(int i = 0; i < values.Count; i++) templateText = templateText.Replace(values.GetKey(i), values.Get(i)); TurboTemplate t = new TurboTemplate(templateText, language, provider); return t; }
/// <summary> /// Runs the template. /// </summary> /// <param name="templateType">Type of the template.</param> /// <param name="settings">The settings.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static string RunTemplate(TemplateType templateType, IEnumerable <Replacement> settings, ICodeLanguage language, DataProvider provider) { Utility.WriteTrace("Getting Template"); string templateText = GetTemplateText(templateType, language); Utility.WriteTrace("Replacing values in template"); foreach (Replacement var in settings) { string replaceHolder = String.Concat("#", Enum.GetName(typeof(ReplacementVariable), var.Variable).ToUpper(new CultureInfo("en")), "#"); templateText = Utility.FastReplace(templateText, replaceHolder, var.ReplaceWith, StringComparison.InvariantCultureIgnoreCase); } TurboTemplate t = new TurboTemplate(templateText, language, provider); Utility.WriteTrace("Rendering template"); string output = t.Render(); Utility.WriteTrace("Finished :)"); return(output); }
/// <summary> /// Runs the read only. /// </summary> /// <param name="viewName">Name of the view.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static string RunReadOnly(string viewName, ICodeLanguage language, DataProvider provider) { TurboTemplate tt = BuildViewTemplate(viewName, language, provider); return tt.Render(); }
/// <summary> /// Prepares the template. /// </summary> /// <param name="templateName">Name of the template.</param> /// <param name="templateType">Type of the template.</param> /// <param name="settings">The settings.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> private static TurboTemplate PrepareTemplate(string templateName, TemplateType templateType, IEnumerable <Replacement> settings, ICodeLanguage language, DataProvider provider) { Utility.WriteTrace(String.Format("Getting template for {0}", templateName)); string templateText = GetTemplateText(templateType, language); // set the provider and tablename Utility.WriteTrace(String.Format("Preparing template for {0}", templateName)); foreach (Replacement var in settings) { string replaceHolder = String.Concat("#", Enum.GetName(typeof(ReplacementVariable), var.Variable).ToUpper(new CultureInfo("en")), "#"); templateText = Utility.FastReplace(templateText, replaceHolder, var.ReplaceWith, StringComparison.InvariantCultureIgnoreCase); } TurboTemplate t = new TurboTemplate(templateText, language, provider); t.TemplateName = templateName; return(t); }
/// <summary> /// Runs the structs. /// </summary> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static string RunStructs(ICodeLanguage language, DataProvider provider) { TurboTemplate tt = BuildStructsTemplate(language, provider); return tt.Render(); }
/// <summary> /// Runs the read only. /// </summary> /// <param name="viewName">Name of the view.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static string RunReadOnly(string viewName, ICodeLanguage language, DataProvider provider) { TurboTemplate tt = BuildViewTemplate(viewName, language, provider); return(tt.Render()); }
/// <summary> /// Runs the template. /// </summary> /// <param name="templateType">Type of the template.</param> /// <param name="settings">The settings.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static string RunTemplate(TemplateType templateType, IEnumerable<Replacement> settings, ICodeLanguage language, DataProvider provider) { Utility.WriteTrace("Getting Template"); string templateText = GetTemplateText(templateType, language); Utility.WriteTrace("Replacing values in template"); foreach(Replacement var in settings) { string replaceHolder = String.Concat("#", Enum.GetName(typeof(ReplacementVariable), var.Variable).ToUpper(new CultureInfo("en")), "#"); templateText = Utility.FastReplace(templateText, replaceHolder, var.ReplaceWith, StringComparison.InvariantCultureIgnoreCase); } TurboTemplate t = new TurboTemplate(templateText, language, provider); Utility.WriteTrace("Rendering template"); string output = t.Render(); Utility.WriteTrace("Finished :)"); return output; }
/// <summary> /// Runs the class. /// </summary> /// <param name="tableName">Name of the table.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> public static string RunClass(string tableName, ICodeLanguage language, DataProvider provider) { TurboTemplate tt = BuildClassTemplate(tableName, language, provider); return(tt.Render()); }
/// <summary> /// Prepares the template. /// </summary> /// <param name="templateName">Name of the template.</param> /// <param name="templateType">Type of the template.</param> /// <param name="settings">The settings.</param> /// <param name="language">The language.</param> /// <param name="provider">The provider.</param> /// <returns></returns> private static TurboTemplate PrepareTemplate(string templateName, TemplateType templateType, IEnumerable<Replacement> settings, ICodeLanguage language, DataProvider provider) { Utility.WriteTrace(String.Format("Getting template for {0}", templateName)); string templateText = GetTemplateText(templateType, language); //if (templateType== TemplateType.Enum) System.IO.File.AppendAllText(@"C:\temp\enumlog.txt", templateName + "\r\n"); // set the provider and tablename Utility.WriteTrace(String.Format("Preparing template for {0}", templateName)); foreach(Replacement var in settings) { string replaceHolder = String.Concat("#", Enum.GetName(typeof(ReplacementVariable), var.Variable).ToUpper(new CultureInfo("en")), "#"); templateText = Utility.FastReplace(templateText, replaceHolder, var.ReplaceWith, StringComparison.InvariantCultureIgnoreCase); } TurboTemplate t = new TurboTemplate(templateText, language, provider) { TemplateName = templateName }; //if (templateType == TemplateType.Enum) System.IO.File.AppendAllText(@"C:\temp\enumlog.txt", t.TemplateText + "\r\n"); return t; }
public CommandDefinitionContentProvider(IFileSystem fileSystem, ITemplateResolver templateResolver, ITemplateRepository templateRepository, ICodeLanguage codeLanguage) { this.fileSystem = fileSystem; this.templateResolver = templateResolver; this.templateRepository = templateRepository; this.codeLanguage = codeLanguage; }