You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

277 lines
7.6 KiB

-- ========================================================================= --
-- SylingTracker --
-- https://www.curseforge.com/wow/addons/sylingtracker --
-- --
-- Repository: --
-- https://github.com/Skamer/SylingTracker --
-- --
-- ========================================================================= --
Syling "SylingTracker.Core.Database" ""
-- ========================================================================= --
namespace "SLT"
-- ========================================================================= --
DeepCopy = Utils.DeepCopy
ShalowCopy = Utils.ShalowCopy
class "Database" (function(_ENV)
CURRENT_TABLE = nil
CURRENT_PARENT_TABLE = nil
CURRENT_LEVEL = 0
CURRENT_TABLE_NAME = nil
CURRENT_DB = nil
__Default__("global")
enum "Type" {
"global",
"char",
"spec"
}
class "Path" (function(_ENV)
-----------------------------------------------------------------------------
-- Methods --
-----------------------------------------------------------------------------
__Arguments__ { Database.Type }
function SetRelativeDB(self, type)
self.relativeDB = type
return self
end
__Arguments__ { Variable.Rest(String + Number )}
function Table(self, ...)
self.path = { ... }
end
-----------------------------------------------------------------------------
-- Properties --
-----------------------------------------------------------------------------
property "relativeDB" { TYPE = Database.Type }
end)
-----------------------------------------------------------------------------
-- Methods --
-----------------------------------------------------------------------------
__Arguments__{ Any, Variable.Optional() }
__Static__() function SetValue(index, value)
CURRENT_TABLE[index] = value
end
__Arguments__ { Any }
__Static__() function GetValue(index)
return CURRENT_TABLE[index]
end
__Static__() function IterateTable()
return pairs(CURRENT_TABLE)
end
__Static__() function Clean()
local function ClearEmptyTables(t)
for k,v in pairs(t) do
if type(v) == "table" then
ClearEmptyTables(v)
if next(v) == nil then
t[k] = nil
end
end
end
end
-- NOTE: Important to use 'SylingTrackerDB' else if doesn't work
ClearEmptyTables(SylingTrackerDB)
end
__Arguments__ { String, String }
__Static__() function RenameAllTables(sourceName, destName)
local function RenameTables(t)
for k,v in pairs(t) do
if k ~= sourceName and type(v) == "table" then
RenameTables(v)
elseif k == sourceName then
local tb = t[k]
t[destName] = tb
t[k] = nil
end
end
end
RenameTables(EskaTrackerDB)
end
__Arguments__ { Variable.Rest(String) }
__Static__() function MoveTable(self, ...)
local copy = DeepCopy(CURRENT_TABLE)
local oldTable = CURRENT_TABLE
local tables = { ... }
local destName = tables[#tables]
tables[#tables] = nil
Database.SelectRoot()
if #tables > 0 then
if Database.SelectTable(true, unpack(tables)) then
Database.SetValue(destName, copy)
wipe(oldTable)
end
end
end
__Arguments__ { String, String }
__Static__() function RenameTable(sourceName, newName)
local table = Database.GetCurrentTable()[sourceName]
if table then
Database.GetCurrentTable()[newName] = DeepCopy(table)
Database.GetCurrentTable()[sourceName] = nil
table = nil
end
end
__Arguments__ { Path }
__Static__() function GetCopyTable(sourcePath)
local sourceDB
if not sourcePath.path then
if sourcePath.relativeDB == "global" then
sourceDB = Database.GetRaw()
elseif sourcePath.relativeDB == "char" then
sourceDB = Database.GetRawChar()
elseif sourcePath.relativeDB == "spec" then
sourceDB = Database.GetRawSpec()
end
else
if sourcePath.relativeDB == "GLOBAL" then
Database.SelectRoot()
elseif sourcePath.relativeDB == "CHAR" then
Database.SelectRootChar()
elseif sourcePath.relativeDB == "SPEC" then
Database.SelectRootSpec()
end
Database.SelectTable(true, unpack(sourcePath.path))
sourceDB = Database.GetCurrentTable()
end
return DeepCopy(sourceDB)
end
__Static__() function DeleteTable()
wipe(CURRENT_TABLE)
Database.SelectRoot()
end
__Arguments__{ Variable.Rest(String) }
__Static__() function SelectTable(...)
return Database.SelectTable(true, ...)
end
__Arguments__ { Boolean, Variable.Rest(String) }
__Static__() function SelectTable(mustCreateTables, ...)
local count = select("#", ...)
if not CURRENT_TABLE then
CURRENT_TABLE = Database.Get()
end
local tb = CURRENT_TABLE
for i = 1, count do
local indexTable = select(i, ...)
if not tb[indexTable] then
if mustCreateTables then
tb[indexTable] = {}
else
return false
end
end
if i > 1 then
CURRENT_PARENT_TABLE = tb
end
tb = tb[indexTable]
CURRENT_LEVEL = CURRENT_LEVEL + 1
CURRENT_TABLE_NAME = indexTable
end
CURRENT_TABLE = tb
return true
end
__Static__() function SelectRoot()
CURRENT_TABLE = Database.Get()
CURRENT_LEVEL = 0
CURRENT_DB = "global"
end
__Static__() function SelectRootChar()
CURRENT_TABLE = Database.GetChar()
CURRENT_LEVEL = 0
CURRENT_DB = "char"
end
__Static__() function SelectRootSpec()
CURRENT_TABLE = Database.GetSpec()
CURRENT_LEVEL = 0
CURRENT_DB = "spec"
end
__Arguments__ { Number }
__Static__() function SetVersion(version)
if Database.Get() then
Database.Get().dbVersion = version
end
end
__Static__() function GetVersion()
if Database.Get() then return Database.Get().dbVersion end
end
__Static__() function Get()
return _DB
end
__Static__() function GetChar()
return _DB.Char
end
__Static__() function GetSpec()
return _DB.Char.Spec
end
__Static__() function GetRaw()
return SylingTrackerDB
end
__Static__() function GetRawChar(self)
local name = GetRealmName() .. "-" .. UnitName("player")
if Database.GetRaw().__ScorpioChars and Database.GetRaw().__ScorpioChars[name] then
return Database.GetRaw().__ScorpioChars[name]
end
end
__Static__() function GetRawSpec(self)
local charDB = Database.GetRawChar()
if not charDB then
return
end
local spec = GetSpecialization()
if charDB.__ScorpioSpecs and charDB.__ScorpioSpecs[spec] then
return charDB.__ScorpioSpecs[spec]
end
end
__Static__() function GetCurrentTable(self)
if CURRENT_TABLE == 0 then
if CURRENT_DB == nil or CURRENT_DB == "global" then
return Database.GetRaw()
elseif CURRENT_DB == "char" then
return Database.GetRawChar()
elseif CURRENT_DB == "spec" then
return Database.GetRawSpec()
end
end
return CURRENT_TABLE
end
end)