dbmysql.go 3.59 KB
package mysql

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

var (
	m_game_db *sql.DB
)

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 GetFromBackUp(uniqueid string) (error, string, string, string, bool) {
	isfind := false
	cmd := "select info,task,achieve from starstar where uid = '" + uniqueid + "'"
	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 err, "", "", "", isfind
	}
	var info, task, ach string
	for rows.Next() {

		err = rows.Scan(&info, &task, &ach)
		if err != nil {
			logger.Notic("GetFromBackUp mysql handle result error:%v", err)
			return err, "", "", "", isfind
		}

		isfind = true
		logger.Info("GetFromBackUp uniqueid=%v", uniqueid)

		break
	}

	return nil, info, task, ach, isfind
}