whee
[QuestHelper.git] / db_get.lua
blob6c972f7056458cca9e5951c55aeb19e3c3275ba7
1 QuestHelper_File["db_get.lua"] = "Development Version"
2 QuestHelper_Loadtime["db_get.lua"] = GetTime()
4 -- yoink
5 --[[
6 local QHDB_temp = QHDB
7 QHDB = nil
8 local QHDB = QHDB_temp]]
9 QuestHelper: Assert(#QHDB == 4)
11 local weak_v = { __mode = 'v' }
13 local cache = {}
15 local function DBC_Get(group, id)
16 if not cache[group] then return end
17 return cache[group][id]
18 end
20 local function DBC_Put(group, id, item)
21 if not cache[group] then cache[group] = setmetatable({}, weak_v) end
22 QuestHelper: Assert(not cache[group][id])
23 cache[group][id] = item
24 end
26 local function mark(tab, tomark)
27 for k, v in pairs(tab) do
28 if type(v) == "table" then
29 mark(v, tomark)
30 end
31 end
32 tab.__owner = tomark
33 end
35 function DB_GetItem(group, id)
36 QuestHelper: Assert(group, string.format("%s %s", tostring(group), tostring(id)))
37 QuestHelper: Assert(id, string.format("%s %s", tostring(group), tostring(id)))
38 local ite = DBC_Get(group, id)
39 if ite then return ite end
41 if type(id) == "string" then QuestHelper: Assert(not id:match("__.*")) end
43 --QuestHelper:TextOut(string.format("%s %d", group, id))
45 local ite
46 --print("dbs")
47 for _, db in ipairs(QHDB) do
48 --print(db, db[group], db[group] and db[group][id], type(group), type(id))
49 if db[group] and db[group][id] then
50 if not ite then ite = QuestHelper:CreateTable("db") end
52 local srctab
54 if type(db[group][id]) == "string" then
55 srctab = loadstring("return {" .. QH_LZW_Decompress_Dicts_Arghhacky(db[group][id], db[group].__dictionary) .. "}")()
56 elseif type(db[group][id]) == "table" then
57 srctab = db[group][id]
58 else
59 print(type(db[group][id]))
60 QuestHelper: Assert()
61 end
63 for k, v in pairs(srctab) do
64 QuestHelper: Assert(not ite[k])
65 ite[k] = v
66 end
67 end
68 end
69 --print("dbe", ite)
71 if ite then
72 mark(ite, ite)
74 DBC_Put(group, id, ite)
75 else
76 QuestHelper:TextOut(string.format("Tried to get %s/%s, failed", tostring(group), tostring(id)))
77 end
79 return ite
80 end
82 function DB_ListItems(group)
83 local tab = {}
84 for _, db in ipairs(QHDB) do
85 if db[group] then for k, _ in pairs(db[group]) do
86 if type(k) == "string" and not k:match("__.*") then
87 tab[k] = true
88 end
89 end end
90 end
92 local rv = {}
93 for k, _ in pairs(tab) do
94 table.insert(rv, k)
95 end
97 return rv
98 end
100 function DB_how_many_are_used()
101 local count = 0
102 for k, v in pairs(cache) do
103 for k2, v2 in pairs(v) do
104 count = count + 1
107 print(count)