package db import ( "fmt" "reflect" "server/GoUtil" "server/MergeConst" "server/conf" "server/pkg/github.com/name5566/leaf/log" "strings" "sync" "time" // "server/game" _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" ) type user struct { Id int `db:"user_id"` Sex int `db:"sex"` UserName string `db:"username"` Email string `db:"email"` } var SqlDb *sqlx.DB var sqlDbMu sync.Mutex // 封装创建连接 func connectMySQL() (*sqlx.DB, error) { MysqlPwd, _ := GoUtil.Decrypt(conf.Server.MySqlPwd) connect := fmt.Sprintf("%s:%s@(%s:%s)/%s", conf.Server.MySqlUsr, MysqlPwd, conf.Server.MySqlAddr, conf.Server.MySqlPort, conf.Server.DbName) db, err := sqlx.Connect("mysql", connect) if err != nil { return nil, err } db.SetMaxOpenConns(20) return db, nil } func InitDB() { //"用户名:密码@[连接方式](主机名:端口号)/数据库名" db, err := connectMySQL() if err != nil { log.Debug("connect mysql failed: %v", err) return } SqlDb = db log.Debug("connect mysql success") // 定时检测与重连 go func() { ticker := time.NewTicker(time.Second) defer ticker.Stop() for range ticker.C { sqlDbMu.Lock() cur := SqlDb sqlDbMu.Unlock() if cur == nil || cur.Ping() != nil { log.Debug("mysql ping failed, start reconnect") ReconnectDB() } } }() } // 自动重连 func ReconnectDB() { sqlDbMu.Lock() defer sqlDbMu.Unlock() newDb, err := connectMySQL() if err != nil { log.Debug("mysql reconnect failed: %v", err) return } if SqlDb != nil { _ = SqlDb.Close() } SqlDb = newDb log.Debug("mysql reconnect success") } func SeriesTransaction(sqlstrs []string, params [][]any) (err error) { tx, err := SqlDb.Begin() if err != nil { log.Debug("Transaction failed, err:%v\n", err) return err } defer func() { if err != nil { log.Debug("Transaction failed, err:%v\n", err) _ = tx.Rollback() } else { err = tx.Commit() return } }() for i := 0; i < len(sqlstrs); i++ { _, err := tx.Exec(sqlstrs[i], params[i]...) if err != nil { log.Debug("Transaction failed, err:%v\n", err) return err } } return } // 更新数据 func FormatUpdateOneAttrRow(u interface{}, tableName string, UpdateAttr string, Exclude string) (err error) { t := reflect.TypeOf(u) len1 := t.Elem().NumField() Fields := make([]string, len1) Values := make([]interface{}, len1) pp := reflect.ValueOf(u) origin := "UPDATE " + tableName + " SET " index := 0 var keyValue interface{} for i := 0; i < len1; i++ { field := t.Elem().Field(i) if field.Tag.Get("db") != Exclude { if field.Tag.Get("db") == UpdateAttr { Fields[index] = field.Tag.Get("db") + " = ?" ufield := pp.Elem().FieldByName(field.Name) k := ufield.Kind() if k == reflect.String { Values[index] = ufield.String() } if k == reflect.Int32 { Values[index] = ufield.Int() } index++ } } else { ufield := pp.Elem().FieldByName(field.Name) k := ufield.Kind() if k == reflect.String { keyValue = ufield.String() } if k == reflect.Int32 { keyValue = ufield.Int() } } } Values[index] = keyValue // Values = append(Values, keyValue) origin += strings.Join(Fields, ",") strLen := len(origin) origin = origin[:strLen-1] origin = origin + " WHERE " + Exclude + " = ?" sqlStr := origin _, err = SqlDb.Exec(sqlStr, Values...) if err != nil { log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err) return } return } // "UPDATE user SET age = ?, degree = ? WHERE id = ?" func FormatAllMemUpdateDb(u interface{}, tableName string, Exclude string) (err error) { t := reflect.TypeOf(u) len1 := t.Elem().NumField() Fields := make([]string, len1) Values := make([]interface{}, len1) pp := reflect.ValueOf(u) origin := "UPDATE " + tableName + " SET " index := 0 var keyValue interface{} for i := 0; i < len1; i++ { field := t.Elem().Field(i) if field.Tag.Get("db") != Exclude { Fields[index] = "`" + field.Tag.Get("db") + "` = ?" ufield := pp.Elem().FieldByName(field.Name) k := ufield.Kind() if k == reflect.String { Values[index] = ufield.String() } if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 { Values[index] = ufield.Int() } index++ } else { ufield := pp.Elem().FieldByName(field.Name) k := ufield.Kind() if k == reflect.String { keyValue = ufield.String() } if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 { keyValue = ufield.Int() } } } Values[index] = keyValue // Values = append(Values, keyValue) origin += strings.Join(Fields, ",") strLen := len(origin) origin = origin[:strLen-1] origin = origin + " WHERE `" + Exclude + "` = ?" sqlStr := origin _, err = SqlDb.Exec(sqlStr, Values...) if err != nil { log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err) return } return } func FormatAllMemInsertDb(u interface{}, tableName string) (insertID int64, err error) { t := reflect.TypeOf(u) len := t.Elem().NumField() Fields := make([]string, len) Fields1 := make([]string, len) FieldNames := make([]string, len) Values := make([]interface{}, len) pp := reflect.ValueOf(u) origin := "INSERT INTO " + tableName + "(" for i := 0; i < len; i++ { field := t.Elem().Field(i) Fields[i] = field.Tag.Get("db") Fields1[i] = "?" FieldNames[i] = field.Name ufield := pp.Elem().FieldByName(field.Name) k := ufield.Kind() if k == reflect.String { Values[i] = ufield.String() } if k == reflect.Int32 { Values[i] = ufield.Int() } if k == reflect.Int64 { Values[i] = ufield.Int() } } for i := range Fields { Fields[i] = "`" + Fields[i] + "`" } origin += strings.Join(Fields, ",") origin += ") VALUES(" origin += strings.Join(Fields1, ",") origin += ")" sqlStr := origin result, err := SqlDb.Exec(sqlStr, Values...) if err != nil { log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err) return } insertID, err = result.LastInsertId() if err != nil { log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err) return } return } func GetPlayerBaseInfoFromDbByName(name string) *ResPlayerBaseInfo { sqlStr := "SELECT * FROM t_player_baseinfo WHERE user_name = ?" var res ResPlayerBaseInfo if err := SqlDb.Get(&res, sqlStr, name); err != nil { log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err) return nil } return &res } func UpdatePlayerBaseInfoName(oldName, newName string) error { sqlStr := "UPDATE t_player_baseinfo SET user_name = ? WHERE user_name = ?" _, err := SqlDb.Exec(sqlStr, newName, oldName) return err } func GetPlayerBaseInfoFromDbById(id int32) *ResPlayerBaseInfo { sqlStr := "SELECT * FROM t_player_baseinfo WHERE dwUin = ?" var res ResPlayerBaseInfo if err := SqlDb.Get(&res, sqlStr, id); err != nil { log.Debug("table: %s, sql :%s, exec failed, err:%v\n", "PlayerBaseInfo", sqlStr, err) return nil } return &res } func GetAccountInfoFromDb(name string) *Db_Account { sqlStr := "SELECT * FROM t_account WHERE user_name = ?" var res Db_Account if err := SqlDb.Get(&res, sqlStr, name); err != nil { log.Debug("登录的账号不存在:%s", name) return nil } return &res } func UpdateAccountInfoToDb(account *Db_Account) (err error) { _, err = SqlDb.Exec("UPDATE t_account SET user_password = ? WHERE user_name = ?", account.UserPassword, account.UserName) return } func UpdateAccountInfoName(account *Db_Account, newName string) (err error) { _, err = SqlDb.Exec("UPDATE t_account SET user_name = ? WHERE user_name = ?", newName, account.UserName) return } func UpdateAccountInfoDeviceToDb(account *Db_Account) (err error) { _, err = SqlDb.Exec("UPDATE t_account SET device_id = ? WHERE user_name = ?", account.DeviceId, account.UserName) return } func FormatAllMemLoadDb(u interface{}, tableName string, Exclude string) (err error) { t := reflect.TypeOf(u) len := t.Elem().NumField() Fields := make([]string, len) Values := make([]interface{}, len) pp := reflect.ValueOf(u) origin := "SELECT * FROM " + tableName + " WHERE " index := 0 var keyValue interface{} for i := 0; i < len; i++ { field := t.Elem().Field(i) if field.Tag.Get("db") != Exclude { Fields[index] = field.Tag.Get("db") + " = ?" ufield := pp.Elem().FieldByName(field.Name) k := ufield.Kind() if k == reflect.String { Values[index] = ufield.String() } if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 { Values[index] = ufield.Int() } index++ } else { ufield := pp.Elem().FieldByName(field.Name) k := ufield.Kind() if k == reflect.String { keyValue = ufield.String() } if k == reflect.Int32 { keyValue = ufield.Int() } } } Values[index] = keyValue // Values = append(Values, keyValue) origin += strings.Join(Fields, " AND ") sqlStr := origin if err := SqlDb.Get(u, sqlStr, Values...); err != nil { log.Debug("table: %s, sql :%s, exec failed, err:%v\n", tableName, sqlStr, err) return err } return } func GetServerData(d interface{}, Key string) (err error) { sql := "select * from t_server_mod where `key` = ?" err = SqlDb.Get(d, sql, Key) return } func SaveServerData(data *SqlServerModStruct) error { sql := "update t_server_mod set `mData` = ? , `updateTime` = ? where `key` = ?" _, err := SqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key) return err } func InsertServerData(data *SqlServerModStruct) error { sql := "insert into t_server_mod (`mData` , `updateTime` ,`key`) Values (?,?,?)" _, err := SqlDb.Exec(sql, data.ModData, data.UpdataTime, data.Key) return err } func SavePlayerModData(data *SqlModStruct) error { sql := "INSERT INTO `t_player_mod` (`mData` , `updateTime` ,`dwUin`) Values (?,?,?) ON DUPLICATE KEY UPDATE `mData` = ? , `updateTime` = ? " _, err := SqlDb.Exec(sql, data.ModData, data.UpdataTime, data.DwUin, data.ModData, data.UpdataTime) return err } func InsertPlayerModData(data *SqlModStruct) error { sql := "insert into t_player_mod (`mData` , `updateTime` ,`dwUin`) Values (?,?,?)" _, err := SqlDb.Exec(sql, data.ModData, data.UpdataTime, data.DwUin) return err } func SavePlayerClientData(data *SqlModStruct) error { sql := "INSERT INTO `t_player_client_data` (`mData` , `updateTime` ,`dwUin`) Values (?,?,?) ON DUPLICATE KEY UPDATE `mData` = ? , `updateTime` = ? " _, err := SqlDb.Exec(sql, data.ModData, data.UpdataTime, data.DwUin, data.ModData, data.UpdataTime) return err } func GetPlayerClientData(d interface{}, Key string) (err error) { sql := "select * from t_server_mod where `dwUin` = ?" err = SqlDb.Get(d, sql, Key) return } func InsertData(u interface{}, tableName string) (insertID int64, err error) { t := reflect.TypeOf(u) len := t.Elem().NumField() Fields := make([]string, 0) Fields1 := make([]string, 0) Values := make([]interface{}, 0) pp := reflect.ValueOf(u) origin := "INSERT INTO " + tableName + "(" for i := 0; i < len; i++ { field := t.Elem().Field(i) if field.Tag.Get("db") == "id" { continue } ufield := pp.Elem().FieldByName(field.Name) k := ufield.Kind() if k == reflect.String && ufield.String() == "" { continue } if (k == reflect.Int32 || k == reflect.Int || k == reflect.Int64) && ufield.Int() == 0 { continue } if k == reflect.String { Values = append(Values, ufield.String()) } if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 { Values = append(Values, ufield.Int()) } Fields = append(Fields, field.Tag.Get("db")) Fields1 = append(Fields1, "?") } for i := range Fields { Fields[i] = "`" + Fields[i] + "`" } origin += strings.Join(Fields, ",") origin += ") VALUES(" origin += strings.Join(Fields1, ",") origin += ")" sqlStr := origin result, err := SqlDb.Exec(sqlStr, Values...) if err != nil { log.Debug("InsertData exec failed, sql : %s ;err:%v\n", sqlStr, err) return } insertID, err = result.LastInsertId() if err != nil { log.Debug("InsertData exec failed, err:%v\n", err) return } return } func UpdateData(u interface{}, tableName string, Exclude string) (err error) { t := reflect.TypeOf(u) len1 := t.Elem().NumField() Fields := make([]string, 0) Values := make([]interface{}, 0) pp := reflect.ValueOf(u) origin := "UPDATE " + tableName + " SET " var ExcludeValue interface{} for i := 0; i < len1; i++ { field := t.Elem().Field(i) ufield := pp.Elem().FieldByName(field.Name) k := ufield.Kind() if field.Tag.Get("db") != Exclude && field.Tag.Get("db") != "id" { if k == reflect.String { Values = append(Values, ufield.String()) } if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 { Values = append(Values, ufield.Int()) } Fields = append(Fields, "`"+field.Tag.Get("db")+"` = ?") } if field.Tag.Get("db") == Exclude { if k == reflect.String { ExcludeValue = ufield.String() } if k == reflect.Int32 || k == reflect.Int || k == reflect.Int64 { ExcludeValue = append(Values, ufield.Int()) } } } Values = append(Values, ExcludeValue) origin += strings.Join(Fields, ",") origin = origin + " WHERE `" + Exclude + "` = ?" sqlStr := origin _, err = SqlDb.Exec(sqlStr, Values...) if err != nil { log.Debug("update failed, sql %s err:%v\n", sqlStr, err) return } return } func GetServerMailData(data *[]*SqlServerMailStruct) error { sql := "select * from system_mail_info" err := SqlDb.Select(data, sql) return err } func CreateOrderSn(Uid, ChargeId int, OrderSn, Platform, Channel string, Price float64, Currency, Extra string) error { sql := "insert into t_player_charge (`Uid`,`OrderId`, `ProductId`, `Price`,`Currency`, `CreateTime`, `PayPlatform`, `PayChannel`, `PayChannelExtra`) Values (?,?,?,?,?,?,?,?,?)" Now := GoUtil.Now() _, err := SqlDb.Exec(sql, Uid, OrderSn, ChargeId, Price, Currency, Now, Platform, Channel, Extra) return err } func GetPlayerChargeData(OrderSn string) (*SqlChargeOrderStruct, error) { sql := "select * from t_player_charge where OrderId = ?" data := &SqlChargeOrderStruct{} err := SqlDb.Get(data, sql, OrderSn) return data, err } func GetPlayerChargeDataList(Uid int) ([]*SqlChargeOrderStruct, error) { sql := "select * from t_player_charge where Uid = ? and PayStatus = ?" data := &[]*SqlChargeOrderStruct{} err := SqlDb.Select(data, sql, Uid, MergeConst.ORDER_STATUS_PAY) return *data, err } func GetPlayerPayChannelOrderId(OrderSn string) (*SqlChargeOrderStruct, error) { sql := "select * from t_player_charge where PayChannelOrderId = ?" data := &SqlChargeOrderStruct{} err := SqlDb.Get(data, sql, OrderSn) return data, err } func UpdatePlayerChargeData(data *SqlChargeOrderStruct) error { sql := "update t_player_charge set PayTime = ?, PayStatus = ?, PayChannelOrderId = ? where OrderId = ?" _, err := SqlDb.Exec(sql, data.PayTime, data.PayStatus, data.PayChannelOrderId, data.OrderId) return err } func SearchPlayer(key string) ([]*ResPlayerBaseInfo, error) { sql := "select * from t_player_baseinfo where nick_name like ? limit 10" data := &[]*ResPlayerBaseInfo{} err := SqlDb.Select(data, sql, "%"+key+"%") return *data, err }