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