Skip to content

Commit 195bfb1

Browse files
committed
Added lua extension files and README.md
1 parent 6106b6b commit 195bfb1

File tree

7 files changed

+575
-0
lines changed

7 files changed

+575
-0
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
ColumnType = {}
2+
ColumnType.Bool = ElunaQuery.GetBool
3+
ColumnType.Double = ElunaQuery.GetDouble
4+
ColumnType.Float = ElunaQuery.GetFloat
5+
ColumnType.Int8 = ElunaQuery.GetInt8
6+
ColumnType.Int16 = ElunaQuery.GetInt16
7+
ColumnType.Int32 = ElunaQuery.GetInt32
8+
ColumnType.Int64 = ElunaQuery.GetInt64
9+
ColumnType.String = ElunaQuery.GetString
10+
ColumnType.UInt8 = ElunaQuery.GetUInt8
11+
ColumnType.UInt16 = ElunaQuery.GetUInt16
12+
ColumnType.UInt32 = ElunaQuery.GetUInt32
13+
ColumnType.UInt64 = ElunaQuery.GetUInt64
Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
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

DbScriptExtensions.ext

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
DbScriptExtensions_PrintQueries = false
2+
DbScriptExtensions_GenerateTableFiles = true

DbScriptExtensions_Main.ext

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
require("DbScriptExtensions_Database")
2+
3+
-- Generate table classes if needed
4+
if (DbScriptExtensions_GenerateTableFiles) then
5+
print("[DbScriptExtensions] Generating table classes..")
6+
Database:GetTableInformations(DbScriptExtensions_Tables)
7+
print("[DbScriptExtensions] Table classes generated")
8+
print("[DbScriptExtensions] It might be possible that an error occures when accessing a table class. Set DbScriptExtensions_GenerateTableFiles = false (in DbScriptExtensions.ext) and restart the world server. If the problem still occures, please report an issue on GitHub.")
9+
require("DbScriptExtensions_Mappings") -- Make sure to load the mappings before loading lua scripts to prevent errors after generating mapping files
10+
end
11+

Mapping/.gitkeep

Whitespace-only changes.

0 commit comments

Comments
 (0)