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