142 lines
3.6 KiB
Go
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
|
|
}
|