1 2 3 4 module hunt.entity.EntityCreateTable; 5 6 import hunt.entity.EntityInfo; 7 import hunt.entity.Constant; 8 9 import hunt.database; 10 import std.digest.md; 11 12 13 14 class EntityCreateTable(T) { 15 private EntityInfo!T _entityInfo; 16 this() { 17 import std.stdio; 18 _entityInfo = new EntityInfo!T(); 19 } 20 21 public string createTable(Dialect dialect, string tablePrefix, ref string[] alertRows) { 22 alertRows ~= getAddForeignKey(tablePrefix); 23 return getCreateTable(dialect, tablePrefix); 24 } 25 26 private string getCreateTable(Dialect dialect, string tablePrefix) { 27 string str; 28 str ~= "CREATE TABLE "~tablePrefix~_entityInfo.getTableName()~" ("; 29 bool first = true; 30 foreach(field ; _entityInfo.getFields()) { 31 if (field.getColumnName() != "" && field.getColumnFieldData()) { 32 ColumnDefinitionInfo info; 33 info.isId = field.getPrimary(); 34 info.name = field.getColumnName(); 35 info.isAuto = field.getAuto(); 36 info.isNullable = field.getNullable(); 37 info.dType = field.getColumnFieldData().valueType; 38 if (first) 39 first = false; 40 else 41 str ~= ", "; 42 str ~= info.name ~ " " ~ dialect.getColumnDefinition(info); 43 } 44 } 45 str ~= ")"; 46 return str; 47 } 48 49 private string[] getAddForeignKey(string tablePrefix) { 50 string[] str; 51 foreach(v; _entityInfo.getFields()) { 52 ForeignKeyData data = v.getForeignKeyData(); 53 if (data) { 54 ubyte[16] hash = md5Of(tablePrefix~data.tableName~data.columnName); 55 string mds = toHexString(hash); 56 string tmp = "ALTER TABLE "~tablePrefix~_entityInfo.getTableName()~" ADD CONSTRAINT FRK"~mds~" FOREIGN KEY ("~data.columnName~") REFERENCES "~tablePrefix~data.tableName~" ("~data.primaryKey~")"; 57 str ~= tmp; 58 } 59 } 60 return str; 61 } 62 63 64 } 65 66 67 68 69 70 71