1+ Database = {}
2+
3+ setmetatable(Database, {
4+ __call = function(cls, ...)
5+ local self = setmetatable({}, cls)
6+ return self
7+ end
8+ })
9+
10+ function Database:ContainsTable(value)
11+ for _, v in ipairs(self.Tables) do
12+ if (v == value) then
13+ return true
14+ end
15+ end
16+
17+ return false
18+ end
19+
20+ function Database:GetTableInformations()
21+ -- taken from TC: https://github.com/TrinityCore/TrinityCore/blob/3.3.5/src/server/database/Database/Field.h#L62
22+ local columnTypeFunctions = {
23+ ["bit"] = function() return ColumnType.Bool end,
24+ ["tinyint"] = function() return ColumnType.Int8 end,
25+ ["tinyint unsigned"] = function() return ColumnType.UInt8 end,
26+ ["enum"] = function() return ColumnType.UInt8 end,
27+ ["smallint"] = function() return ColumnType.Int16 end,
28+ ["smallint unsigned"] = function() return ColumnType.UInt16 end,
29+ ["mediumint"] = function() return ColumnType.Int32 end,
30+ ["mediumint unsigned"] = function() return ColumnType.UInt32 end,
31+ ["int"] = function() return ColumnType.Int32 end,
32+ ["int unsigned"] = function() return ColumnType.UInt32 end,
33+ ["integer"] = function() return ColumnType.Int32 end,
34+ ["integer unsigned"] = function() return ColumnType.UInt32 end,
35+ ["timestamp"] = function() return ColumnType.UInt32 end,
36+ ["bigint"] = function() return ColumnType.Int64 end,
37+ ["bigint unsigned"] = function() return ColumnType.UInt64 end,
38+ ["float"] = function() return ColumnType.Float end,
39+ ["double"] = function() return ColumnType.Double end,
40+ ["dec"] = function() return ColumnType.Double end,
41+ ["decimal"] = function() return ColumnType.Double end,
42+ ["char"] = function() return ColumnType.String end,
43+ ["character"] = function() return ColumnType.String end,
44+ ["varchar"] = function() return ColumnType.String end,
45+ ["tinytext"] = function() return ColumnType.String end,
46+ ["mediumtext"] = function() return ColumnType.String end,
47+ ["text"] = function() return ColumnType.String end,
48+ ["longtext"] = function() return ColumnType.String end,
49+ ["binary"] = function() return ColumnType.String end,
50+ ["varbinary"] = function() return ColumnType.String end,
51+ ["tinyblob"] = function() return ColumnType.String end,
52+ ["mediumblob"] = function() return ColumnType.String end,
53+ ["blob"] = function() return ColumnType.String end,
54+ ["longblob"] = function() return ColumnType.String end,
55+ }
56+ local columnTypeNames = {
57+ ["bit"] = function() return "ColumnType.Bool" end,
58+ ["tinyint"] = function() return "ColumnType.Int8" end,
59+ ["tinyint unsigned"] = function() return "ColumnType.UInt8" end,
60+ ["enum"] = function() return "ColumnType.UInt8" end,
61+ ["smallint"] = function() return "ColumnType.Int16" end,
62+ ["smallint unsigned"] = function() return "ColumnType.UInt16" end,
63+ ["mediumint"] = function() return "ColumnType.Int32" end,
64+ ["mediumint unsigned"] = function() return "ColumnType.UInt32" end,
65+ ["int"] = function() return "ColumnType.Int32" end,
66+ ["int unsigned"] = function() return "ColumnType.UInt32" end,
67+ ["integer"] = function() return "ColumnType.Int32" end,
68+ ["integer unsigned"] = function() return "ColumnType.UInt32" end,
69+ ["timestamp"] = function() return "ColumnType.UInt32" end,
70+ ["bigint"] = function() return "ColumnType.Int64" end,
71+ ["bigint unsigned"] = function() return "ColumnType.UInt64" end,
72+ ["float"] = function() return "ColumnType.Float" end,
73+ ["double"] = function() return "ColumnType.Double" end,
74+ ["dec"] = function() return "ColumnType.Double" end,
75+ ["decimal"] = function() return "ColumnType.Double" end,
76+ ["char"] = function() return "ColumnType.String" end,
77+ ["character"] = function() return "ColumnType.String" end,
78+ ["varchar"] = function() return "ColumnType.String" end,
79+ ["tinytext"] = function() return "ColumnType.String" end,
80+ ["mediumtext"] = function() return "ColumnType.String" end,
81+ ["text"] = function() return "ColumnType.String" end,
82+ ["longtext"] = function() return "ColumnType.String" end,
83+ ["binary"] = function() return "ColumnType.String" end,
84+ ["varbinary"] = function() return "ColumnType.String" end,
85+ ["tinyblob"] = function() return "ColumnType.String" end,
86+ ["mediumblob"] = function() return "ColumnType.String" end,
87+ ["blob"] = function() return "ColumnType.String" end,
88+ ["longblob"] = function() return "ColumnType.String" end,
89+ }
90+
91+ local tableQuery = WorldDBQuery("SHOW TABLES")
92+ if (not tableQuery) then
93+ error("[DbScriptExtensions] Couldn't execute the query \"SHOW TABLES;\". Make sure your MySQL user has the rights to execute it.")
94+ return
95+ end
96+
97+ local tableList = {}
98+ repeat
99+ local tableName = tableQuery:GetString(0)
100+ local className = "Db"..tableName:gsub("^%l", tableName.upper):gsub("_(.)", tableName.upper)
101+ table.insert(tableList, {
102+ tableName = tableName,
103+ className = className
104+ })
105+ until not tableQuery:NextRow()
106+
107+ local file = ""
108+ local foundTables = {}
109+ for i, v in ipairs(tableList) do
110+ local tableName = tableList[i].tableName
111+ local className = tableList[i].className
112+ local query = WorldDBQuery("EXPLAIN "..tableName)
113+ if (query) then
114+ -- If we got a table description, we add the related class name to the found table list
115+ table.insert(foundTables, tableList[i].className)
116+
117+ local columns = {}
118+ repeat
119+ local obj = {}
120+ obj.field = query:GetString(0)
121+ local dataType = query:GetString(1)
122+ dataType = dataType:gsub('%(.-%)', '') -- Cut out field length in brackets
123+ local columnType = columnTypeNames[dataType]
124+ if (columnType == nil) then
125+ error("[DbScriptExtensions] Unreadable column type "..dataType.." found. File generation stopped.")
126+ end
127+ obj.columnType = columnType()
128+ obj.isPrimaryKey = false
129+ local key = query:GetString(3)
130+ if (key == "PRI") then
131+ obj.isPrimaryKey = true
132+ end
133+ obj.defaultValue = columnTypeFunctions[dataType]()(query, 4)
134+ if (type(obj.defaultValue) == "string") then
135+ obj.defaultValue = "\""..obj.defaultValue.."\""
136+ end
137+ table.insert(columns, obj)
138+ until not query:NextRow()
139+
140+ file = file.."function "..className..":Default()\n "
141+ file = file.."self:SetTableName(\""..tableName.."\")\n"
142+ for _, v in ipairs(columns) do
143+ file = file.." self:Add"
144+ if (v.isPrimaryKey) then
145+ file = file.."PrimaryKey"
146+ end
147+ file = file.."Column(\""..v.field.."\", "..tostring(v.defaultValue)..", "..v.columnType..")\n"
148+ end
149+ file = file.."end\n\n"
150+ end
151+ end
152+
153+ local mappingHeader = ""
154+ for i, v in ipairs(foundTables) do
155+ mappingHeader = mappingHeader.."require(\"DbScriptExtensions_Mappings_"..foundTables[i].."\")\n"
156+ end
157+
158+
159+ mappingHeader = mappingHeader.."\nDatabase.Tables = {\n"
160+ for i, v in ipairs(foundTables) do
161+ mappingHeader = mappingHeader.." "..foundTables[i]
162+ if (i ~= #foundTables) then
163+ mappingHeader = mappingHeader..","
164+ end
165+ mappingHeader = mappingHeader.."\n"
166+ end
167+ mappingHeader = mappingHeader.."}\n\n"
168+ file = mappingHeader..file
169+
170+ local mappingFilePath = "lua_scripts\\extensions\\DbScriptExtensions\\Mapping\\DbScriptExtensions_Mappings.ext"
171+ local mappingFile = io.open(mappingFilePath, "w+")
172+ mappingFile:write(file)
173+ mappingFile:close()
174+
175+ local classFileContentTemplate = [[
176+ require("DbScriptExtensions_Queryable")
177+
178+ className = {}
179+ for k, v in pairs(Queryable) do
180+ className[k] = v
181+ end
182+ className.__newindex = Queryable.__newindex
183+ className.__index = Queryable.__index
184+
185+ setmetatable(className, {
186+ __call = function (cls)
187+ local self = setmetatable({}, cls)
188+ self.__type = className
189+ self:Default()
190+ self:RefreshChangeTrackerValues()
191+ return self
192+ end
193+ })]]
194+
195+ for i, v in ipairs(foundTables) do
196+ local classFileContent = string.gsub(classFileContentTemplate, "className", foundTables[i])
197+ local classFilePath = "lua_scripts\\extensions\\DbScriptExtensions\\Mapping\\DbScriptExtensions_Mappings_"..foundTables[i]..".ext"
198+ local classFile = io.open(classFilePath, "w+")
199+ classFile:write(classFileContent)
200+ classFile:close()
201+ end
202+
203+
204+
205+
206+ end
0 commit comments