87 lines
1.7 KiB
Go
87 lines
1.7 KiB
Go
|
package jsondb
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"math/rand"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
var errCacheDisabled = errors.New("cache disabled")
|
||
|
|
||
|
// SetCache sets a cache key.
|
||
|
func (db *DB) SetCache(key, value string, expires int) error {
|
||
|
if db.Cache == nil {
|
||
|
return errCacheDisabled
|
||
|
}
|
||
|
return db.Cache.Set(key, []byte(value), expires)
|
||
|
}
|
||
|
|
||
|
// SetJSONCache caches a JSON object.
|
||
|
func (db *DB) SetJSONCache(key string, v interface{}, expires int) error {
|
||
|
if db.Cache == nil {
|
||
|
return errCacheDisabled
|
||
|
}
|
||
|
bytes, err := json.Marshal(v)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return db.SetCache(key, string(bytes), expires)
|
||
|
}
|
||
|
|
||
|
// GetCache gets a cache key.
|
||
|
func (db *DB) GetCache(key string) (string, error) {
|
||
|
if db.Cache == nil {
|
||
|
return "", errCacheDisabled
|
||
|
}
|
||
|
v, err := db.Cache.Get(key)
|
||
|
return string(v), err
|
||
|
}
|
||
|
|
||
|
// DeleteCache deletes a cache key.
|
||
|
func (db *DB) DeleteCache(key string) error {
|
||
|
if db.Cache == nil {
|
||
|
return errCacheDisabled
|
||
|
}
|
||
|
db.Cache.Delete(key)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// LockCache implements 'file locking' in your cache.
|
||
|
func (db *DB) LockCache(key string) bool {
|
||
|
if db.Cache == nil {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
log.Info("LockCache(%s)", key)
|
||
|
|
||
|
var (
|
||
|
// In seconds
|
||
|
timeout = 5 * time.Second
|
||
|
expire = 20
|
||
|
)
|
||
|
|
||
|
identifier := fmt.Sprintf("%d", rand.Uint64())
|
||
|
log.Info("id: %s", identifier)
|
||
|
|
||
|
end := time.Now().Add(timeout)
|
||
|
for time.Now().Before(end) {
|
||
|
if ok := db.Cache.Lock("lock:"+key, identifier, expire); ok {
|
||
|
log.Info("JsonDB: Acquired lock for %s", key)
|
||
|
return true
|
||
|
}
|
||
|
time.Sleep(1 * time.Millisecond)
|
||
|
}
|
||
|
log.Error("JsonDB: lock timeout for %s", key)
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
// UnlockCache releases the lock on a cache key.
|
||
|
func (db *DB) UnlockCache(key string) {
|
||
|
if db.Cache == nil {
|
||
|
return
|
||
|
}
|
||
|
db.Cache.Unlock("lock:" + key)
|
||
|
}
|