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: v.RegisteTime.Unix(), 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 }