2019-04-22 02:59:20 +00:00

173 lines
4.4 KiB
Go

package dao
import (
"bytes"
"context"
"crypto/md5"
"encoding/binary"
"fmt"
"io"
"strconv"
"time"
"go-common/app/service/main/secure/model"
"go-common/library/log"
xtime "go-common/library/time"
"github.com/tsuna/gohbase/hrpc"
)
var (
tableLog = "ugc:login_log"
familyTS = "ts"
familyTSB = []byte(familyTS)
tableSecure = "ugc:secure"
familyEcpt = "ecpt"
familyEcptB = []byte(familyEcpt)
columnid = "id"
columnloc = "loc"
columntp = "tp"
columnip = "ip"
columnts = "ts"
// familyFB = "feedback"
// familyFBB = []byte(familyFB)
)
// rowKey return key string.
func rowKey(mid int64) string {
sum := md5.Sum([]byte(strconv.FormatInt(mid, 10)))
return fmt.Sprintf("%x", sum)
}
func exKey(mid, ts int64, ip uint32) string {
return fmt.Sprintf("%d%d_%d_%d", mid%10, mid, ts, ip)
}
func exStartkey(mid int64) string {
return fmt.Sprintf("%d%d", mid%10, mid)
}
func exStopKey(mid int64) string {
return fmt.Sprintf("%d%d", mid%10, mid+1)
}
// AddLocs add login log.
func (d *Dao) AddLocs(c context.Context, mid, locid, ts int64) (err error) {
var (
locB = make([]byte, 8)
key = rowKey(mid)
column = strconv.FormatInt(ts, 10)
ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.WriteTimeout))
)
defer cancel()
binary.BigEndian.PutUint64(locB, uint64(locid))
values := map[string]map[string][]byte{familyTS: {column: locB}}
if _, err = d.hbase.PutStr(ctx, tableLog, key, values); err != nil {
log.Error("hbase.Put error(%v)", err)
}
return
}
// Locs get all login location.
func (d *Dao) Locs(c context.Context, mid int64) (locs map[int64]int64, err error) {
var (
result *hrpc.Result
key = rowKey(mid)
ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout))
)
defer cancel()
if result, err = d.hbase.GetStr(ctx, tableLog, key); err != nil {
log.Error("d.hbase.Get error(%v)", err)
return
}
if result == nil {
return
}
locs = make(map[int64]int64)
for _, c := range result.Cells {
if c != nil && len(c.Value) == 8 && bytes.Equal(c.Family, familyTSB) {
locid := int64(binary.BigEndian.Uint64(c.Value))
locs[locid]++
}
}
return
}
// AddException add feedback.
func (d *Dao) AddException(c context.Context, l *model.Log) (err error) {
var (
idB = make([]byte, 8)
ipB = make([]byte, 8)
tsB = make([]byte, 8)
key = exKey(l.Mid, int64(l.Time), l.IP)
ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.WriteTimeout))
)
defer cancel()
binary.BigEndian.PutUint64(idB, uint64(l.LocationID))
binary.BigEndian.PutUint64(ipB, uint64(l.IP))
binary.BigEndian.PutUint64(tsB, uint64(l.Time))
values := map[string]map[string][]byte{familyEcpt: {
columnid: idB,
columnloc: []byte(l.Location),
columnts: tsB,
columnip: ipB,
}}
if _, err = d.hbase.PutStr(ctx, tableSecure, key, values); err != nil {
log.Error("hbase.Put error(%v)", err)
}
return
}
// AddFeedBack add feedback
func (d *Dao) AddFeedBack(c context.Context, l *model.Log) (err error) {
var (
tpB = make([]byte, 8)
key = exKey(l.Mid, int64(l.Time), l.IP)
ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.WriteTimeout))
)
defer cancel()
binary.BigEndian.PutUint64(tpB, uint64(l.Type))
values := map[string]map[string][]byte{familyEcpt: {columntp: tpB}}
if _, err = d.hbase.PutStr(ctx, tableSecure, key, values); err != nil {
log.Error("hbase.Put error(%v)", err)
}
return
}
// ExceptionLoc get exception loc.
func (d *Dao) ExceptionLoc(c context.Context, mid int64) (eps []*model.Expection, err error) {
var (
scanner hrpc.Scanner
result *hrpc.Result
ctx, cancel = context.WithTimeout(c, time.Duration(d.c.HBase.ReadTimeout))
)
defer cancel()
scanner, err = d.hbase.ScanRangeStr(ctx, tableSecure, exStartkey(mid), exStopKey(mid))
if err != nil {
log.Error("d.hbase.ScanRangeStr error(%v)", err)
return
}
for {
result, err = scanner.Next()
if err != nil {
if err == io.EOF {
err = nil
}
return
}
ep := new(model.Expection)
for _, c := range result.Cells {
if c != nil && bytes.Equal(c.Family, familyEcptB) {
switch string(c.Qualifier) {
case columnts:
ep.Time = xtime.Time(binary.BigEndian.Uint64(c.Value))
case columntp:
ep.FeedBack = int8(binary.BigEndian.Uint64(c.Value))
case columnip:
ep.IP = binary.BigEndian.Uint64(c.Value)
}
}
}
eps = append(eps, ep)
}
}