cache jonks for AP fetches

This commit is contained in:
Ted Unangst 2019-10-07 15:22:10 -04:00
parent b1e42fdae9
commit 2fc3103ad4
3 changed files with 44 additions and 15 deletions

View File

@ -1101,6 +1101,33 @@ func jonkjonk(user *WhatAbout, h *Honk) (junk.Junk, junk.Junk) {
return j, jo return j, jo
} }
var oldjonks = cacheNew(cacheOptions{Filler: func(xid string) ([]byte, bool) {
row := stmtAnyXonk.QueryRow(xid)
honk := scanhonk(row)
if honk == nil || !honk.Public {
return nil, true
}
user, _ := butwhatabout(honk.Username)
rawhonks := gethonksbyconvoy(honk.UserID, honk.Convoy)
for _, h := range rawhonks {
if h.RID == honk.XID && h.Public && (h.Whofore == 2 || h.IsAcked()) {
honk.Replies = append(honk.Replies, h)
}
}
donksforhonks([]*Honk{honk})
_, j := jonkjonk(user, honk)
j["@context"] = itiswhatitis
var buf bytes.Buffer
j.Write(&buf)
return buf.Bytes(), true
}})
func gimmejonk(xid string) ([]byte, bool) {
var j []byte
ok := oldjonks.Get(xid, &j)
return j, ok
}
func honkworldwide(user *WhatAbout, honk *Honk) { func honkworldwide(user *WhatAbout, honk *Honk) {
jonk, _ := jonkjonk(user, honk) jonk, _ := jonkjonk(user, honk)
jonk["@context"] = itiswhatitis jonk["@context"] = itiswhatitis

View File

@ -509,7 +509,7 @@ func cleanupdb(arg string) {
} }
var stmtHonkers, stmtDubbers, stmtSaveHonker, stmtUpdateFlavor, stmtUpdateHonker *sql.Stmt var stmtHonkers, stmtDubbers, stmtSaveHonker, stmtUpdateFlavor, stmtUpdateHonker *sql.Stmt
var stmtOneXonk, stmtPublicHonks, stmtUserHonks, stmtHonksByCombo, stmtHonksByConvoy *sql.Stmt var stmtAnyXonk, stmtOneXonk, stmtPublicHonks, stmtUserHonks, stmtHonksByCombo, stmtHonksByConvoy *sql.Stmt
var stmtHonksByOntology, stmtHonksForUser, stmtHonksForMe, stmtSaveDub, stmtHonksByXonker *sql.Stmt var stmtHonksByOntology, stmtHonksForUser, stmtHonksForMe, stmtSaveDub, stmtHonksByXonker *sql.Stmt
var stmtHonksBySearch, stmtHonksByHonker, stmtSaveHonk, stmtWhatAbout *sql.Stmt var stmtHonksBySearch, stmtHonksByHonker, stmtSaveHonk, stmtWhatAbout *sql.Stmt
var stmtOneBonk, stmtFindZonk, stmtFindXonk, stmtSaveDonk *sql.Stmt var stmtOneBonk, stmtFindZonk, stmtFindXonk, stmtSaveDonk *sql.Stmt
@ -541,6 +541,7 @@ func prepareStatements(db *sql.DB) {
limit := " order by honks.honkid desc limit 250" limit := " order by honks.honkid desc limit 250"
butnotthose := " and convoy not in (select name from zonkers where userid = ? and wherefore = 'zonvoy' order by zonkerid desc limit 100)" butnotthose := " and convoy not in (select name from zonkers where userid = ? and wherefore = 'zonvoy' order by zonkerid desc limit 100)"
stmtOneXonk = preparetodie(db, selecthonks+"where honks.userid = ? and xid = ?") stmtOneXonk = preparetodie(db, selecthonks+"where honks.userid = ? and xid = ?")
stmtAnyXonk = preparetodie(db, selecthonks+"where xid = ? order by honks.honkid asc")
stmtOneBonk = preparetodie(db, selecthonks+"where honks.userid = ? and xid = ? and what = 'bonk' and whofore = 2") stmtOneBonk = preparetodie(db, selecthonks+"where honks.userid = ? and xid = ? and what = 'bonk' and whofore = 2")
stmtPublicHonks = preparetodie(db, selecthonks+"where whofore = 2 and dt > ?"+limit) stmtPublicHonks = preparetodie(db, selecthonks+"where whofore = 2 and dt > ?"+limit)
stmtUserHonks = preparetodie(db, selecthonks+"where (whofore = 2 or whofore = ?) and username = ? and dt > ?"+limit) stmtUserHonks = preparetodie(db, selecthonks+"where (whofore = 2 or whofore = ?) and username = ? and dt > ?"+limit)

29
web.go
View File

@ -659,8 +659,18 @@ func showhonk(w http.ResponseWriter, r *http.Request) {
http.NotFound(w, r) http.NotFound(w, r)
return return
} }
xid := fmt.Sprintf("https://%s%s", serverName, r.URL.Path) xid := fmt.Sprintf("https://%s%s", serverName, r.URL.Path)
if friendorfoe(r.Header.Get("Accept")) {
j, ok := gimmejonk(xid)
if ok {
w.Header().Set("Content-Type", theonetruename)
w.Write(j)
} else {
http.NotFound(w, r)
}
return
}
honk := getxonk(user.ID, xid) honk := getxonk(user.ID, xid)
if honk == nil { if honk == nil {
http.NotFound(w, r) http.NotFound(w, r)
@ -683,19 +693,6 @@ func showhonk(w http.ResponseWriter, r *http.Request) {
return return
} }
rawhonks := gethonksbyconvoy(honk.UserID, honk.Convoy) rawhonks := gethonksbyconvoy(honk.UserID, honk.Convoy)
if friendorfoe(r.Header.Get("Accept")) {
for _, h := range rawhonks {
if h.RID == honk.XID && h.Public && (h.Whofore == 2 || h.IsAcked()) {
honk.Replies = append(honk.Replies, h)
}
}
donksforhonks([]*Honk{honk})
_, j := jonkjonk(user, honk)
j["@context"] = itiswhatitis
w.Header().Set("Content-Type", theonetruename)
j.Write(w)
return
}
var honks []*Honk var honks []*Honk
for _, h := range rawhonks { for _, h := range rawhonks {
if h.Public && (h.Whofore == 2 || h.IsAcked()) { if h.Public && (h.Whofore == 2 || h.IsAcked()) {
@ -816,6 +813,9 @@ func zonkit(w http.ResponseWriter, r *http.Request) {
userinfo := login.GetUserInfo(r) userinfo := login.GetUserInfo(r)
user, _ := butwhatabout(userinfo.Username) user, _ := butwhatabout(userinfo.Username)
// my hammer is too big, oh well
defer oldjonks.Flush()
if wherefore == "ack" { if wherefore == "ack" {
xonk := getxonk(userinfo.UserID, what) xonk := getxonk(userinfo.UserID, what)
if xonk != nil { if xonk != nil {
@ -1127,6 +1127,7 @@ func submithonk(w http.ResponseWriter, r *http.Request) {
if updatexid != "" { if updatexid != "" {
updatehonk(honk) updatehonk(honk)
oldjonks.Clear(honk.XID)
} else { } else {
err := savehonk(honk) err := savehonk(honk)
if err != nil { if err != nil {