diff --git a/configs/registry.go b/configs/registry.go index 9a70ba6..ed8c303 100644 --- a/configs/registry.go +++ b/configs/registry.go @@ -3,6 +3,7 @@ package configs import ( "apigame/service-common/svmysql" "apigame/service-common/svredis" + "apigame/util/util-lx/lxalilog" "fmt" ) @@ -16,6 +17,7 @@ func GetApiGameConfig(gameId string) (conf *ApiGameConfig, err error) { } has, err = svmysql.First(conf, gameId) if err != nil { + lxalilog.Errors(err, "configs.GetApiGameConfig error", gameId) return } if !has { @@ -39,6 +41,7 @@ func GetCardActivityConfig(gameId string) (conf *CardActivityConfig, has bool) { confRaw := new(CardActivityConfigRaw) has, err = svmysql.First(confRaw, gameId) if err != nil { + lxalilog.Errors(err, "configs.GetCardActivityConfig error", gameId) return } if !has { @@ -65,9 +68,11 @@ func GetRoomRankConfig(gameId string) (conf *RoomRankConfig, has bool) { confRaw := new(RoomRankConfigRaw) has, err = svmysql.First(confRaw, gameId) if err != nil { + lxalilog.Errors(err, "configs.GetRoomRankConfig error", gameId) return } if !has { + return } diff --git a/service-common/svconst/mysql.go b/service-common/svconst/mysql.go index 82c623e..4e3a2bc 100644 --- a/service-common/svconst/mysql.go +++ b/service-common/svconst/mysql.go @@ -19,5 +19,5 @@ const ( MYSQL_TABLE_S_ROOMRANK_CONFIG = "s_roomrank_activity_" // 房间排行活动配置 MYSQL_TABLE_S_ROOMRANK_PLAYER = "s_roomrank_player_" // 房间排行玩家数据 - MYSQL_TABLE_S_ROOMRANK_ROOM = "s_roomrank_room_" // 房间排行房间数据 + MYSQL_TABLE_S_ROOMRANK_ROOM = "s_roomrank_room" // 房间排行房间数据 ) diff --git a/service-common/svmysql/dto.go b/service-common/svmysql/dto.go index 4789c32..a87d282 100644 --- a/service-common/svmysql/dto.go +++ b/service-common/svmysql/dto.go @@ -1,21 +1,18 @@ package svmysql -import ( - "apigame/util/util-lx/lxalilog" - "gorm.io/gorm" - "strings" -) +func InitTable(obj IMysqlData, suffix string, notify bool) { + info := obj.MysqlInfo(suffix) + db := info.DbMysql + _ = db.Table(info.TableName).AutoMigrate(obj) +} -func Insert(obj IMysqlData, suffix string) (err error) { +func Create(obj IMysqlData, suffix string) (err error) { info := obj.MysqlInfo(suffix) db := info.DbMysql - stmt := db.Session(&gorm.Session{DryRun: true}).Create(obj).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) - result := db.Exec(sql, stmt.Vars...) + result := db.Table(info.TableName).Create(obj) + err = result.Error if err != nil { - lxalilog.Errors(err, suffix) return } return @@ -24,13 +21,10 @@ func Insert(obj IMysqlData, suffix string) (err error) { func Updates(obj IMysqlData, suffix string) (err error) { info := obj.MysqlInfo(suffix) db := info.DbMysql - stmt := db.Session(&gorm.Session{DryRun: true}).Updates(obj).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) - result := db.Exec(sql, stmt.Vars...) + result := db.Table(info.TableName).Updates(obj) + err = result.Error if err != nil { - lxalilog.Errors(err, suffix) return } return @@ -39,14 +33,10 @@ func Updates(obj IMysqlData, suffix string) (err error) { func Save(obj IMysqlData, suffix string) (err error) { info := obj.MysqlInfo(suffix) db := info.DbMysql - stmt := db.Session(&gorm.Session{DryRun: true}).Save(obj).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) - result := db.Exec(sql, stmt.Vars...) + result := db.Table(info.TableName).Save(obj) err = result.Error if err != nil { - lxalilog.Errors(err, suffix) return } return @@ -55,31 +45,19 @@ func Save(obj IMysqlData, suffix string) (err error) { func First(obj IMysqlData, suffix string) (has bool, err error) { info := obj.MysqlInfo(suffix) db := info.DbMysql - stmt := db.Session(&gorm.Session{DryRun: true}).First(obj).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) - result := db.Raw(sql, stmt.Vars...).Scan(obj) + result := db.Table(info.TableName).First(obj) + has = result.RowsAffected != 0 err = result.Error - if err != nil { - lxalilog.Errors(err, suffix) - return - } return } func Find(obj IMysqlData, suffix string) (has bool, err error) { info := obj.MysqlInfo(suffix) db := info.DbMysql - stmt := db.Session(&gorm.Session{DryRun: true}).Find(obj).Statement - stmtSQL := stmt.SQL.String() - sql := strings.Replace(stmtSQL, stmt.Table, info.TableName, -1) - result := db.Raw(sql, stmt.Vars...).Scan(obj) + result := db.Table(info.TableName).Find(obj) + has = result.RowsAffected != 0 err = result.Error - if err != nil { - lxalilog.Errors(err, suffix) - return - } return } diff --git a/service-common/svmysql/index.go b/service-common/svmysql/index.go index f389989..e063fee 100644 --- a/service-common/svmysql/index.go +++ b/service-common/svmysql/index.go @@ -6,6 +6,10 @@ import ( "github.com/astaxie/beego" "gorm.io/driver/mysql" "gorm.io/gorm" + "gorm.io/gorm/logger" + "log" + "os" + "time" ) func Init() bool { @@ -34,5 +38,17 @@ func Init() bool { } func ConnectMySQL(dsn string) (db *gorm.DB, err error) { - return gorm.Open(mysql.Open(dsn), &gorm.Config{}) + newLogger := logger.New( + log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer + logger.Config{ + SlowThreshold: time.Second, // Slow SQL threshold + LogLevel: logger.Silent, // Log level + IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger + ParameterizedQueries: true, // Don't include params in the SQL log + Colorful: false, // Disable color + }, + ) + return gorm.Open(mysql.Open(dsn), &gorm.Config{ + Logger: newLogger, + }) } diff --git a/service-common/svmysql/table.go b/service-common/svmysql/table.go deleted file mode 100644 index 88028fe..0000000 --- a/service-common/svmysql/table.go +++ /dev/null @@ -1,137 +0,0 @@ -package svmysql - -import ( - "fmt" - "gorm.io/driver/mysql" - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/migrator" - "strings" -) - -func InitTable(obj IMysqlData, suffix string, notify bool) { - info := obj.MysqlInfo(suffix) - db := info.DbMysql - tableName := info.TableName - m := db.Migrator().(mysql.Migrator).Migrator - queryTx, execTx := m.GetQueryAndExecTx() - if HasTable(queryTx.Migrator().(mysql.Migrator).Migrator, obj, tableName) { - if notify { - fmt.Println(tableName + " exist, skip!") - } - } else { - err := CreateTable(execTx, obj, tableName) - if err != nil { - fmt.Println("err", err) - } - } -} - -func HasTable(m migrator.Migrator, obj any, tableName string) bool { - var count int64 - - m.RunWithValue(obj, func(stmt *gorm.Statement) error { - currentDatabase := m.DB.Migrator().CurrentDatabase() - return m.DB.Raw("SELECT count(*) FROM information_schema.tables WHERE table_schema = ? AND table_name = ? AND table_type = ?", currentDatabase, tableName, "BASE TABLE").Row().Scan(&count) - }) - - return count > 0 -} - -func CreateTable(execTx *gorm.DB, value any, tableName string) error { - m := execTx.Migrator().(mysql.Migrator).Migrator - tx := m.DB.Session(&gorm.Session{}) - - if err := m.RunWithValue(value, func(stmt *gorm.Statement) (err error) { - var ( - createTableSQL = "CREATE TABLE ? (" - values = []interface{}{clause.Table{Name: tableName}} - hasPrimaryKeyInDataType bool - ) - - for _, dbName := range stmt.Schema.DBNames { - field := stmt.Schema.FieldsByDBName[dbName] - if !field.IgnoreMigration { - createTableSQL += "? ?" - hasPrimaryKeyInDataType = hasPrimaryKeyInDataType || strings.Contains(strings.ToUpper(m.DataTypeOf(field)), "PRIMARY KEY") - values = append(values, clause.Column{Name: dbName}, m.DB.Migrator().FullDataTypeOf(field)) - createTableSQL += "," - } - } - - if !hasPrimaryKeyInDataType && len(stmt.Schema.PrimaryFields) > 0 { - createTableSQL += "PRIMARY KEY ?," - primaryKeys := make([]interface{}, 0, len(stmt.Schema.PrimaryFields)) - for _, field := range stmt.Schema.PrimaryFields { - primaryKeys = append(primaryKeys, clause.Column{Name: field.DBName}) - } - - values = append(values, primaryKeys) - } - - for _, idx := range stmt.Schema.ParseIndexes() { - if m.CreateIndexAfterCreateTable { - defer func(value interface{}, name string) { - if err == nil { - err = tx.Migrator().CreateIndex(value, name) - } - }(value, idx.Name) - } else { - if idx.Class != "" { - createTableSQL += idx.Class + " " - } - createTableSQL += "INDEX ? ?" - - if idx.Comment != "" { - createTableSQL += fmt.Sprintf(" COMMENT '%s'", idx.Comment) - } - - if idx.Option != "" { - createTableSQL += " " + idx.Option - } - - createTableSQL += "," - values = append(values, clause.Column{Name: idx.Name}, tx.Migrator().(migrator.BuildIndexOptionsInterface).BuildIndexOptions(idx.Fields, stmt)) - } - } - - if !m.DB.DisableForeignKeyConstraintWhenMigrating && !m.DB.IgnoreRelationshipsWhenMigrating { - for _, rel := range stmt.Schema.Relationships.Relations { - if rel.Field.IgnoreMigration { - continue - } - if constraint := rel.ParseConstraint(); constraint != nil { - if constraint.Schema == stmt.Schema { - sql, vars := constraint.Build() - createTableSQL += sql + "," - values = append(values, vars...) - } - } - } - } - - for _, uni := range stmt.Schema.ParseUniqueConstraints() { - createTableSQL += "CONSTRAINT ? UNIQUE (?)," - values = append(values, clause.Column{Name: uni.Name}, clause.Expr{SQL: stmt.Quote(uni.Field.DBName)}) - } - - for _, chk := range stmt.Schema.ParseCheckConstraints() { - createTableSQL += "CONSTRAINT ? CHECK (?)," - values = append(values, clause.Column{Name: chk.Name}, clause.Expr{SQL: chk.Constraint}) - } - - createTableSQL = strings.TrimSuffix(createTableSQL, ",") - - createTableSQL += ")" - - if tableOption, ok := m.DB.Get("gorm:table_options"); ok { - createTableSQL += fmt.Sprint(tableOption) - } - - err = tx.Exec(createTableSQL, values...).Error - return err - }); err != nil { - return err - } - return nil -} diff --git a/service/cardholder/logic.go b/service/cardholder/logic.go index aa19882..6d76aab 100644 --- a/service/cardholder/logic.go +++ b/service/cardholder/logic.go @@ -196,7 +196,7 @@ func DoOpen(gameId string, // 记录开卡包日志 { recordBase := NewRecordCardHolderBase(player.Uid, sequenceId, cohort, config.Id, player.Details.Round) - _ = svmysql.Insert(NewRecordCardHolderOpen(recordBase, + _ = svmysql.Create(NewRecordCardHolderOpen(recordBase, openMode, utstring.StringToInt(confCardholder.Id), utjson.JsonString(newCards)), gameId) } @@ -245,7 +245,7 @@ func DoOpenCheckAward(gameId string, { // 记录日志 recordBase := NewRecordCardHolderBase(player.Uid, sequenceId, cohort, config.Id, player.Details.Round) - _ = svmysql.Insert(NewRecordCardHolderRewardAlbum(recordBase, + _ = svmysql.Create(NewRecordCardHolderRewardAlbum(recordBase, albumId, award), gameId) } @@ -257,7 +257,7 @@ func DoOpenCheckAward(gameId string, // 记录日志 recordBase := NewRecordCardHolderBase(player.Uid, sequenceId, cohort, config.Id, player.Details.Round) - _ = svmysql.Insert(NewRecordCardHolderRewardRound(recordBase, + _ = svmysql.Create(NewRecordCardHolderRewardRound(recordBase, awardRound), gameId) diff --git a/service/cardholder/player.go b/service/cardholder/player.go index 78b832a..761812d 100644 --- a/service/cardholder/player.go +++ b/service/cardholder/player.go @@ -3,6 +3,7 @@ package cardholder import ( "apigame/configs" "apigame/service-common/svmysql" + "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" ) @@ -11,20 +12,24 @@ func SavePlayer(gameId string, d *DataCardHolder) { d.UpdateTime = lxtime.NowUninx() d.Encode() - _ = svmysql.Save(d, gameId) + err := svmysql.Save(d, gameId) + if err != nil { + lxalilog.Errors(err, "cardholder.SavePlayer error", gameId, d.Uid, d.ActivityId) + } } func _LoadPlayer(gameId string, uid int64) (d *DataCardHolder) { d = NewDataCardHolder(uid) has, err := svmysql.First(d, gameId) - if err != nil { - return - } if has { d.Decode() } else { d.Init(uid) - _ = svmysql.Insert(d, gameId) + err = svmysql.Create(d, gameId) + if err != nil { + lxalilog.Errors(err, "cardholder._LoadPlayer Create error", gameId, d.Uid, d.ActivityId) + return + } } return } diff --git a/service/roomrank/dto-room.go b/service/roomrank/dto-room.go index 67762de..483483f 100644 --- a/service/roomrank/dto-room.go +++ b/service/roomrank/dto-room.go @@ -20,10 +20,6 @@ func (d *DataRoomRankRoom) MysqlInfo(suffix string) *svmysql.MysqlInfo { tableName := svconst.MYSQL_TABLE_S_ROOMRANK_ROOM return &svmysql.MysqlInfo{ DbMysql: svconst.DbCommon, - TableName: tableName + suffix, + TableName: fmt.Sprintf("%s_%s_%d", tableName, suffix, d.ActivityId), } } - -func (d *DataRoomRankRoom) GetSuffix(gameId string) string { - return fmt.Sprintf("%s_%d", gameId, d.ActivityId) -} diff --git a/service/roomrank/player.go b/service/roomrank/player.go index 5975292..6aed144 100644 --- a/service/roomrank/player.go +++ b/service/roomrank/player.go @@ -4,6 +4,7 @@ import ( "apigame/configs" "apigame/models" "apigame/service-common/svmysql" + "apigame/util/util-lx/lxalilog" "apigame/util/util-lx/lxtime" ) @@ -11,19 +12,24 @@ import ( func SavePlayer(gameId string, d *DataRoomRankPlayer) { d.UpdateTime = lxtime.NowUninx() - _ = svmysql.Save(d, gameId) + err := svmysql.Save(d, gameId) + if err != nil { + lxalilog.Errors(err, "roomrank.SavePlayer error", gameId, d.Uid, d.ActivityId) + return + } } func _LoadPlayer(gameId string, uid int64) (d *DataRoomRankPlayer) { d = NewDataRoomRankPlayer(uid) has, err := svmysql.First(d, gameId) - if err != nil { - return - } if has { } else { d.Init(uid) - _ = svmysql.Insert(d, gameId) + err = svmysql.Create(d, gameId) + if err != nil { + lxalilog.Errors(err, "roomrank._LoadPlayer Create error", gameId, d.Uid, d.ActivityId) + return + } } return } diff --git a/service/roomrank/room.go b/service/roomrank/room.go index fe87664..e75f897 100644 --- a/service/roomrank/room.go +++ b/service/roomrank/room.go @@ -7,8 +7,7 @@ import ( ) func tryInitTable(gameId string, d *DataRoomRankRoom) { - suffix := d.GetSuffix(gameId) - svmysql.InitTable(d, suffix, false) + svmysql.InitTable(d, gameId, false) } // SaveRoom 存储数据 @@ -17,21 +16,24 @@ func SaveRoom(gameId string, d *DataRoomRankRoom) { d.UpdateTime = lxtime.NowUninx() - suffix := d.GetSuffix(gameId) - _ = svmysql.Save(d, suffix) + err := svmysql.Save(d, gameId) + if err != nil { + lxalilog.Errors(err, "roomrank.SaveRoom error", gameId, d.Uid, d.ActivityId) + return + } } // LoadRoom 获取数据 外部接口 -func LoadRoom(gameId string, id int64, activityId int64) (d *DataRoomRankRoom) { +func LoadRoom(gameId string, id int64, activityId int64) (d *DataRoomRankRoom, has bool) { d = &DataRoomRankRoom{Id: id, ActivityId: activityId} tryInitTable(gameId, d) - suffix := d.GetSuffix(gameId) - has, err := svmysql.First(d, suffix) + + var err error + has, err = svmysql.First(d, gameId) if err != nil { - return - } - if !has { lxalilog.Errors(err, "roomrank.LoadRoom error", gameId, id, activityId) + return } + return } -- libgit2 0.21.0