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
"fmt"
"strconv"
2017-10-26 04:37:33 +03:00
"code.gitea.io/gitea/modules/setting"
2021-01-26 18:36:53 +03:00
mc "gitea.com/go-chi/cache"
2020-01-29 10:47:46 +03:00
2021-01-26 18:36:53 +03:00
_ "gitea.com/go-chi/cache/memcache" // memcache plugin for cache
2017-10-26 04:37:33 +03:00
)
2022-01-20 20:46:10 +03:00
var conn mc . Cache
2020-02-01 22:11:32 +03:00
func newCache ( cacheConfig setting . Cache ) ( mc . Cache , error ) {
2021-01-26 18:36:53 +03:00
return mc . NewCacher ( mc . Options {
2020-02-01 22:11:32 +03:00
Adapter : cacheConfig . Adapter ,
AdapterConfig : cacheConfig . Conn ,
Interval : cacheConfig . Interval ,
} )
}
2017-10-26 04:37:33 +03:00
2023-12-19 12:29:05 +03:00
// Init start cache service
func Init ( ) error {
2020-02-01 22:11:32 +03:00
var err error
2023-12-19 12:29:05 +03:00
if conn == nil {
2020-02-01 22:11:32 +03:00
if conn , err = newCache ( setting . CacheService . Cache ) ; err != nil {
return err
}
2022-05-15 21:43:27 +03:00
if err = conn . Ping ( ) ; err != nil {
2021-12-05 19:24:57 +03:00
return err
}
2017-10-26 04:37:33 +03:00
}
return err
}
2020-12-17 17:00:47 +03:00
// GetCache returns the currently configured cache
2021-01-27 17:56:54 +03:00
func GetCache ( ) mc . Cache {
2020-12-17 17:00:47 +03:00
return conn
}
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 ) {
if conn == nil || setting . CacheService . TTL == 0 {
return getFunc ( )
}
2022-11-10 09:43:53 +03:00
cached := conn . Get ( key )
if cached == nil {
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
}
2022-11-10 09:43:53 +03:00
return value , conn . Put ( key , value , setting . CacheService . TTLSeconds ( ) )
2020-03-27 15:34:39 +03:00
}
2022-11-10 09:43:53 +03:00
if value , ok := cached . ( string ) ; ok {
return value , nil
2020-03-27 15:34:39 +03:00
}
2022-11-10 09:43:53 +03:00
if stringer , ok := cached . ( fmt . Stringer ) ; ok {
return stringer . String ( ) , nil
2020-03-27 15:34:39 +03:00
}
2022-11-10 09:43:53 +03:00
return fmt . Sprintf ( "%s" , cached ) , nil
2020-03-27 15:34:39 +03:00
}
2017-10-26 04:37:33 +03:00
// GetInt returns key value from cache with callback when no key exists in cache
func GetInt ( key string , getFunc func ( ) ( int , error ) ) ( int , error ) {
if conn == nil || setting . CacheService . TTL == 0 {
return getFunc ( )
}
2022-11-10 09:43:53 +03:00
cached := conn . Get ( key )
if cached == nil {
value , err := getFunc ( )
2019-06-12 22:41:28 +03:00
if err != nil {
2022-11-10 09:43:53 +03:00
return value , err
2019-06-12 22:41:28 +03:00
}
2022-11-10 09:43:53 +03:00
return value , conn . Put ( key , value , setting . CacheService . TTLSeconds ( ) )
2017-10-26 04:37:33 +03:00
}
2022-11-10 09:43:53 +03:00
switch v := cached . ( type ) {
2017-11-16 10:06:34 +03:00
case int :
2022-11-10 09:43:53 +03:00
return v , nil
2017-11-16 10:06:34 +03:00
case string :
2022-11-10 09:43:53 +03:00
value , err := strconv . Atoi ( v )
2017-11-16 10:06:34 +03:00
if err != nil {
return 0 , err
}
2022-11-10 09:43:53 +03:00
return value , nil
2017-11-16 10:06:34 +03:00
default :
2022-11-10 09:43:53 +03:00
value , err := getFunc ( )
if err != nil {
return value , err
}
return value , conn . Put ( key , value , setting . CacheService . TTLSeconds ( ) )
2017-11-16 10:06:34 +03:00
}
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 ) {
if conn == nil || setting . CacheService . TTL == 0 {
return getFunc ( )
}
2022-11-10 09:43:53 +03:00
cached := conn . Get ( key )
if cached == nil {
value , err := getFunc ( )
2019-06-12 22:41:28 +03:00
if err != nil {
2022-11-10 09:43:53 +03:00
return value , err
2019-06-12 22:41:28 +03:00
}
2022-11-10 09:43:53 +03:00
return value , conn . Put ( key , value , setting . CacheService . TTLSeconds ( ) )
2017-10-26 04:37:33 +03:00
}
2022-11-10 09:43:53 +03:00
switch v := conn . Get ( key ) . ( type ) {
2017-11-16 10:06:34 +03:00
case int64 :
2022-11-10 09:43:53 +03:00
return v , nil
2017-11-16 10:06:34 +03:00
case string :
2022-11-10 09:43:53 +03:00
value , err := strconv . ParseInt ( v , 10 , 64 )
2017-11-16 10:06:34 +03:00
if err != nil {
return 0 , err
}
2022-11-10 09:43:53 +03:00
return value , nil
2017-11-16 10:06:34 +03:00
default :
2022-11-10 09:43:53 +03:00
value , err := getFunc ( )
if err != nil {
return value , err
}
return value , conn . Put ( key , value , setting . CacheService . TTLSeconds ( ) )
2017-11-16 10:06:34 +03:00
}
2017-10-26 04:37:33 +03:00
}
// Remove key from cache
func Remove ( key string ) {
if conn == nil {
return
}
2019-06-12 22:41:28 +03:00
_ = conn . Delete ( key )
2017-10-26 04:37:33 +03:00
}