using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Threading;
using System.IO;
using Rocky;namespace Rocky.CodeBuilder
{public class DbBuilder : Disposable{#region 字段public event EventHandler DoWork;private BackgroundWorker bgWorker;#endregion#region 属性public event ProgressChangedEventHandler ProgressChanged{add { bgWorker.ProgressChanged += value; }remove { bgWorker.ProgressChanged -= value; }}public event RunWorkerCompletedEventHandler RunWorkerCompleted{add { bgWorker.RunWorkerCompleted += value; }remove { bgWorker.RunWorkerCompleted -= value; }}public DbSchema Schema { get; set; }#endregion#region 方法public DbBuilder(){bgWorker = new BackgroundWorker();bgWorker.WorkerReportsProgress = true;bgWorker.WorkerSupportsCancellation = true;bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);}protected override void DisposeInternal(bool disposing){if (disposing){bgWorker.Dispose();}DoWork = null;bgWorker = null;}void bgWorker_DoWork(object sender, DoWorkEventArgs e){if (this.Schema == null){this.Schema = SystemConfig.Instance.GetDbSchema();if (this.Schema == null){bgWorker.ReportProgress(100, "GetDbSchema error.");return;}}bgWorker.ReportProgress(0, "Working...");var schema = this.Schema.GetSchema();GenerateMode mode = SystemConfig.Instance.Mode;if ((mode & GenerateMode.Entity) == GenerateMode.Entity){AppendEntity(schema);}if ((mode & GenerateMode.DAC) == GenerateMode.DAC){AppendDAC(schema);}//if ((mode & GenerateMode.TableImage) == GenerateMode.TableImage)//{//}bgWorker.ReportProgress(100, "Completed.");}public void RunWorkerAsync(){base.CheckDisposed();if (DoWork != null){DoWork(this, EventArgs.Empty);}if (!bgWorker.IsBusy){bgWorker.RunWorkerAsync();}}public void CancelAsync(){if (bgWorker.IsBusy){bgWorker.CancelAsync();}}#endregion#region Append#region Entityprotected void AppendEntity(DbTableSchema[] schema){string path = SystemConfig.Instance.SavePath + SystemConfig.Instance.FolderName + @"\Entity\";Runtime.CreateDirectory(path);StringBuilder main = new StringBuilder(1600);for (int i = 0; i < schema.Length; i++){DbTableSchema t_schema = schema[i];main.AppendLine("using System;");main.AppendLine("using Rocky.Data;");main.AppendLine();main.AppendLine("namespace " + SystemConfig.Instance.NameSpacePrefix + ".Entity");main.AppendLine("{");main.AppendLine(" [Table(\"" + t_schema.Name + "\"), Serializable]");main.AppendLine(" public class " + t_schema.Name);main.AppendLine(" {");for (int j = 0; j < t_schema.Columns.Length; j++){DbColumnSchema c_schema = t_schema.Columns[j];TypeCode typeCode = Type.GetTypeCode(c_schema.FieldType);string fieldType = c_schema.FieldType.Name;switch (typeCode){case TypeCode.String:case TypeCode.Object:if (c_schema.FieldType == typeof(Guid)){if (c_schema.IsNullable){goto default;}}if (c_schema.IsPrimaryKey){main.AppendLine(" [Column(IsNullable = false, IsPrimaryKey = true)]");}else{main.AppendLine(" [Column(IsNullable = " + c_schema.IsNullable.ToString().ToLower() + ")]");}main.AppendLine(" public " + fieldType + " " + c_schema.Name + " { get; set; }");main.AppendLine();break;case TypeCode.Int32:case TypeCode.Int64:if (c_schema.IsNullable){goto default;}if (c_schema.IsPrimaryKey){main.AppendLine(" [Column(IsDbGenerated = true, IsPrimaryKey = true)]");}else{main.AppendLine(" [Column(IsNullable = false)]");}main.AppendLine(" public " + fieldType + " " + c_schema.Name + " { get; set; }");main.AppendLine();break;default:if (c_schema.IsNullable){fieldType += "?";}main.AppendLine(" [Column(IsNullable = " + c_schema.IsNullable.ToString().ToLower() + ")]");main.AppendLine(" public " + fieldType + " " + c_schema.Name + " { get; set; }");main.AppendLine();break;}}main.AppendLine(" }");main.AppendLine("}");File.WriteAllText(path + t_schema.Name + ".cs", main.ToString());main.Length = 0;bgWorker.ReportProgress((100 * i) / schema.Length, t_schema.Name + "Entity");Thread.Sleep(200);}}#endregion#region Repositoryprotected void AppendDAC(DbTableSchema[] schema){string path = SystemConfig.Instance.SavePath + SystemConfig.Instance.FolderName + @"\DAC\";Runtime.CreateDirectory(path);path += "TableComponents.cs";Runtime.CreateFileFromResource(CoreHelper.Template_TableComponents, path);StringBuilder main = new StringBuilder();for (int i = 0; i < schema.Length; i++){DbTableSchema dt = schema[i];string type = "EntityTable<" + dt.Name + ">";main.AppendLine(" public static readonly " + type + " Db" + dt.Name + " = new " + type + "();");bgWorker.ReportProgress((100 * i) / schema.Length, dt.Name + "DAC");Thread.Sleep(200);}File.WriteAllText(path, File.ReadAllText(path).Replace("_namespace_", SystemConfig.Instance.NameSpacePrefix).Replace("_Class_", main.ToString()));}#endregion#endregion}
}