2017-10-26 04:37:33 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2017-10-26 04:37:33 +03:00
package cache
import (
2017-11-16 10:06:34 +03:00
"strconv"
2024-04-13 11:38:44 +03:00
"time"
2017-11-16 10:06:34 +03:00
2017-10-26 04:37:33 +03:00
"code.gitea.io/gitea/modules/setting"
2024-05-27 16:43:32 +03:00
_ "gitea.com/go-chi/cache/memcache" //nolint:depguard // memcache plugin for cache, it is required for config "ADAPTER=memcache"
2017-10-26 04:37:33 +03:00
)
2024-04-13 11:38:44 +03:00
var defaultCache StringCache
2017-10-26 04:37:33 +03:00
2023-12-19 12:29:05 +03:00
// Init start cache service
func Init ( ) error {
2024-04-13 11:38:44 +03:00
if defaultCache == nil {
c , err := NewStringCache ( setting . CacheService . Cache )
if err != nil {
2020-02-01 22:11:32 +03:00
return err
}
2024-04-13 11:38:44 +03:00
for i := 0 ; i < 10 ; i ++ {
if err = c . Ping ( ) ; err == nil {
break
}
time . Sleep ( time . Second )
}
if err != nil {
2021-12-05 19:24:57 +03:00
return err
}
2024-04-13 11:38:44 +03:00
defaultCache = c
2017-10-26 04:37:33 +03:00
}
2024-04-13 11:38:44 +03:00
return nil
2017-10-26 04:37:33 +03:00
}
2020-12-17 17:00:47 +03:00
// GetCache returns the currently configured cache
2024-04-13 11:38:44 +03:00
func GetCache ( ) StringCache {
return defaultCache
2020-12-17 17:00:47 +03:00
}
2020-03-27 15:34:39 +03:00
// GetString returns the key value from cache with callback when no key exists in cache
func GetString ( key string , getFunc func ( ) ( string , error ) ) ( string , error ) {
2024-04-13 11:38:44 +03:00
if defaultCache == nil || setting . CacheService . TTL == 0 {
2020-03-27 15:34:39 +03:00
return getFunc ( )
}
2024-04-13 11:38:44 +03:00
cached , exist := defaultCache . Get ( key )
if ! exist {
2022-11-10 09:43:53 +03:00
value , err := getFunc ( )
2020-03-27 15:34:39 +03:00
if err != nil {
2022-11-10 09:43:53 +03:00
return value , err
2020-03-27 15:34:39 +03:00
}
2024-04-13 11:38:44 +03:00
return value , defaultCache . Put ( key , value , setting . CacheService . TTLSeconds ( ) )
2017-11-16 10:06:34 +03:00
}
2024-04-13 11:38:44 +03:00
return cached , nil
2017-10-26 04:37:33 +03:00
}
// GetInt64 returns key value from cache with callback when no key exists in cache
func GetInt64 ( key string , getFunc func ( ) ( int64 , error ) ) ( int64 , error ) {
2024-04-13 11:38:44 +03:00
s , err := GetString ( key , func ( ) ( string , error ) {
v , err := getFunc ( )
return strconv . FormatInt ( v , 10 ) , err
} )
if err != nil {
return 0 , err
2017-10-26 04:37:33 +03:00
}
2024-04-13 11:38:44 +03:00
if s == "" {
return 0 , nil
2017-11-16 10:06:34 +03:00
}
2024-04-13 11:38:44 +03:00
return strconv . ParseInt ( s , 10 , 64 )
2017-10-26 04:37:33 +03:00
}
// Remove key from cache
func Remove ( key string ) {
2024-04-13 11:38:44 +03:00
if defaultCache == nil {
2017-10-26 04:37:33 +03:00
return
}
2024-04-13 11:38:44 +03:00
_ = defaultCache . Delete ( key )
2017-10-26 04:37:33 +03:00
}