dbmysql.go 5.19 KB
package mysql

import (
	"HttpServer/conf"
	"HttpServer/redishandler"
	"common/logger"
	"common/redis"
	"database/sql"
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"os"
	"strconv"
	"time"
)

var (
	m_game_db             *sql.DB
)

type QuerInviteDesc struct {
	Uuid int
	NickName string
	HeadUrl string
	IsFecthed int
}

func InitMysql() error {
	db, err := InitMysqlByConf(conf.GetGameDBConf())
	if err != nil {
		return err
	}
	m_game_db = db
	return nil
}

func InitMysqlByConf(cfg conf.MysqlConf) (*sql.DB, error) {
	url := cfg.User + ":" + cfg.Pwd + "@tcp(" + cfg.Ip + ":" + strconv.Itoa(cfg.Port) + ")/" + cfg.Database + "?charset=utf8"
	db, err := sql.Open("mysql", url)
	if err != nil {
		logger.Notic("Open mysql failed:%v url:%v", err, url)
		return nil, err
	}
	return db, nil
}

func ExcuteCmd(cmd string) error {
	rows, err := m_game_db.Query(cmd)
	if rows != nil {
		defer rows.Close()
	}
	if err != nil {
		logger.Notic("ExcuteCmd Query error:%v cmd:%v", err, cmd)
		return err
	}
	return err
}

func TestClearData(uid int) (int,error) {
	cmd := fmt.Sprintf("select coin from b_user_ext_04 where user_id=%d", uid)

	rows, err := m_game_db.Query(cmd)
	if rows != nil {
		defer rows.Close()
	}
	if err != nil {
		logger.Notic("TestClearData mysql select error:%v", err)
		return 0,err
	}


	var value int
	for rows.Next() {

		err = rows.Scan(&value)
		if err != nil {
			logger.Notic("TestClearData mysql handle result error:%v", err)
			return 0,err
		}
		logger.Info("TestClearData coin=%v",value)

		break
	}
	return value,nil
}

func DoClearData(uuid int) error{
	//先删除十张分表的数据
	for i:=0;i<10;i++ {
		tablename := "b_base_data_0" + strconv.Itoa(i)
		cmd := "DELETE from " + tablename + " where data_uid= " + strconv.Itoa(uuid)
		err := ExcuteCmd(cmd)
		if err != nil {
			logger.Error("DoClearData err=%v,cmd=%v",err,cmd)
			return err
		}
	}
	return nil

}



func QueryAllData(f *os.File) error{

	//先查询十张分表的数据
	for i:=0;i<10;i++ {
		tablename := "b_user_ext_0" + strconv.Itoa(i)
		cmd := "SELECT user_id,lv,exp,login_time from " + tablename
		rows, err := m_game_db.Query(cmd)
		defer func() {
			if rows != nil {
				rows.Close() //可以关闭掉未scan连接一直占用
			}
		}()
		if err != nil {
			logger.Error("Query failed,err:%v", err)
			return err
		}
		for rows.Next() {
			Uid := 0
			Ulv := 0
			Exp := 0
			LoginTime := 0
			err = rows.Scan(&Uid, &Ulv, &Exp,&LoginTime) //不scan会导致连接不释放
			if err != nil {
				logger.Error("Scan failed,err:%v", err)
				return err
			}

			//w := bufio.NewWriter(f)
			if LoginTime <= 1588262400 {
				//5.1之前的不做处理
				continue
			}
			tm := time.Unix(int64(LoginTime), 0)
			//fmt.Println(tm.Format("2006-01-02 15:04:05"))
			str := strconv.Itoa(Uid) + " " + strconv.Itoa(Ulv) + " " + strconv.Itoa(Exp) + " " + tm.Format("2006-01-02 15:04:05") + "\n"
			_,err = f.WriteString(str)
			//logger.Info("ddt str=%v",str)
			if err != nil {
				logger.Error("WRITETOFILEFAILED ERR=%v",err)
				return err
			}
			//fmt.Fprintln(w, str)
			//w.Flush()
		}
	}
	return nil

}


func QueryInvite(uuid int) ([]QuerInviteDesc,error){
	var rtslice []QuerInviteDesc

	//首先取出邀请关系id
	rkey := redis.USER_INVITEREWARD_FETCH_REWARD + ":" + strconv.Itoa(uuid)
	vv,err := redishandler.GetRedisClient().HGetAllKeys(rkey)
	if err != nil {
		logger.Error("QueryInvite err=%v",err)
		return nil,err
	}

	for _,val := range vv {
		var tmp QuerInviteDesc

		bytestr := string(val.([]byte))
		bytenum,_ := strconv.Atoi(bytestr)
		tmp.Uuid =bytenum
		val,err :=redishandler.GetRedisClient().HGet(rkey,bytestr)
		if err != nil {
			tmp.IsFecthed = 1
			logger.Error("QueryInvite failed err=%v",err)
			continue
		}

		stat,_ := strconv.Atoi(val)
		tmp.IsFecthed = stat

		rtslice = append(rtslice,tmp)
	}

	//需要查询对应的数据
	for k,val := range rtslice {
		for i:=0;i<10;i++ {
			tablename := "b_user_ext_0" + strconv.Itoa(i)
			cmd := "SELECT nickname,avatar_url from " + tablename + " where user_id= " + strconv.Itoa(val.Uuid)
			rows, err := m_game_db.Query(cmd)
			defer func() {
				if rows != nil {
					rows.Close() //可以关闭掉未scan连接一直占用
				}
			}()

			if err != nil {
				logger.Error("Query failed,err:%v", err)
				continue
			}
			for rows.Next() {

				err = rows.Scan(&rtslice[k].NickName, &rtslice[k].HeadUrl) //不scan会导致连接不释放
				//logger.Info("QueryInvite rtslice=%v",rtslice)
				if err != nil {
					logger.Error("Scan failed,err:%v", err)
					continue
				}
			}
		}
	}

	return rtslice,nil
}

func QueryNameAndHead(uuid int) (string,string,error) {
	var nickname string
	var headurl string
	for i:=0;i<10;i++ {
		tablename := "b_user_ext_0" + strconv.Itoa(i)
		cmd := "SELECT nickname,avatar_url from " + tablename + " where user_id= " + strconv.Itoa(uuid)
		rows, err := m_game_db.Query(cmd)
		defer func() {
			if rows != nil {
				rows.Close() //可以关闭掉未scan连接一直占用
			}
		}()

		if err != nil {
			logger.Error("Query failed,err:%v", err)
			return "","",err
		}
		for rows.Next() {

			err = rows.Scan(&nickname, &headurl) //不scan会导致连接不释放
			if err != nil {
				logger.Error("Scan failed,err:%v", err)
				return "","",err
			}
		}
	}

	return nickname,headurl,nil
}