Differences From
Artifact [826b7b2edb]:
45 45 for j=0, lst.ct do all:push(lst.ptr[j]) end
46 46 lst:free()
47 47 end
48 48 end
49 49 return all
50 50 end
51 51
52 -terra srv:timeline_instance_fetch(r: lib.store.range): lib.mem.vec(lib.mem.ptr(lib.store.post))
53 - var all: lib.mem.vec(lib.mem.ptr(lib.store.post)) all:init(64)
54 - for i=0,self.sources.ct do var src = self.sources.ptr + i
55 - if src.handle ~= nil and src.backend.timeline_instance_fetch ~= nil then
56 - var lst = src:timeline_instance_fetch(r)
57 - all:assure(all.sz + lst.ct)
58 - for j=0, lst.ct do all:push(lst.ptr[j]) end
59 - lst:free()
52 +local function deftlfetch(fnname, ...)
53 + local args = {}
54 + for i,ty in ipairs{...} do args[#args + 1] = symbol(ty) end
55 + args[#args + 1] = symbol(lib.store.range)
56 + fnname = 'timeline_' .. fnname
57 + srv.methods[fnname] = terra(self: &srv, [args]): lib.mem.vec(lib.mem.ptr(lib.store.post))
58 + var all: lib.mem.vec(lib.mem.ptr(lib.store.post)) all:init(64)
59 + for i=0,self.sources.ct do var src = self.sources.ptr + i
60 + if src.handle ~= nil and src.backend.[fnname] ~= nil then
61 + var lst = src:[fnname]([args])
62 + all:assure(all.sz + lst.ct)
63 + for j=0, lst.ct do all:push(lst.ptr[j]) end
64 + lst:free()
65 + end
60 66 end
67 + return all
61 68 end
62 - return all
63 69 end
64 70
71 +deftlfetch('instance_fetch')
72 +deftlfetch('actor_fetch_uid', uint64)
73 +
65 74 srv.metamethods.__methodmissing = macro(function(meth, self, ...)
66 75 local primary, ptr, stat, simple, oid = 0,1,2,3,4
67 76 local tk, rt = primary
68 77 local expr = {...}
69 78 for _,f in pairs(lib.store.backend.entries) do
70 79 local fn = f.field or f[1]
71 80 local ft = f.type or f[2]
................................................................................
168 177 mgr: &lib.net.mg_mgr
169 178 peer: lib.net.mg_addr
170 179 }
171 180 terra getpeer(con: &lib.net.mg_connection)
172 181 return [&strucheader](con).peer
173 182 end
174 183 end
184 +
185 +terra convo:uid2actor_live(uid: uint64)
186 + var actor = self.srv:actor_fetch_uid(uid)
187 + if actor:ref() then
188 + if self.aid ~= 0 and self.who.id ~= uid then
189 + actor(0).relationship = self.srv:actor_rel_calc(self.who.id, uid)
190 + else -- defensive branch
191 + actor(0).relationship = lib.store.relationship {
192 + agent = 0, patient = uid;
193 + rel = [lib.store.relation.null],
194 + recip = [lib.store.relation.null],
195 + }
196 + end
197 + end
198 + return actor
199 +end
200 +
201 +terra convo:uid2actor(uid: uint64)
202 + var actor: &lib.store.actor = nil
203 + for j = 0, self.actorcache.top do
204 + if uid == self.actorcache(j).ptr.id then
205 + actor = self.actorcache(j).ptr
206 + break
207 + end
208 + end
209 + if actor == nil then
210 + actor = self.actorcache:insert(self:uid2actor_live(uid)).ptr
211 + end
212 + return actor
213 +end
175 214
176 215 terra convo:rawpage(code: uint16, pg: convo.page, hdrs: lib.mem.ptr(lib.http.header))
177 216 var doc = data.view.docskel {
178 217 instance = self.srv.cfg.instance;
179 218 title = pg.title;
180 219 body = pg.body;
181 220 class = pg.class;