diff options
author | Jan C <jan@ruken.pw> | 2016-03-28 12:30:15 (UTC) |
---|---|---|
committer | Jan C <jan@ruken.pw> | 2016-03-28 12:30:15 (UTC) |
commit | e8f2412efe55c969390168e3ce0b41200f780a1e (patch) | |
tree | 41a0e692d0ded0113394712f750b730c4f4fa864 /modules | |
parent | c7f28c0032163075bd21f899c37ae992e3eece80 (diff) |
cache hinzugefuegt. wird derzeit vom lists und grils modul verwendet. versuch die loadingzeit zu verringern (anscheinend wird im hintergrund auf jeder route der index requested, was ziemlich doof ist).
Diffstat (limited to 'modules')
-rw-r--r-- | modules/grils/gril.go | 4 | ||||
-rw-r--r-- | modules/grils/grils.go | 16 | ||||
-rw-r--r-- | modules/lists/lists.go | 44 | ||||
-rw-r--r-- | modules/user/user.go | 14 |
4 files changed, 62 insertions, 16 deletions
diff --git a/modules/grils/gril.go b/modules/grils/gril.go index 7b782b3..f78d31f 100644 --- a/modules/grils/gril.go +++ b/modules/grils/gril.go | |||
@@ -46,12 +46,12 @@ func ImagePath(id int, prioritizeThumbnail bool) string { | |||
46 | // Image Priority | 46 | // Image Priority |
47 | // without prioritizeThumbnail: Anilist > ACD (big) > ACD (thumbnail) | 47 | // without prioritizeThumbnail: Anilist > ACD (big) > ACD (thumbnail) |
48 | // with prioritizeThumbnail: Anilist > ACD (thumbnail) > ACD (big) | 48 | // with prioritizeThumbnail: Anilist > ACD (thumbnail) > ACD (big) |
49 | 49 | ||
50 | anilistPath := fmt.Sprintf("assets/img/gril/%d/%d.jpg", DataSourceAnilist, id) | 50 | anilistPath := fmt.Sprintf("assets/img/gril/%d/%d.jpg", DataSourceAnilist, id) |
51 | if _, err := os.Stat(anilistPath); err == nil { | 51 | if _, err := os.Stat(anilistPath); err == nil { |
52 | return fmt.Sprintf(anilistPath) | 52 | return fmt.Sprintf(anilistPath) |
53 | } | 53 | } |
54 | 54 | ||
55 | var big string | 55 | var big string |
56 | exts := []string{"png", "jpg", "gif", "jpeg"} | 56 | exts := []string{"png", "jpg", "gif", "jpeg"} |
57 | for _, ext := range exts { | 57 | for _, ext := range exts { |
diff --git a/modules/grils/grils.go b/modules/grils/grils.go index fe947bc..791ea5e 100644 --- a/modules/grils/grils.go +++ b/modules/grils/grils.go | |||
@@ -6,16 +6,22 @@ import ( | |||
6 | "net/http" | 6 | "net/http" |
7 | "regexp" | 7 | "regexp" |
8 | "strconv" | 8 | "strconv" |
9 | "time" | ||
9 | "strings" | 10 | "strings" |
10 | "time" | ||
11 | 11 | ||
12 | "fagott.pw/charakterin" | 12 | "fagott.pw/charakterin" |
13 | "fagott.pw/grilist/frontend" | 13 | "fagott.pw/grilist/frontend" |
14 | "fagott.pw/grilist/grilist" | 14 | "fagott.pw/grilist/grilist" |
15 | "fagott.pw/grilist/cache" | ||
15 | 16 | ||
16 | "github.com/julienschmidt/httprouter" | 17 | "github.com/julienschmidt/httprouter" |
17 | ) | 18 | ) |
18 | 19 | ||
20 | type CachedGril struct { | ||
21 | Created time.Time | ||
22 | Gril *Gril | ||
23 | } | ||
24 | |||
19 | var ( | 25 | var ( |
20 | pgArrayReg = regexp.MustCompile(`(((?P<value>(([^",\\{}\s(NULL)])+|"([^"\\]|\\"|\\\\)*")))(,)?)`) | 26 | pgArrayReg = regexp.MustCompile(`(((?P<value>(([^",\\{}\s(NULL)])+|"([^"\\]|\\"|\\\\)*")))(,)?)`) |
21 | pgValueIdx int | 27 | pgValueIdx int |
@@ -32,6 +38,7 @@ func findIdx() { | |||
32 | 38 | ||
33 | type GrilsModule struct { | 39 | type GrilsModule struct { |
34 | g *grilist.Grilist | 40 | g *grilist.Grilist |
41 | c *cache.Cache | ||
35 | } | 42 | } |
36 | 43 | ||
37 | func (m *GrilsModule) Name() string { | 44 | func (m *GrilsModule) Name() string { |
@@ -43,6 +50,8 @@ func (m *GrilsModule) Init(g *grilist.Grilist) { | |||
43 | m.g = g | 50 | m.g = g |
44 | m.g.Router.GET("/gril/:id", m.viewGril) | 51 | m.g.Router.GET("/gril/:id", m.viewGril) |
45 | m.g.Router.GET("/gril/:id/*rest", m.viewGril) | 52 | m.g.Router.GET("/gril/:id/*rest", m.viewGril) |
53 | |||
54 | m.c = cache.New() | ||
46 | } | 55 | } |
47 | 56 | ||
48 | func (m *GrilsModule) getGrils(whereClause string, params ...interface{}) ([]*Gril, error) { | 57 | func (m *GrilsModule) getGrils(whereClause string, params ...interface{}) ([]*Gril, error) { |
@@ -143,6 +152,10 @@ func (m *GrilsModule) ProvideDashboardData(user *charakterin.User) []grilist.Das | |||
143 | } | 152 | } |
144 | 153 | ||
145 | func (m *GrilsModule) FromID(id int) (*Gril, error) { | 154 | func (m *GrilsModule) FromID(id int) (*Gril, error) { |
155 | if g, ok := m.c.Get(id); ok { | ||
156 | return g.(*Gril), nil | ||
157 | } | ||
158 | |||
146 | gril := &Gril{ | 159 | gril := &Gril{ |
147 | ID: id, | 160 | ID: id, |
148 | } | 161 | } |
@@ -155,6 +168,7 @@ func (m *GrilsModule) FromID(id int) (*Gril, error) { | |||
155 | if err != nil { | 168 | if err != nil { |
156 | return nil, err | 169 | return nil, err |
157 | } | 170 | } |
171 | m.c.Insert(id, gril) | ||
158 | return gril, nil | 172 | return gril, nil |
159 | } | 173 | } |
160 | 174 | ||
diff --git a/modules/lists/lists.go b/modules/lists/lists.go index 836f6af..910162a 100644 --- a/modules/lists/lists.go +++ b/modules/lists/lists.go | |||
@@ -7,6 +7,7 @@ import ( | |||
7 | "fagott.pw/charakterin" | 7 | "fagott.pw/charakterin" |
8 | "fagott.pw/grilist/frontend" | 8 | "fagott.pw/grilist/frontend" |
9 | "fagott.pw/grilist/grilist" | 9 | "fagott.pw/grilist/grilist" |
10 | "fagott.pw/grilist/cache" | ||
10 | "fagott.pw/grilist/modules/grils" | 11 | "fagott.pw/grilist/modules/grils" |
11 | "fmt" | 12 | "fmt" |
12 | "github.com/julienschmidt/httprouter" | 13 | "github.com/julienschmidt/httprouter" |
@@ -22,6 +23,7 @@ import ( | |||
22 | // Module und so. | 23 | // Module und so. |
23 | type Module struct { | 24 | type Module struct { |
24 | g *grilist.Grilist | 25 | g *grilist.Grilist |
26 | c *cache.Cache | ||
25 | grils *grils.GrilsModule | 27 | grils *grils.GrilsModule |
26 | } | 28 | } |
27 | 29 | ||
@@ -76,6 +78,8 @@ func (m *Module) Init(g *grilist.Grilist) { | |||
76 | m.g.Router.POST("/new/list", m.createList) | 78 | m.g.Router.POST("/new/list", m.createList) |
77 | 79 | ||
78 | m.g.Router.GET("/api/lists/user", m.APIgetUserLists) | 80 | m.g.Router.GET("/api/lists/user", m.APIgetUserLists) |
81 | |||
82 | m.c = cache.New() | ||
79 | } | 83 | } |
80 | 84 | ||
81 | func (m *Module) getListGrils(list *List) error { | 85 | func (m *Module) getListGrils(list *List) error { |
@@ -85,6 +89,7 @@ func (m *Module) getListGrils(list *List) error { | |||
85 | } | 89 | } |
86 | 90 | ||
87 | defer rows.Close() | 91 | defer rows.Close() |
92 | list.Grils = list.Grils[:0] | ||
88 | for rows.Next() { | 93 | for rows.Next() { |
89 | var grilID int | 94 | var grilID int |
90 | lg := &ListGril{} | 95 | lg := &ListGril{} |
@@ -123,6 +128,12 @@ func (m *Module) getLists(whereClause string, params ...interface{}) ([]*List, e | |||
123 | log.Println("error scanning row in getLists:", err) | 128 | log.Println("error scanning row in getLists:", err) |
124 | continue | 129 | continue |
125 | } | 130 | } |
131 | |||
132 | if clist, ok := m.c.Get(list.ID); ok { | ||
133 | // weiteres parsen abbrechen | ||
134 | lists = append(lists, clist.(*List)) | ||
135 | continue | ||
136 | } | ||
126 | 137 | ||
127 | // Owner kriegn | 138 | // Owner kriegn |
128 | owner, err := m.g.Charakterin.GetUserByID(ownerID) | 139 | owner, err := m.g.Charakterin.GetUserByID(ownerID) |
@@ -131,7 +142,8 @@ func (m *Module) getLists(whereClause string, params ...interface{}) ([]*List, e | |||
131 | continue | 142 | continue |
132 | } | 143 | } |
133 | list.Owner = owner | 144 | list.Owner = owner |
134 | 145 | ||
146 | m.c.Insert(list.ID, list) | ||
135 | lists = append(lists, list) | 147 | lists = append(lists, list) |
136 | } | 148 | } |
137 | 149 | ||
@@ -157,6 +169,17 @@ func (m *Module) GetUserLists(u *charakterin.User, withGrils bool) []*List { | |||
157 | 169 | ||
158 | // FromID sucht nach der Liste mit der gegebenen ID und gibt sie, falls sie existiert, zurück. | 170 | // FromID sucht nach der Liste mit der gegebenen ID und gibt sie, falls sie existiert, zurück. |
159 | func (m *Module) FromID(id int, withGrils bool) (*List, error) { | 171 | func (m *Module) FromID(id int, withGrils bool) (*List, error) { |
172 | if lst, ok := m.c.Get(id); ok { | ||
173 | l := lst.(*List) | ||
174 | // Potenzieller Optimierungsbedarf: neue query, wenn die Liste leer ist. updateGrilOrder nutzt derzeit aber genau dieses verhalten. | ||
175 | if withGrils && len(l.Grils) == 0 { | ||
176 | if err := m.getListGrils(l); err != nil { | ||
177 | return nil, err | ||
178 | } | ||
179 | } | ||
180 | return l, nil | ||
181 | } | ||
182 | |||
160 | lists, err := m.getLists(`id = $1`, id) | 183 | lists, err := m.getLists(`id = $1`, id) |
161 | if err != nil { | 184 | if err != nil { |
162 | return nil, err | 185 | return nil, err |
@@ -210,11 +233,12 @@ func (m *Module) ProvideDashboardData(user *charakterin.User) []grilist.Dashboar | |||
210 | log.Println(err) | 233 | log.Println(err) |
211 | return categories | 234 | return categories |
212 | } | 235 | } |
213 | //for _, list := range lists { | 236 | |
214 | //if err := m.getListGrils(list); err != nil { | 237 | for _, list := range lists { |
215 | // log.Println(err) | 238 | if err := m.getListGrils(list); err != nil { |
216 | //} | 239 | log.Println(err) |
217 | //} | 240 | } |
241 | } | ||
218 | 242 | ||
219 | categories = append(categories, grilist.DashboardCategory{ | 243 | categories = append(categories, grilist.DashboardCategory{ |
220 | Title: "Neueste Listen", | 244 | Title: "Neueste Listen", |
@@ -242,12 +266,14 @@ func (m *Module) viewList(w http.ResponseWriter, r *http.Request, p httprouter.P | |||
242 | 266 | ||
243 | id, err := strconv.Atoi(sid) | 267 | id, err := strconv.Atoi(sid) |
244 | if err != nil { | 268 | if err != nil { |
269 | log.Println("redir") | ||
245 | http.Redirect(w, r, "/", 302) | 270 | http.Redirect(w, r, "/", 302) |
246 | return | 271 | return |
247 | } | 272 | } |
248 | 273 | ||
249 | list, err := m.FromID(id, true) | 274 | list, err := m.FromID(id, true) |
250 | if err != nil { | 275 | if err != nil { |
276 | log.Println("redir") | ||
251 | http.Redirect(w, r, "/", 302) | 277 | http.Redirect(w, r, "/", 302) |
252 | return | 278 | return |
253 | } | 279 | } |
@@ -406,6 +432,12 @@ func (m *Module) updateGrilOrder(w http.ResponseWriter, r *http.Request, p httpr | |||
406 | http.Error(w, "could not update gril order", 500) | 432 | http.Error(w, "could not update gril order", 500) |
407 | return | 433 | return |
408 | } | 434 | } |
435 | |||
436 | // wenn die liste im cache ist, die Grils clearen, damit beim naechsten aufruf die Gril-Liste neu geholt wird. | ||
437 | if l, ok := m.c.Get(listID); ok { | ||
438 | ls := l.(*List) | ||
439 | ls.Grils = ls.Grils[:0] | ||
440 | } | ||
409 | 441 | ||
410 | w.WriteHeader(200) | 442 | w.WriteHeader(200) |
411 | w.Write([]byte("ok")) | 443 | w.Write([]byte("ok")) |
diff --git a/modules/user/user.go b/modules/user/user.go index 06245e2..92a04db 100644 --- a/modules/user/user.go +++ b/modules/user/user.go | |||
@@ -27,13 +27,13 @@ func (m *Module) Name() string { | |||
27 | 27 | ||
28 | func (m *Module) Init(g *grilist.Grilist) { | 28 | func (m *Module) Init(g *grilist.Grilist) { |
29 | m.g = g | 29 | m.g = g |
30 | 30 | ||
31 | gm, ok := g.Modules["Lists"] | 31 | gm, ok := g.Modules["Lists"] |
32 | if !ok { | 32 | if !ok { |
33 | log.Fatal("tags: lists module not found") | 33 | log.Fatal("tags: lists module not found") |
34 | } | 34 | } |
35 | m.lists = gm.(*lists.Module) | 35 | m.lists = gm.(*lists.Module) |
36 | 36 | ||
37 | m.g.Router.GET("/user/:id", m.viewUser) | 37 | m.g.Router.GET("/user/:id", m.viewUser) |
38 | m.g.Router.GET("/user/:id/*rest", m.viewUser) | 38 | m.g.Router.GET("/user/:id/*rest", m.viewUser) |
39 | } | 39 | } |
@@ -44,13 +44,13 @@ func (m *Module) ProvideDashboardData(user *charakterin.User) []grilist.Dashboar | |||
44 | 44 | ||
45 | func (m *Module) viewUser(w http.ResponseWriter, r *http.Request, p httprouter.Params) { | 45 | func (m *Module) viewUser(w http.ResponseWriter, r *http.Request, p httprouter.Params) { |
46 | currentUser, _ := m.g.Charakterin.GetUserFromRequest(r) | 46 | currentUser, _ := m.g.Charakterin.GetUserFromRequest(r) |
47 | 47 | ||
48 | userID, err := strconv.Atoi(p.ByName("id")) | 48 | userID, err := strconv.Atoi(p.ByName("id")) |
49 | if err != nil { | 49 | if err != nil { |
50 | http.Redirect(w, r, "/", 302) | 50 | http.Redirect(w, r, "/", 302) |
51 | return | 51 | return |
52 | } | 52 | } |
53 | 53 | ||
54 | user := currentUser | 54 | user := currentUser |
55 | if user == nil || currentUser.ID != userID { | 55 | if user == nil || currentUser.ID != userID { |
56 | user, err = m.g.Charakterin.GetUserByID(userID) | 56 | user, err = m.g.Charakterin.GetUserByID(userID) |
@@ -59,13 +59,13 @@ func (m *Module) viewUser(w http.ResponseWriter, r *http.Request, p httprouter.P | |||
59 | return | 59 | return |
60 | } | 60 | } |
61 | } | 61 | } |
62 | 62 | ||
63 | userLists := m.lists.GetUserLists(user, true) | 63 | userLists := m.lists.GetUserLists(user, true) |
64 | 64 | ||
65 | data := m.g.Renderer.DefaultData() | 65 | data := m.g.Renderer.DefaultData() |
66 | data["user"] = currentUser | 66 | data["user"] = currentUser |
67 | data["DisplayUser"] = user | 67 | data["DisplayUser"] = user |
68 | data["Lists"] = lists.ListsToCards(userLists) | 68 | data["Lists"] = lists.ListsToCards(userLists) |
69 | 69 | ||
70 | m.g.Renderer.RenderPage("user", w, data) | 70 | m.g.Renderer.RenderPage("user", w, data) |
71 | } | 71 | } |