Files
go-common/app/service/main/passport/dao/hbase_pwd.go
2019-04-22 18:49:16 +08:00

104 lines
2.1 KiB
Go

package dao
import (
"bytes"
"context"
"encoding/binary"
"io"
"time"
"go-common/app/service/main/passport/model"
"go-common/library/log"
"github.com/tsuna/gohbase/hrpc"
)
const (
_tPwdLog = "ugc:PwdLog"
_fPwdLog = "pwdlog"
_cPwdLogOldPwd = "old_pwd"
_cPwdLogOldSalt = "old_salt"
)
var (
_tPwdLogB = []byte(_tPwdLog)
_fPwdLogB = []byte(_fPwdLog)
_cPwdLogOldPwdB = []byte(_cPwdLogOldPwd)
_cPwdLogOldSaltB = []byte(_cPwdLogOldSalt)
)
// HistoryPwds get history pwd
func (d *Dao) HistoryPwds(c context.Context, mid int64) (res []*model.HistoryPwd, err error) {
ctx, cancel := context.WithTimeout(c, time.Duration(d.c.HBase.LoginLog.ReadTimeout))
defer cancel()
st := RowKeyPwdLog(mid, _int64Max)
ed := RowKeyPwdLog(mid, 0)
var scaner hrpc.Scanner
scaner, err = d.pwdLogHBase.ScanRange(ctx, _tPwdLogB, st, ed)
if err != nil {
log.Error("hbase.ScanRange(%s, %s, %s) error(%v)", _tPwdLogB, st, ed, err)
return
}
res = make([]*model.HistoryPwd, 0)
for {
var pwd *model.HistoryPwd
var r *hrpc.Result
r, err = scaner.Next()
if err != nil {
if err == io.EOF {
err = nil
break
}
return
}
if pwd, err = scanPwdLog(r.Cells); err != nil {
scaner.Close()
return
}
if pwd != nil {
res = append(res, pwd)
}
}
if err := scaner.Close(); err != nil {
log.Error("hbase.Scanner.Close error(%v)", err)
}
return
}
// RowKeyPwdLog generate row key of pwd log.
func RowKeyPwdLog(mid, ts int64) (res []byte) {
buf := bytes.Buffer{}
b := make([]byte, 8)
// reverse mid bytes
binary.BigEndian.PutUint64(b, uint64(mid))
reverse(b)
buf.Write(b)
// (int64_max - ts) bytes
binary.BigEndian.PutUint64(b, uint64(_int64Max-ts))
buf.Write(b)
res = buf.Bytes()
return
}
func scanPwdLog(cells []*hrpc.Cell) (res *model.HistoryPwd, err error) {
if len(cells) == 0 {
return
}
res = new(model.HistoryPwd)
for _, cell := range cells {
if bytes.Equal(cell.Family, _fPwdLogB) {
switch {
case bytes.Equal(cell.Qualifier, _cPwdLogOldPwdB):
res.OldPwd = string(cell.Value)
case bytes.Equal(cell.Qualifier, _cPwdLogOldSaltB):
res.OldSalt = string(cell.Value)
}
}
}
return
}