Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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));
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
            }
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
        /// <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());
        }
Пример #8
0
        /// <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());
        }
Пример #9
0
        /// <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;
        }
Пример #10
0
        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;
        }
Пример #11
0
 /// <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();
 }
Пример #12
0
        /// <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();
        }
Пример #13
0
        /// <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);
        }
Пример #14
0
        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");
            }
        }
Пример #15
0
        /// <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);
        }
Пример #16
0
    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;
        }
    }
Пример #17
0
        /// <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;
        }
Пример #18
0
        /// <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");
        }
Пример #19
0
        /// <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);
            }
        }
Пример #20
0
    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;
            }
        }
    }
Пример #21
0
        /// <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);
        }
Пример #22
0
        /// <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);
        }
Пример #23
0
 /// <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);
 }
Пример #24
0
        /// <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;
        }
Пример #25
0
        /// <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;
        }
Пример #26
0
        /// <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);
                    }
                }
            }
        }
Пример #27
0
        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");
            }
        }
Пример #28
0
        /// <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");
        }
Пример #29
0
        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);
        }
Пример #30
0
        /// <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");
            }
        }
Пример #31
0
        /// <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());
        }
Пример #32
0
 /// <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);
 }
Пример #33
0
        /// <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);
        }
Пример #34
0
        /// <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;
        }
Пример #35
0
        /// <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);
        }
Пример #36
0
 /// <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();
 }
Пример #37
0
        /// <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);
        }
Пример #38
0
 /// <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();
 }
Пример #39
0
        /// <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());
        }
Пример #40
0
        /// <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;
        }
Пример #41
0
        /// <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());
        }
Пример #42
0
        /// <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;
 }