dbmysql.go 2.93 KB
package mysql

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

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 checkFileIsExist(filename string) bool {
	var exist = true
	if _, err := os.Stat(filename); os.IsNotExist(err) {
		exist = false
	}
	return exist
}

func QueryAllData() error{
	//先打开文件
	filename := "./data.txt"
	var f *os.File
//	var err1 error
	if checkFileIsExist(filename) { //如果文件存在
		f, _ = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件
	} else {
		f, _ = os.Create(filename) //创建文件
	}
	//先查询十张分表的数据
	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)

			str := string(Uid) + " " + string(Ulv) + " " + string(Exp) + " " + string(LoginTime)
			fmt.Fprintln(w, str)
			w.Flush()
		}
	}
	return nil

}