Esempio n. 1
0
        /// <summary>
        /// Performs final merging of old and new class, then triggers template engine to generate the code.
        /// </summary>
        /// <returns>Result to check for errors.</returns>
        public CodeGeneratorResult GenerateCode()
        {
            if (!config.IgnoreExistingCode)
            {
                if (existingClass != null && !existingClass.IsEmpty())
                {
                    string msg = string.Format("Animator state or parameter is no longer valid{0}. Refactor your code to not contain any references.", (config.KeepObsoleteMembers ? "" : " and will be removed in the next code generation"));
                    existingClass.AddAttributeToAllMembers(new ObsoleteAttributeCodeElement(msg, false));
                    List <MemberCodeElement> allMembers = newClass.GetAllMembers();
                    newClass.MergeMethods(existingClass, (element) => !allMembers.Contains(element));
                    newClass.MergeProperties(existingClass, (element) => !allMembers.Contains(element));
                    newClass.MergeFields(existingClass, (element) => !allMembers.Contains(element));
                }
            }
            FileCodeElement fileElement = new FileCodeElement(newClass);

            fileElement.Usings.Add(new UsingCodeElement("UnityEngine"));
            CodeGeneratorResult result = templateEngine.GenerateCode(fileElement);

            if (result.Success)
            {
                code = templateEngine.Code;
            }
            return(result);
        }
        public async Task <ActionResult> Index(CodeGeneratorResult codeGeneratorResult, string btnAction = "")
        {
            if (!String.IsNullOrEmpty(codeGeneratorResult.ConnectionString.ToStr().Trim()) ||
                !String.IsNullOrEmpty(codeGeneratorResult.MySqlConnectionString.ToStr().Trim()))
            {
                if (String.IsNullOrEmpty(codeGeneratorResult.SelectedTable.ToStr().Trim()))
                {
                    ModelState.AddModelError("SelectedTable", "Selected Table is required.");
                    return(View(codeGeneratorResult));
                }
                else if (String.IsNullOrEmpty(codeGeneratorResult.ModifiedTableName.ToStr().Trim()))
                {
                    ModelState.AddModelError("ModifiedTableName", "Entity Name is required.");
                    return(View(codeGeneratorResult));
                }
            }
            else if (String.IsNullOrEmpty(codeGeneratorResult.SqlCreateTableStatement.ToStr().Trim()))
            {
                ModelState.AddModelError("SqlCreateTableStatement", "Sql Create Table Statement is required.");
                return(View(codeGeneratorResult));
            }

            if (btnAction.Equals("Generate Code", StringComparison.InvariantCultureIgnoreCase))
            {
                await TableService.GenerateCode(codeGeneratorResult);
            }
            else if (btnAction.Equals("Fill GridView", StringComparison.InvariantCultureIgnoreCase))
            {
                await TableService.FillGridView(codeGeneratorResult);
            }
            //Logger.Trace("XmlParserHelper.ToXml codeGeneratorResult " + XmlParserHelper.ToXml(codeGeneratorResult));
            return(View(codeGeneratorResult));
        }
Esempio n. 3
0
        /// <summary>
        /// Checks all preconditions and builds both class code elements.
        /// </summary>
        /// <returns>Result to check if there were errors or user input is required.</returns>
        /// <param name="suppressLoggingOfChanges">If set to <c>true</c> changes will not be printed to console.</param>
        public CodeGeneratorResult PrepareCodeGeneration(bool suppressLoggingOfChanges)
        {
            CodeGeneratorResult result = BuildClasses();

            if (result.Error)
            {
                return(result);
            }
            if (!existingClass.IsEmpty() && !config.IgnoreExistingCode)
            {
                int remaining = CodeElementUtils.CleanupExistingClass(existingClass, newClass, config.KeepObsoleteMembers);
                if (remaining > 0 && !suppressLoggingOfChanges)
                {
                    string consoleMessage = "";
                    List <MemberCodeElement> previousMembers = existingClass.GetAllMembers();
                    int previousMembersCount = previousMembers.Count;
                    for (int i = 0; i < previousMembersCount; i++)
                    {
                        consoleMessage += previousMembers [i].GetSignature() + "\n";
                    }
                    Logger.Info("Members found in previous version that will be marked as obsolete: " + consoleMessage);
                }
            }
            return(result);
        }
        private async Task <DatabaseMetadata> GetDatabaseMetaDataAsync(CodeGeneratorResult codeGeneratorResult, DatabaseMetadata databaseMetaData)
        {
            var t = Task <DatabaseMetadata> .Factory.StartNew(() =>
            {
                if (!String.IsNullOrEmpty(codeGeneratorResult.ConnectionString))
                {
                    databaseMetaData = this.GetAllTablesFromCache(codeGeneratorResult.ConnectionString);
                    TableRepository.GetSelectedTableMetaData(databaseMetaData, codeGeneratorResult.SelectedTable);
                }
                else if (!String.IsNullOrEmpty(codeGeneratorResult.MySqlConnectionString))
                {
                    databaseMetaData = this.GetAllMySqlTables(codeGeneratorResult.MySqlConnectionString);
                    TableRepository.GetSelectedMysqlTableMetaData(databaseMetaData, codeGeneratorResult.SelectedTable);
                }
                else if (!String.IsNullOrEmpty(codeGeneratorResult.SqlCreateTableStatement))
                {
                    databaseMetaData = SqlParserHelper.ParseSqlCreateStatement(codeGeneratorResult.SqlCreateTableStatement);
                }

                return(databaseMetaData);
            });

            await t;

            return(t.Result);
        }
Esempio n. 5
0
        /// <summary>
        /// Updates the AnimatorAccess component of the specified game object.
        /// </summary>
        /// <param name="go">Go.</param>
        public void Update(GameObject go)
        {
            string file = GetTargetFile(go);

            if (string.IsNullOrEmpty(file))
            {
                return;
            }
            ClassElementsBuilder a = new ClassElementsBuilder(go);
            CodeGeneratorResult  r = a.PrepareCodeGeneration(true);

            if (!r.Error)
            {
                r = a.GenerateCode();
                if (r.Success)
                {
                    BackupAndSave(a.Code, file);
                    EditorStatusObserver.CheckForAutoRefresh();
                }
            }
            else
            {
                Logger.Warning(r);
                EditorUtility.DisplayDialog(r.ErrorTitle, r.ErrorText, "OK");
            }
        }
Esempio n. 6
0
        /// <summary>
        /// Builds the new and the existing classes' ClassCodeElements, evaluates all changes and returns a list of them.
        /// </summary>
        /// <param name="go">Go.</param>
        public List <ClassMemberCompareElement> Compare(GameObject go)
        {
            CodeGeneratorResult result = BuildClasses();

            if (result.Success)
            {
                if (!existingClass.IsEmpty())
                {
                    List <ClassMemberCompareElement> comparisonResult = CodeElementUtils.CompareClasses(existingClass, newClass,
                                                                                                        config.IgnoreExistingCode, config.KeepObsoleteMembers);
                    // only Get, Set and Is methods of the existing class are analysed by reflection so remove all
                    // other methods that are provided by default
                    comparisonResult.RemoveAll((element) => element.Member == "Awake" || element.Member == "InitialiseEventManager");
                    if (builder.allTransitionsHash != existingAllTransitionsHash)
                    {
                        comparisonResult.Add(new ClassMemberCompareElement(ClassMemberCompareElement.Result.New,
                                                                           "", "Transition definition changes", "", "Transition changes", ""));
                    }

                    string message = "";
                    comparisonResult.ForEach((s) => message += s + "\n");
                    Logger.Debug("Comparison between new and existing class reveals " + comparisonResult.Count + " changes: " + message);
                    return(comparisonResult);
                }
            }
            return(new List <ClassMemberCompareElement> ());
        }
        public ActionResult Index()
        {
            var codeGeneratorResult = new CodeGeneratorResult();

            codeGeneratorResult.DatabaseMetadata = null;
            codeGeneratorResult.UserMessage      = "Hi, dude, Generate the code of selected table \"Controller, Service, Repository and the SQL\" :)";
            codeGeneratorResult.UserMessageState = UserMessageState.Welcome;
            return(View(codeGeneratorResult));
        }
Esempio n. 8
0
 public AfterAttemptEvent(CodeGeneratorResult result)
 {
     Result = new CodeGeneratorResult
     {
         Reason  = result.Reason,
         Retries = result.Retries,
         Value   = result.Value,
         Success = result.Success
     };
 }
Esempio n. 9
0
        public CodeGeneratorResult GetPathToTemplate(string className)
        {
            CodeGeneratorResult result = new CodeGeneratorResult();

            templateDir = Preferences.GetString(Preferences.Key.TemplateDir);
            if (string.IsNullOrEmpty(templateDir) || !Directory.Exists(templateDir))
            {
                result = SearchTemplateDirectory(result);
                if (result.NoSuccess)
                {
                    return(result);
                }
            }
            else
            {
                string classSpecificTemplate = Path.Combine(templateDir, className + ".txt");
                if (File.Exists(classSpecificTemplate))
                {
                    TemplateConfig.TemplatePath = classSpecificTemplate;
                    return(result);
                }
                else
                {
                    string defaultTemplate = Path.Combine(templateDir, config.GetDefaultTemplateFileName());
                    if (File.Exists(defaultTemplate))
                    {
                        TemplateConfig.TemplatePath = defaultTemplate;
                        return(result);
                    }
                    else
                    {
                        result = SearchTemplateDirectory(result);
                        if (result.NoSuccess)
                        {
                            return(result);
                        }
                    }
                }
            }
            string defaultTemplate2 = Path.Combine(templateDir, config.GetDefaultTemplateFileName());

            if (!File.Exists(defaultTemplate2))
            {
                return(result.SetError("Default Template Not Found", "The default template file " + config.GetDefaultTemplateFileName() + " could not be found. Path: " + defaultTemplate2));
            }
            TemplateConfig.TemplatePath = defaultTemplate2;
            return(result);
        }
Esempio n. 10
0
        /// <summary>
        /// Create a new AnimatorAccess component for the specified game object and saves it to targetCodeFile. The
        /// caller is responsible for ensuring that there is not yet a component existing with the same name.
        /// </summary>
        /// <param name="go">Go.</param>
        /// <param name="targetCodeFile">Target code file.</param>
        public void Create(GameObject go, string targetCodeFile)
        {
            ClassElementsBuilder gen    = new ClassElementsBuilder(go, targetCodeFile);
            CodeGeneratorResult  result = gen.PrepareCodeGeneration(false);

            if (result.Error)
            {
                EditorUtility.DisplayDialog(result.ErrorTitle, result.ErrorText, "OK");
                return;
            }
            result = gen.GenerateCode();
            if (result.Success)
            {
                BackupAndSave(gen.Code, targetCodeFile);
                EditorStatusObserver.RegisterForPostProcessing(gen.FullClassName);
            }
        }
Esempio n. 11
0
        public void TestAnimatorAccessGenerator(GameObject go)
        {
            ClassElementsBuilder a = new ClassElementsBuilder(go);
            CodeGeneratorResult  r = a.PrepareCodeGeneration(true);

            if (!r.Error)
            {
                r = a.GenerateCode();
                if (r.Success)
                {
                    WriteToFile(a.Code, "/Users/kay/tmp/TimeMachine.ignore/Trash/New.cs");
                }
            }
            else
            {
                Logger.Warning(r);
            }
        }
Esempio n. 12
0
        CodeGeneratorResult SearchTemplateDirectory(CodeGeneratorResult result)
        {
            templateDir = "";
            TemplateConfig.TemplatePath = "";
            string searchRoot = Path.Combine(Application.dataPath, Manager.SharedInstance.InstallDir);

            Logger.Debug("Searching for default template in " + searchRoot);
            string[] files = Directory.GetFiles(searchRoot, config.GetDefaultTemplateFileName(), SearchOption.AllDirectories);
            if (files.Length == 0)
            {
                // fallback, scan all directories under Assets folder
                files = Directory.GetFiles(Application.dataPath, config.GetDefaultTemplateFileName(), SearchOption.AllDirectories);
            }
            if (files.Length == 0)
            {
                return(result.SetError("Template Directory Not Found", "The default template " + config.GetDefaultTemplateFileName() + "could not be found anywhere under your Assets directory."));
            }
            else if (files.Length > 1)
            {
                string rootDir = Path.Combine(Manager.SharedInstance.InstallDir, config.PathToTemplateDirectory);
                Logger.Debug("More than one default template found. Searching the best match i.e. path contains [" + rootDir + "] ");
                foreach (string item in files)
                {
                    if (item.Contains(rootDir))
                    {
                        TemplateConfig.TemplatePath = item;
                        break;
                    }
                }
                if (string.IsNullOrEmpty(TemplateConfig.TemplatePath))
                {
                    TemplateConfig.TemplatePath = files [0];
                    Logger.Info("More than one default template found but non of them matching the path " + rootDir);
                }
            }
            else
            {
                TemplateConfig.TemplatePath = files [0];
            }
            templateDir = Path.GetDirectoryName(TemplateConfig.TemplatePath);
            Logger.Info("Template directory found, using " + templateDir);
            Preferences.SetString(Preferences.Key.TemplateDir, templateDir);
            return(result);
        }
Esempio n. 13
0
        public async Task GenerateCode(CodeGeneratorResult codeGeneratorResult)
        {
            DatabaseMetadata databaseMetaData = new DatabaseMetadata();

            databaseMetaData = await GetDatabaseMetaDataAsync(codeGeneratorResult, databaseMetaData);

            CodeProducerHelper.CodeGeneratorResult = codeGeneratorResult;
            CodeProducerHelper.DatabaseMetadata    = databaseMetaData;


            var tasks = new List <Task>();

            // Database related code.
            if (databaseMetaData.DatabaseType == DatabaseType.MsSql || databaseMetaData.DatabaseType == DatabaseType.UnKnown)
            {
                tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateSaveOrUpdateStoredProcedure(); }));
                tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateSqlRepository(); }));
                tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateStoredProcExecutionCode(); }));
            }
            else if (databaseMetaData.DatabaseType == DatabaseType.MySql)
            {
                tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateMySqlSaveOrUpdateStoredProcedure(); }));
                tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenereateMySqlRepository(); }));
            }

            // c# code for both database.
            tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateWebApiController(); }));
            tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateTableServices(); }));
            tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateTableItem(); }));
            tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateNewInstance(); }));
            tasks.Add(Task.Factory.StartNew(() => { CodeProducerHelper.GenerateAspMvcControllerClass(); }));



            await Task.WhenAll(tasks);

            var tableName = codeGeneratorResult.ModifiedTableName.ToStr(codeGeneratorResult.SelectedTable);

            codeGeneratorResult = CodeProducerHelper.CodeGeneratorResult;
            codeGeneratorResult.DatabaseMetadata = databaseMetaData;
            codeGeneratorResult.UserMessage      = tableName + " table codes are created. You made it dude, Congratulation :)";
            codeGeneratorResult.UserMessageState = UserMessageState.Success;
        }
Esempio n. 14
0
        /// <summary>
        /// Initialises templateEngine and builds newClass and existingClass.
        /// </summary>
        /// <returns>The classes.</returns>
        CodeGeneratorResult BuildClasses()
        {
            TemplateLookup      templateLookup = new TemplateLookup(config);
            CodeGeneratorResult result         = templateLookup.GetPathToTemplate(className);

            if (result.Success)
            {
                result = templateEngine.Prepare(templateLookup.TemplateConfig);
                if (result.NoSuccess)
                {
                    return(result);
                }
                newClass = builder.Build();
                if (newClass.IsEmpty())
                {
                    return(result.SetError("No Input", "The input seems to be invalid. Check that there are any states or parameter to process."));
                }
                Logger.Debug("New: " + newClass);
                if (!existingClassBuilder.HasType())
                {
                    Logger.Info("Generating source for " + className + " the very first time");
                }
                try {
                    existingClassBuilder.MethodBinding = BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public |
                                                         BindingFlags.InvokeMethod | BindingFlags.NonPublic;
                    existingClassBuilder.MethodInfoFilter = (MethodInfo mi) => mi.Name.StartsWith("Is") ||
                                                            mi.Name.StartsWith("Set") || mi.Name.StartsWith("Get") || mi.Name == "IdToName" ||
                                                            mi.Name == "Update" || mi.Name == "FixedUpdate";
                    existingClass = existingClassBuilder.Build();
                    // little bit dirty hack: we don't want special methods like Update to participate in the regular
                    // workflow i.e. mark as obsolete to be regenerated once with code throwing NotImplementedException.
                    // So if settings have changed, mark them as obsolete to force their removal
                    List <GenericMethodCodeElement> updateMethods = existingClass.Methods.FindAll(
                        (GenericMethodCodeElement m) => m.Name == "Update" || m.Name == "FixedUpdate");
                    updateMethods.ForEach((GenericMethodCodeElement m) => m.Obsolete = true);
                } catch (System.Exception ex) {
                    Logger.Warning(ex.Message + "\n" + ex.StackTrace);
                    result.SetError("Error", "Oops. An unexpected error occurred. Details" + ex.Message + "\n" + ex.StackTrace);
                }
            }
            return(result);
        }
Esempio n. 15
0
        public async Task FillGridView(CodeGeneratorResult codeGeneratorResult)
        {
            var task = Task.Factory.StartNew(() =>
            {
                var databaseMetaData = new DatabaseMetadata();
                if (!String.IsNullOrEmpty(codeGeneratorResult.ConnectionString))
                {
                    databaseMetaData = this.GetAllTablesFromCache(codeGeneratorResult.ConnectionString);
                    TableRepository.GetSelectedTableMetaData(databaseMetaData, codeGeneratorResult.SelectedTable);
                }
                else if (!String.IsNullOrEmpty(codeGeneratorResult.MySqlConnectionString))
                {
                    databaseMetaData = this.GetAllMySqlTables(codeGeneratorResult.MySqlConnectionString);
                    TableRepository.GetSelectedMysqlTableMetaData(databaseMetaData, codeGeneratorResult.SelectedTable);
                }
                codeGeneratorResult.DatabaseMetadata = databaseMetaData;
            });

            codeGeneratorResult.UserMessage      = codeGeneratorResult.SelectedTable + " table metadata is populated to GridView. You are so close, Do not give up until you make it, dude :)";
            codeGeneratorResult.UserMessageState = UserMessageState.Success;
            await task;
        }
Esempio n. 16
0
            public ValueTask <CodeGeneratorResult> Transform(CodeGeneratorResult result)
            {
                if (result.Value.Length != 2)
                {
                    return(new ValueTask <CodeGeneratorResult>(new CodeGeneratorResult
                    {
                        Value = null,
                        Reason = FailureReasonType.Transform,
                        Retries = result.Retries,
                        Success = false
                    }));
                }

                var adjective = adjectives[result.Value[0]];
                var name      = names[result.Value[1]];

                return(new ValueTask <CodeGeneratorResult>(new CodeGeneratorResult
                {
                    Value = $"{adjective}_{name}",
                    Reason = result.Reason,
                    Retries = result.Retries,
                    Success = result.Success
                }));
            }
        public void ParseSqlStatement()
        {
            string txt = @"

USE [TestEY]
GO

/****** Object:  Table [dbo].[Products]    Script Date: 4/28/2018 12:53:17 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Products](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[StoreId] [int] NULL,
	[ProductCategoryId] [int] NOT NULL,
	[BrandId] [int] NULL,
	[RetailerId] [int] NULL,
	[ProductCode] [nvarchar](50) NULL,
	[Name] [nvarchar](500) NOT NULL,
	[Description] [nvarchar](max) NULL,
	[Type] [nvarchar](50) NULL,
	[MainPage] [bit] NULL,
	[State] [bit] NULL,
	[Ordering] [int] NULL,
	[CreatedDate] [datetime2](7) NOT NULL,
	[ImageState] [bit] NULL,
	[UpdatedDate] [datetime2](7) NOT NULL,
	[Price] [float] NOT NULL,
	[Discount] [float] NOT NULL,
	[UnitsInStock] [int] NULL,
	[TotalRating] [int] NULL,
	[VideoUrl] [nvarchar](1500) NULL,
 CONSTRAINT [PK_Products_1] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE [dbo].[Products] ADD  CONSTRAINT [DF_Products_CreatedDate]  DEFAULT (getdate()) FOR [CreatedDate]
GO

ALTER TABLE [dbo].[Products] ADD  CONSTRAINT [DF_Products_UpdatedDate]  DEFAULT (getdate()) FOR [UpdatedDate]
GO



";


            String mySql = @"
CREATE TABLE `urunler` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `baslik_tr` varchar(255) DEFAULT NULL,
  `keywords_tr` varchar(255) DEFAULT NULL,
  `katID` varchar(11) DEFAULT '0',
  `ozet_tr` text,
  `detay_tr` text,
  `sira` int(11) DEFAULT '1000',
  `tarih` datetime DEFAULT NULL,
  `durum` tinyint(1) DEFAULT NULL,
  `baslik_en` varchar(255) DEFAULT NULL,
  `keywords_en` varchar(255) DEFAULT NULL,
  `ozet_en` text,
  `detay_en` text,
  `seo` varchar(255) DEFAULT NULL,
  `tip` int(4) DEFAULT '1' COMMENT '1: motor, 2: yelken',
  `link` varchar(255) DEFAULT NULL,
  `vitrin` int(1) DEFAULT '0',
  `image` varchar(255) DEFAULT NULL,
  `youtube` varchar(255) DEFAULT NULL,
  `fiyat` double DEFAULT NULL,
  `tamam` varchar(255) CHARACTER SET utf8 COLLATE utf8_turkish_ci DEFAULT NULL,
  `baslik_de` varchar(255) DEFAULT NULL,
  `keywords_de` varchar(255) DEFAULT NULL,
  `ozet_de` text,
  `detay_de` text,
  `adres_de` text,
  `online` tinyint(1) DEFAULT NULL,
  `ColorID` int(11) DEFAULT NULL,
  `RegionID` int(11) DEFAULT NULL,
  `GrapeID` int(11) DEFAULT NULL,
  `yemek_tercihi_tr` text,
  `haftanin` tinyint(1) DEFAULT NULL,
  `yemek_tercihi_en` text,
  `stok` varchar(255) DEFAULT NULL,
  `yeni` tinyint(1) DEFAULT NULL,
  `yil` varchar(255) DEFAULT NULL,
  `miktar` varchar(255) DEFAULT NULL,
  `eski_fiyat` varchar(255) DEFAULT NULL,
  `alkol_orani` varchar(255) DEFAULT NULL,
  `kdv` varchar(255) DEFAULT NULL,
  `encok` tinyint(1) DEFAULT NULL,
  `harita` text CHARACTER SET utf8 COLLATE utf8_turkish_ci NOT NULL,
  `baslik_ar` varchar(255) DEFAULT NULL,
  `keywords_ar` varchar(255) DEFAULT NULL,
  `ozet_ar` text,
  `detay_ar` text,
  `baslik_ru` varchar(255) DEFAULT NULL,
  `keywords_ru` varchar(255) DEFAULT NULL,
  `ozet_ru` text,
  `detay_ru` text,
  `teknik` text,
  `renk` varchar(255) DEFAULT NULL,
  `kilit` varchar(255) DEFAULT NULL,
  `kaplama` varchar(255) DEFAULT NULL,
  `aksesuar` varchar(255) DEFAULT NULL,
  `aksesuarr` varchar(255) DEFAULT NULL,
  `markaID` int(11) DEFAULT NULL,
  `sektorID` int(11) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

";

            mySql = @"CREATE TABLE Persons (
    PersonID int,
    LastName varchar(255),
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) 
); ";



            // Create new stopwatch.
            Stopwatch stopwatch = new Stopwatch();

            // Begin timing.
            stopwatch.Start();

            var metadata = SqlParserHelper.ParseSqlCreateStatement(txt);

            // Stop timing.
            stopwatch.Stop();

            // Write result.
            Console.WriteLine("Time elapsed: {0}", stopwatch.ElapsedMilliseconds);


            var r = new CodeGeneratorResult();

            r.ModifiedTableName = "NwmProducts";
            CodeProducerHelper CodeProducerHelper = new CodeProducerHelper();

            CodeProducerHelper.DatabaseMetadata    = metadata;
            CodeProducerHelper.CodeGeneratorResult = r;
            CodeProducerHelper.GenerateTableItem();
            CodeProducerHelper.GenerateSaveOrUpdateStoredProcedure();
            Console.WriteLine(r.SqlSaveOrUpdateStoredProc);
        }