game_sync/statistics/syn/user_account.go

106 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package syn
import (
"context"
"errors"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"gorm.io/gorm"
mongomodel "mongo.games.com/game/statistics/modelmongo"
mysqlmodel "mongo.games.com/game/statistics/modelmysql"
"mongo.games.com/goserver/core/logger"
mymongo "mongo.games.com/goserver/core/mongox"
mymysql "mongo.games.com/goserver/core/mysqlx"
)
/*
注册信息同步使用mongo的_id,从小到大每次同步n个
*/
// UserAccount 同步注册表
func UserAccount(platform string, batchSize int) ([]*mysqlmodel.UserAccount, error) {
db, err := mymysql.GetDatabase(platform)
if err != nil {
logger.Logger.Errorf("mysql: UserAccount failed to get database: %v", err)
return nil, err
}
account := &mysqlmodel.UserAccount{}
err = db.Model(&mysqlmodel.UserAccount{}).Last(account).Error
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
logger.Logger.Errorf("mysql: UserAccount failed to get account: %v", err)
return nil, err
}
logger.Logger.Tracef("start UserAccount account _id:%v", account.MID)
_id, _ := primitive.ObjectIDFromHex(account.MID)
filter := bson.M{"_id": bson.M{"$gt": _id}}
c, err := mymongo.GetUserCollection(platform, mongomodel.UserAccount)
if err != nil {
logger.Logger.Errorf("get collection %s error %v", mongomodel.UserAccount, err)
return nil, err
}
l, err := c.Find(context.TODO(), filter,
options.Find().SetSort(bson.D{primitive.E{Key: "_id", Value: 1}}), options.Find().SetLimit(int64(batchSize)))
if err != nil && !errors.Is(err, mongo.ErrNoDocuments) {
logger.Logger.Errorf("mongo: UserAccount failed to get account: %v", err)
return nil, err
}
var accounts []*mongomodel.Account
if err = l.All(context.TODO(), &accounts); err != nil {
l.Close(context.TODO())
if errors.Is(err, mongo.ErrNoDocuments) {
return nil, nil
}
logger.Logger.Errorf("mongo: UserAccount failed to get account: %v", err)
return nil, err
}
l.Close(context.TODO())
var as []*mysqlmodel.UserAccount
err = db.Transaction(func(tx *gorm.DB) error {
for _, v := range accounts {
logger.Logger.Tracef("mongo account: %+v", *v)
a := &mysqlmodel.UserAccount{
MID: v.AccountId.Hex(),
Snid: int(v.SnId),
//RegisterTs: int(v.RegisterTs),
RegisterTime: v.RegisteTime,
Tel: v.Tel,
ChannelId: v.ChannelId,
}
if err = tx.Create(a).Error; err != nil {
logger.Logger.Errorf("mysql: UserAccount failed to create account: %v", err)
return err
}
if err = tx.First(&mysqlmodel.UserID{}, "snid = ?", v.SnId).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
logger.Logger.Errorf("mysql: UserAccount failed to find user_id: %v", err)
return err
}
if errors.Is(err, gorm.ErrRecordNotFound) {
if err = tx.Create(&mysqlmodel.UserID{Snid: int(v.SnId)}).Error; err != nil {
logger.Logger.Errorf("mysql: UserAccount failed to create user_id: %v", err)
return err
}
}
as = append(as, a)
}
return nil
})
if err != nil {
logger.Logger.Errorf("mysql: UserAccount failed to transaction: %v", err)
return as, err
}
return as, nil
}