106 lines
3.2 KiB
Go
106 lines
3.2 KiB
Go
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
|
||
}
|