code.gitea.io/gitea@v1.19.3/modules/cache/cache.go (about) 1 // Copyright 2017 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package cache 5 6 import ( 7 "fmt" 8 "strconv" 9 10 "code.gitea.io/gitea/modules/setting" 11 12 mc "gitea.com/go-chi/cache" 13 14 _ "gitea.com/go-chi/cache/memcache" // memcache plugin for cache 15 ) 16 17 var conn mc.Cache 18 19 func newCache(cacheConfig setting.Cache) (mc.Cache, error) { 20 return mc.NewCacher(mc.Options{ 21 Adapter: cacheConfig.Adapter, 22 AdapterConfig: cacheConfig.Conn, 23 Interval: cacheConfig.Interval, 24 }) 25 } 26 27 // NewContext start cache service 28 func NewContext() error { 29 var err error 30 31 if conn == nil && setting.CacheService.Enabled { 32 if conn, err = newCache(setting.CacheService.Cache); err != nil { 33 return err 34 } 35 if err = conn.Ping(); err != nil { 36 return err 37 } 38 } 39 40 return err 41 } 42 43 // GetCache returns the currently configured cache 44 func GetCache() mc.Cache { 45 return conn 46 } 47 48 // GetString returns the key value from cache with callback when no key exists in cache 49 func GetString(key string, getFunc func() (string, error)) (string, error) { 50 if conn == nil || setting.CacheService.TTL == 0 { 51 return getFunc() 52 } 53 54 cached := conn.Get(key) 55 56 if cached == nil { 57 value, err := getFunc() 58 if err != nil { 59 return value, err 60 } 61 return value, conn.Put(key, value, setting.CacheService.TTLSeconds()) 62 } 63 64 if value, ok := cached.(string); ok { 65 return value, nil 66 } 67 68 if stringer, ok := cached.(fmt.Stringer); ok { 69 return stringer.String(), nil 70 } 71 72 return fmt.Sprintf("%s", cached), nil 73 } 74 75 // GetInt returns key value from cache with callback when no key exists in cache 76 func GetInt(key string, getFunc func() (int, error)) (int, error) { 77 if conn == nil || setting.CacheService.TTL == 0 { 78 return getFunc() 79 } 80 81 cached := conn.Get(key) 82 83 if cached == nil { 84 value, err := getFunc() 85 if err != nil { 86 return value, err 87 } 88 89 return value, conn.Put(key, value, setting.CacheService.TTLSeconds()) 90 } 91 92 switch v := cached.(type) { 93 case int: 94 return v, nil 95 case string: 96 value, err := strconv.Atoi(v) 97 if err != nil { 98 return 0, err 99 } 100 return value, nil 101 default: 102 value, err := getFunc() 103 if err != nil { 104 return value, err 105 } 106 return value, conn.Put(key, value, setting.CacheService.TTLSeconds()) 107 } 108 } 109 110 // GetInt64 returns key value from cache with callback when no key exists in cache 111 func GetInt64(key string, getFunc func() (int64, error)) (int64, error) { 112 if conn == nil || setting.CacheService.TTL == 0 { 113 return getFunc() 114 } 115 116 cached := conn.Get(key) 117 118 if cached == nil { 119 value, err := getFunc() 120 if err != nil { 121 return value, err 122 } 123 124 return value, conn.Put(key, value, setting.CacheService.TTLSeconds()) 125 } 126 127 switch v := conn.Get(key).(type) { 128 case int64: 129 return v, nil 130 case string: 131 value, err := strconv.ParseInt(v, 10, 64) 132 if err != nil { 133 return 0, err 134 } 135 return value, nil 136 default: 137 value, err := getFunc() 138 if err != nil { 139 return value, err 140 } 141 142 return value, conn.Put(key, value, setting.CacheService.TTLSeconds()) 143 } 144 } 145 146 // Remove key from cache 147 func Remove(key string) { 148 if conn == nil { 149 return 150 } 151 _ = conn.Delete(key) 152 }