Files
go-common/app/service/live/resource/dao/confkv.go
2019-04-22 18:49:16 +08:00

142 lines
3.6 KiB
Go

package dao
import (
"context"
"encoding/json"
v1pb "go-common/app/service/live/resource/api/grpc/v1"
"go-common/library/database/sql"
"go-common/library/log"
)
const (
_findConfkvSQL = "SELECT `value` FROM `confkv` WHERE `key` = ?"
_addConfkvSQL = "INSERT INTO `confkv` (`key`,`value`) VALUES (?,?)"
_updateConfkvSQL = "UPDATE `confkv` SET `value`=? WHERE `key`=?"
)
const (
_confLiveCheck = "live_check"
_platformAndroid = "android"
_platformIos = "ios"
)
// GetLiveCheck live.app-interface call
// cache -> db
func (d *Dao) GetLiveCheck(c context.Context, platform, system, mobile string) (isLive int64) {
isLive = int64(1)
inst := 0
res, ok := d.sCache[inst].Get(cacheLiveCheckKey(platform, system, mobile))
if !ok {
value, err := d.ConfKv(c, _confLiveCheck)
if err != nil {
log.Error("[LiveCheck] get live check error by from source")
return
}
if value == "" {
log.Error("[LiveCheck] get live check error by source data empty")
return
}
list := &v1pb.GetLiveCheckListResp{}
err = json.Unmarshal([]byte(value), list)
if err != nil {
log.Error("[LiveCheck] get live check error by source data wrong format")
return
}
log.Info("[LiveCheck] live_check list is %v", list)
switch platform {
case _platformAndroid:
for _, v := range list.Android {
if v.System == system {
for _, m := range v.Mobile {
if m == mobile {
isLive = int64(0)
}
}
}
}
case _platformIos:
for _, v := range list.Ios {
if v.System == system {
for _, m := range v.Mobile {
log.Info("[LiveCheck] range m %v mobile %v", m, mobile)
if m == mobile {
isLive = int64(0)
}
}
}
}
}
d.sCache[inst].Put(cacheLiveCheckKey(platform, system, mobile), isLive)
return
}
isLive = res.(int64)
return
}
// ConfKv get data from cache if miss will call source method, then add to cache.
func (d *Dao) ConfKv(c context.Context, key string) (value string, err error) {
inst := 0
res, ok := d.sCache[inst].Get(cacheConfKey(key))
if !ok {
log.Info("[LiveCheck] conf cache miss")
value, err = d.RawConfKv(c, key)
if err != nil {
return
}
d.sCache[inst].Put(cacheConfKey(key), value)
return
}
log.Info("[LiveCheck] conf cache hit")
value = res.(string)
return
}
// SetLiveCheck set live_check conf
func (d *Dao) SetLiveCheck(c context.Context, value string) (err error) {
err = d.AddOrUpdateConfKv(c, _confLiveCheck, value)
return
}
// GetLiveCheckList get live_check conf
func (d *Dao) GetLiveCheckList(c context.Context) (value string, err error) {
value, err = d.RawConfKv(c, _confLiveCheck)
return
}
// RawConfKv get conf
func (d *Dao) RawConfKv(c context.Context, key string) (value string, err error) {
row := d.db.QueryRow(c, _findConfkvSQL, key)
if err = row.Scan(&value); err != nil {
if err == sql.ErrNoRows {
err = nil
return
}
log.Error("[SelectConfKv] row.Scan() error(%v)", err)
}
return
}
// AddOrUpdateConfKv add or update conf
func (d *Dao) AddOrUpdateConfKv(c context.Context, key string, value string) (err error) {
oldValue, err := d.RawConfKv(c, key)
if err != nil {
return
}
if oldValue != "" {
//update
log.Info("[LiveCheck] update db value %v", value)
if _, err = d.db.Exec(c, _updateConfkvSQL, value, key); err != nil {
log.Error("[AddOrUpdateConfKv] UpdateConfKv:db.Exec(%v,$v) error(%v)", key, value, err)
}
return
}
//add
log.Info("[LiveCheck] add db value %v", value)
if _, err = d.db.Exec(c, _addConfkvSQL, key, value); err != nil {
log.Error("[AddOrUpdateConfKv] AddConfKv:db.Exec(%v,$v) error(%v)", key, value, err)
}
return
}