more whee
[QuestHelper.git] / db_get.lua
blob67e7df540f6be9da1c45aa395ad9f96f27d82691
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
25 DB_how_many_are_used()
26 end
28 local function mark(tab, tomark)
29 for k, v in pairs(tab) do
30 if type(v) == "table" then
31 mark(v, tomark)
32 end
33 end
34 tab.__owner = tomark
35 end
37 function DB_GetItem(group, id)
38 QuestHelper: Assert(group, string.format("%s %s", tostring(group), tostring(id)))
39 QuestHelper: Assert(id, string.format("%s %s", tostring(group), tostring(id)))
40 local ite = DBC_Get(group, id)
41 if ite then return ite end
43 if type(id) == "string" then QuestHelper: Assert(not id:match("__.*")) end
45 --QuestHelper:TextOut(string.format("%s %d", group, id))
47 local ite
48 --print("dbs")
49 for _, db in ipairs(QHDB) do
50 --print(db, db[group], db[group] and db[group][id], type(group), type(id))
51 if db[group] and db[group][id] then
52 if not ite then ite = QuestHelper:CreateTable("db") end
54 local srctab
56 if type(db[group][id]) == "string" then
57 srctab = loadstring("return {" .. QH_LZW_Decompress_Dicts_Arghhacky(db[group][id], db[group].__dictionary) .. "}")()
58 elseif type(db[group][id]) == "table" then
59 srctab = db[group][id]
60 else
61 print(type(db[group][id]))
62 QuestHelper: Assert()
63 end
65 for k, v in pairs(srctab) do
66 QuestHelper: Assert(not ite[k])
67 ite[k] = v
68 end
69 end
70 end
71 --print("dbe", ite)
73 if ite then
74 mark(ite, ite)
76 DBC_Put(group, id, ite)
77 else
78 QuestHelper:TextOut(string.format("Tried to get %s/%s, failed", tostring(group), tostring(id)))
79 end
81 return ite
82 end
84 function DB_ListItems(group)
85 local tab = {}
86 for _, db in ipairs(QHDB) do
87 if db[group] then for k, _ in pairs(db[group]) do
88 if type(k) == "string" and not k:match("__.*") then
89 tab[k] = true
90 end
91 end end
92 end
94 local rv = {}
95 for k, _ in pairs(tab) do
96 table.insert(rv, k)
97 end
99 return rv
102 function DB_how_many_are_used()
103 local count = 0
104 for k, v in pairs(cache) do
105 for k2, v2 in pairs(v) do
106 count = count + 1
109 print(count)