From 5bc6406eb64068519536e55dedde4845115e8856 Mon Sep 17 00:00:00 2001 From: Janne Mareike Koschinski <janne@kuschku.de> Date: Sat, 4 May 2019 17:29:02 +0200 Subject: [PATCH] Further cache fixes --- client.go | 160 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 136 insertions(+), 24 deletions(-) diff --git a/client.go b/client.go index 7d11f68..7ece9dc 100644 --- a/client.go +++ b/client.go @@ -46,9 +46,23 @@ func (c *ApiClient) loadWithCache(key string, result interface{}, load func() (i func (c *ApiClient) Station(evaId int64) ([]Station, error) { key := fmt.Sprintf("realtime_recent %d", evaId) var result []Station - err := c.loadWithCache(key, &result, func() (interface{}, error) { - return c.loadStation(evaId) - }) + for _, cache := range c.Caches { + if err := cache.Get(key, result); err == nil { + for _, targetCache := range c.Caches { + if targetCache == cache { + break + } + _ = targetCache.Set(key, result) + } + return result, err + } + } + var err error + if result, err = c.loadStation(evaId); err == nil { + for _, cache := range c.Caches { + _ = cache.Set(key, result) + } + } return result, err } @@ -79,9 +93,23 @@ func (c *ApiClient) Timetable(evaId int64, date time.Time) (Timetable, error) { key := fmt.Sprintf("timetable %d %s", evaId, date.Format(cacheTimestamp)) var result Timetable - err := c.loadWithCache(key, &result, func() (interface{}, error) { - return c.loadTimetable(evaId, date) - }) + for _, cache := range c.Caches { + if err := cache.Get(key, result); err == nil { + for _, targetCache := range c.Caches { + if targetCache == cache { + break + } + _ = targetCache.Set(key, result) + } + return result, err + } + } + var err error + if result, err = c.loadTimetable(evaId, date); err == nil { + for _, cache := range c.Caches { + _ = cache.Set(key, result) + } + } return result, err } @@ -113,9 +141,23 @@ func (c *ApiClient) RealtimeAll(evaId int64, date time.Time) (Timetable, error) key := fmt.Sprintf("realtime_all %d %s", evaId, date.Format(cacheTimestamp)) var result Timetable - err := c.loadWithCache(key, &result, func() (interface{}, error) { - return c.loadRealtimeAll(evaId, date) - }) + for _, cache := range c.Caches { + if err := cache.Get(key, result); err == nil { + for _, targetCache := range c.Caches { + if targetCache == cache { + break + } + _ = targetCache.Set(key, result) + } + return result, err + } + } + var err error + if result, err = c.loadRealtimeAll(evaId, date); err == nil { + for _, cache := range c.Caches { + _ = cache.Set(key, result) + } + } return result, err } @@ -146,9 +188,23 @@ func (c *ApiClient) RealtimeRecent(evaId int64, date time.Time) (Timetable, erro key := fmt.Sprintf("realtime_recent %d %s", evaId, date.Format(cacheTimestamp)) var result Timetable - err := c.loadWithCache(key, &result, func() (interface{}, error) { - return c.loadRealtimeRecent(evaId, date) - }) + for _, cache := range c.Caches { + if err := cache.Get(key, result); err == nil { + for _, targetCache := range c.Caches { + if targetCache == cache { + break + } + _ = targetCache.Set(key, result) + } + return result, err + } + } + var err error + if result, err = c.loadRealtimeRecent(evaId, date); err == nil { + for _, cache := range c.Caches { + _ = cache.Set(key, result) + } + } return result, err } @@ -179,9 +235,23 @@ func (c *ApiClient) WingDefinition(parent string, wing string) (WingDefinition, key := fmt.Sprintf("wing_definition %s %s", parent, wing) var result WingDefinition - err := c.loadWithCache(key, &result, func() (interface{}, error) { - return c.loadWingDefinition(parent, wing) - }) + for _, cache := range c.Caches { + if err := cache.Get(key, result); err == nil { + for _, targetCache := range c.Caches { + if targetCache == cache { + break + } + _ = targetCache.Set(key, result) + } + return result, err + } + } + var err error + if result, err = c.loadWingDefinition(parent, wing); err == nil { + for _, cache := range c.Caches { + _ = cache.Set(key, result) + } + } return result, err } @@ -212,9 +282,23 @@ func (c *ApiClient) CoachSequence(line string, date time.Time) (CoachSequence, e key := fmt.Sprintf("coach_sequence %s %s", line, date.Format(cacheTimestamp)) var result CoachSequence - err := c.loadWithCache(key, &result, func() (interface{}, error) { - return c.loadCoachSequence(line, date) - }) + for _, cache := range c.Caches { + if err := cache.Get(key, result); err == nil { + for _, targetCache := range c.Caches { + if targetCache == cache { + break + } + _ = targetCache.Set(key, result) + } + return result, err + } + } + var err error + if result, err = c.loadCoachSequence(line, date); err == nil { + for _, cache := range c.Caches { + _ = cache.Set(key, result) + } + } return result, err } @@ -245,9 +329,23 @@ func (c *ApiClient) Suggestions(line string, date time.Time) ([]Suggestion, erro key := fmt.Sprintf("suggestions %s %s", line, date.Format(cacheTimestamp)) var result []Suggestion - err := c.loadWithCache(key, &result, func() (interface{}, error) { - return c.loadSuggestions(line, date) - }) + for _, cache := range c.Caches { + if err := cache.Get(key, result); err == nil { + for _, targetCache := range c.Caches { + if targetCache == cache { + break + } + _ = targetCache.Set(key, result) + } + return result, err + } + } + var err error + if result, err = c.loadSuggestions(line, date); err == nil { + for _, cache := range c.Caches { + _ = cache.Set(key, result) + } + } return result, err } @@ -299,9 +397,23 @@ func (c *ApiClient) HafasMessages(trainlink string) ([]HafasMessage, error) { key := fmt.Sprintf("hafas_messages %s", trainlink) var result []HafasMessage - err := c.loadWithCache(key, &result, func() (interface{}, error) { - return c.loadHafasMessages(trainlink) - }) + for _, cache := range c.Caches { + if err := cache.Get(key, result); err == nil { + for _, targetCache := range c.Caches { + if targetCache == cache { + break + } + _ = targetCache.Set(key, result) + } + return result, err + } + } + var err error + if result, err = c.loadHafasMessages(trainlink); err == nil { + for _, cache := range c.Caches { + _ = cache.Set(key, result) + } + } return result, err } -- GitLab