2017-10-26 04:37:33 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
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"
mc "github.com/go-macaron/cache"
)
var conn mc . Cache
// NewContext start cache service
func NewContext ( ) error {
if setting . CacheService == nil || conn != nil {
return nil
}
var err error
conn , err = mc . NewCacher ( setting . CacheService . Adapter , mc . Options {
Adapter : setting . CacheService . Adapter ,
AdapterConfig : setting . CacheService . Conn ,
Interval : setting . CacheService . Interval ,
} )
return err
}
// 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 ( )
}
if ! conn . IsExist ( key ) {
var (
value int
err error
)
if value , err = getFunc ( ) ; err != nil {
return value , err
}
conn . Put ( key , value , int64 ( setting . CacheService . TTL . Seconds ( ) ) )
}
2017-11-16 10:06:34 +03:00
switch value := conn . Get ( key ) . ( type ) {
case int :
return value , nil
case string :
v , err := strconv . Atoi ( value )
if err != nil {
return 0 , err
}
return v , nil
default :
return 0 , fmt . Errorf ( "Unsupported cached value type: %v" , value )
}
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 ( )
}
if ! conn . IsExist ( key ) {
var (
value int64
err error
)
if value , err = getFunc ( ) ; err != nil {
return value , err
}
conn . Put ( key , value , int64 ( setting . CacheService . TTL . Seconds ( ) ) )
}
2017-11-16 10:06:34 +03:00
switch value := conn . Get ( key ) . ( type ) {
case int64 :
return value , nil
case string :
v , err := strconv . ParseInt ( value , 10 , 64 )
if err != nil {
return 0 , err
}
return v , nil
default :
return 0 , fmt . Errorf ( "Unsupported cached value type: %v" , value )
}
2017-10-26 04:37:33 +03:00
}
// Remove key from cache
func Remove ( key string ) {
if conn == nil {
return
}
conn . Delete ( key )
}