173 lines
4.4 KiB
Go
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)
|
|
}
|
|
}
|