1 QuestHelper_File
["db_get.lua"] = "Development Version"
2 QuestHelper_Loadtime
["db_get.lua"] = GetTime()
4 local dev_mode
= (QuestHelper_File
["db_get.lua"] == "Development Version")
10 local QHDB = QHDB_temp]]
11 QuestHelper
: Assert(dev_mode
or #QHDB
== 4)
13 local weak_v
= { __mode
= 'v' }
14 local weak_k
= { __mode
= 'k' }
18 local frequencies
= setmetatable({}, weak_k
)
20 -- guhhh just want this to work
21 local freq_group
= setmetatable({}, weak_k
)
22 local freq_id
= setmetatable({}, weak_k
)
24 local function DBC_Get(group
, id
)
25 if not cache
[group
] then return end
26 return cache
[group
][id
]
29 local function DBC_Put(group
, id
, item
)
30 if not cache
[group
] then cache
[group
] = setmetatable({}, weak_v
) end
31 QuestHelper
: Assert(not cache
[group
][id
])
32 cache
[group
][id
] = item
34 --DB_how_many_are_used()
37 local function mark(tab
, tomark
)
38 for k
, v
in pairs(tab
) do
39 if k
~= "__owner" and type(v
) == "table" then
46 local function read_adaptint(data
, offset
)
50 local v
= strbyte(data
, offset
)
51 QuestHelper
: Assert(v
, string.format("%d %d", #data
, offset
))
52 stx
= stx
+ acu
* math
.floor(v
/ 2)
55 if mod(v
, 2) == 0 then break end
60 local function search_index(index
, data
, item
)
63 Itemid (0 for endnode)
69 assert(index
and type(index
) == "string")
70 assert(data
and type(data
) == "string")
73 local idx
, ofs
, len
, rlink
74 idx
, cofs
= read_adaptint(index
, cofs
)
75 if idx
== 0 then return end
76 ofs
, cofs
= read_adaptint(index
, cofs
)
77 len
, cofs
= read_adaptint(index
, cofs
)
78 rlink
, cofs
= read_adaptint(index
, cofs
)
81 return strsub(data
, ofs
, ofs
+ len
)
84 if idx
< item
then cofs
= cofs
+ rlink
end
90 QuestHelper
: Assert(not initted
)
91 for _
, db
in ipairs(QHDB
) do
92 for _
, v
in pairs(db
) do
93 --print("db", not not v.__dictionary, not not v.__tokens)
94 if v
.__dictionary
and v
.__tokens
then
95 local redictix
= v
.__dictionary
96 if not redictix
:find("\"") then redictix
= redictix
.. "\"" end
97 if not redictix
:find(",") then redictix
= redictix
.. "," end
98 if not redictix
:find("\\") then redictix
= redictix
.. "\\" end
99 local tokens
= loadstring("return {" .. QH_LZW_Decompress_Dicts_Arghhacky(v
.__tokens
, redictix
) .. "}")()
100 QuestHelper
: Assert(tokens
)
102 local _
, _
, prep
= QH_LZW_Prepare_Arghhacky(v
.__dictionary
, tokens
)
103 QuestHelper
: Assert(prep
)
105 QuestHelper
: Assert(type(prep
) == "table")
112 QH_UpdateQuests() -- just in case it's been waiting on us (it has almost certainly been waiting on us)
119 function DB_HasItem(group
, id
)
120 QuestHelper
: Assert(initted
)
122 for _
, db
in ipairs(QHDB
) do
124 if db
[group
][id
] then
128 if type(id
) == "number" and id
> 0 and db
[group
].__serialize_index
and db
[group
].__serialize_data
and search_index(db
[group
].__serialize_index
, db
[group
].__serialize_data
, id
) then
137 function DB_GetItem(group
, id
, silent
, register
)
138 QuestHelper
: Assert(initted
)
140 QuestHelper
: Assert(group
, string.format("%s %s", tostring(group
), tostring(id
)))
141 QuestHelper
: Assert(id
, string.format("%s %s", tostring(group
), tostring(id
)))
142 local ite
= DBC_Get(group
, id
)
145 if type(id
) == "string" then QuestHelper
: Assert(not id
:match("__.*")) end
147 --QuestHelper:TextOut(string.format("%s %d", group, id))
149 for _
, db
in ipairs(QHDB
) do
150 --print(db, db[group], db[group] and db[group][id], type(group), type(id))
153 if db
[group
][id
] then
157 --print(not dat, type(id), id, not not db[group].__serialize_index, not not db[group].__serialize_index)
158 if not dat
and type(id
) == "number" and id
> 0 and db
[group
].__serialize_index
and db
[group
].__serialize_data
then
159 dat
= search_index(db
[group
].__serialize_index
, db
[group
].__serialize_data
, id
)
163 if not ite
then ite
= QuestHelper
:CreateTable("db") end
167 if type(dat
) == "string" then
168 QuestHelper
: Assert(db
[group
].__tokens
== nil or type(db
[group
].__tokens
) == "table")
169 srctab
= loadstring("return {" .. (db
[group
].__prefix
or "") .. QH_LZW_Decompress_Dicts_Prepared_Arghhacky(dat
, db
[group
].__dictionary
, nil, db
[group
].__tokens
) .. (db
[group
].__suffix
or "") .. "}")()
170 elseif type(dat
) == "table" then
173 QuestHelper
: Assert()
176 for k
, v
in pairs(srctab
) do
177 QuestHelper
: Assert(not ite
[k
] or k
== "used")
185 --print("marking", group, id, silent, register)
187 --print("done marking")
189 DBC_Put(group
, id
, ite
)
191 freq_group
[ite
] = group
195 QuestHelper
:TextOut(string.format("Tried to get %s/%s, failed", tostring(group
), tostring(id
)))
201 frequencies
[ite
] = (frequencies
[ite
] or 0) + (register
and 1 or 1000000000) -- effectively infinity
207 local function incinerate(ite
, crunchy
)
208 if dev_mode
then return end -- wellllp
210 if not crunchy
[ite
] then
213 for k
, v
in pairs(ite
) do
214 if type(k
) == "table" then incinerate(k
, crunchy
) end
215 if type(v
) == "table" then incinerate(v
, crunchy
) end
220 function DB_ReleaseItem(ite
)
221 QuestHelper
: Assert(ite
)
222 frequencies
[ite
] = frequencies
[ite
] - 1
224 if frequencies
[ite
] == 0 then
225 --print("incinerating", freq_group[ite], freq_id[ite])
226 cache
[freq_group
[ite]]
[freq_id
[ite]]
= nil
227 freq_group
[ite
] = nil
230 local incin
= QuestHelper
:CreateTable("incinerate")
231 incinerate(ite
, incin
)
232 for k
, _
in pairs(incin
) do
233 QuestHelper
:ReleaseTable(k
)
234 end -- burn baby burn
235 QuestHelper
:ReleaseTable(incin
)
239 function DB_ListItems(group
)
241 for _
, db
in ipairs(QHDB
) do
243 QuestHelper
: Assert(not db
.__serialize_index
and not db
.__serialize_data
)
244 for k
, _
in pairs(db
[group
]) do
245 if type(k
) ~= "string" or not k
:match("__.*") then
253 for k
, _
in pairs(tab
) do
260 function DB_how_many_are_used()
262 for k
, v
in pairs(cache
) do
263 for k2
, v2
in pairs(v
) do
270 function DB_DumpItems()
272 for k
, v
in pairs(freq_group
) do
273 dt
[string.format("%s/%s", freq_group
[k
], tostring(freq_id
[k
]))] = true