Apply .gitignore rules
This commit is contained in:
@@ -0,0 +1,298 @@
|
||||
package fileUtil
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
mutex sync.Mutex
|
||||
)
|
||||
|
||||
// 文件是否存在
|
||||
// 文件路径
|
||||
// 返回值:
|
||||
// 是否存在
|
||||
// 错误对象
|
||||
func IsFileExists(path string) (bool, error) {
|
||||
file, err := os.Stat(path)
|
||||
if err == nil {
|
||||
return file.IsDir() == false, nil
|
||||
} else {
|
||||
if os.IsNotExist(err) {
|
||||
return false, nil
|
||||
}
|
||||
}
|
||||
|
||||
return true, err
|
||||
}
|
||||
|
||||
// 文件夹是否存在
|
||||
// 文件夹路径
|
||||
// 返回值:
|
||||
// 是否存在
|
||||
// 错误对象
|
||||
func IsDirectoryExists(path string) (bool, error) {
|
||||
file, err := os.Stat(path)
|
||||
if err == nil {
|
||||
return file.IsDir(), nil
|
||||
} else {
|
||||
if os.IsNotExist(err) {
|
||||
return false, nil
|
||||
}
|
||||
}
|
||||
|
||||
return true, err
|
||||
}
|
||||
|
||||
// 文件夹是否存在(obsolete)
|
||||
// 文件夹路径
|
||||
// 返回值:
|
||||
// 是否存在
|
||||
func IsDirExists(path string) bool {
|
||||
file, err := os.Stat(path)
|
||||
if err != nil {
|
||||
return false
|
||||
} else {
|
||||
return file.IsDir()
|
||||
}
|
||||
}
|
||||
|
||||
// 获取当前路径
|
||||
// 返回值:
|
||||
// 当前路径
|
||||
func GetCurrentPath() string {
|
||||
file, _ := exec.LookPath(os.Args[0])
|
||||
fileAbsPath, _ := filepath.Abs(file)
|
||||
|
||||
return filepath.Dir(fileAbsPath)
|
||||
}
|
||||
|
||||
// 获取目标文件列表(完整路径)
|
||||
// path:文件夹路径
|
||||
// 返回值:文件列表(完整路径)
|
||||
func GetFileList(path string) (fileList []string, err error) {
|
||||
if exists, err1 := IsDirectoryExists(path); err1 != nil {
|
||||
err = err1
|
||||
return
|
||||
} else if !exists {
|
||||
return
|
||||
}
|
||||
|
||||
// 遍历目录,获取所有文件列表
|
||||
err = filepath.Walk(path, func(fileName string, fi os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 忽略目录
|
||||
if fi.IsDir() {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 添加到列表
|
||||
fileList = append(fileList, fileName)
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// 获取目标文件列表(完整路径)
|
||||
// path:文件夹路径
|
||||
// prefix:文件前缀
|
||||
// suffix:文件后缀
|
||||
// 返回值:文件列表(完整路径)
|
||||
func GetFileList2(path, prefix, suffix string) (fileList []string, err error) {
|
||||
if exists, err1 := IsDirectoryExists(path); err1 != nil {
|
||||
err = err1
|
||||
return
|
||||
} else if !exists {
|
||||
return
|
||||
}
|
||||
|
||||
// 遍历目录,获取所有文件列表
|
||||
err = filepath.Walk(path, func(fileName string, fi os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 忽略目录
|
||||
if fi.IsDir() {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 添加到列表
|
||||
baseName := filepath.Base(fileName)
|
||||
if prefix != "" && strings.HasPrefix(baseName, prefix) == false {
|
||||
return nil
|
||||
}
|
||||
|
||||
if suffix != "" && strings.HasSuffix(baseName, suffix) == false {
|
||||
return nil
|
||||
}
|
||||
|
||||
fileList = append(fileList, fileName)
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// 按行读取每一个文件的内容
|
||||
// fileName:文件的绝对路径
|
||||
// 返回值:
|
||||
// 行内容列表
|
||||
// 错误信息
|
||||
func ReadFileLineByLine(fileName string) (lineList []string, err error) {
|
||||
// 打开文件
|
||||
file, err1 := os.Open(fileName)
|
||||
if err1 != nil {
|
||||
err = err1
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
// 读取文件
|
||||
buf := bufio.NewReader(file)
|
||||
for {
|
||||
// 按行读取
|
||||
line, _, err2 := buf.ReadLine()
|
||||
if err2 == io.EOF {
|
||||
break
|
||||
}
|
||||
|
||||
//将byte[]转换为string,并添加到列表中
|
||||
lineList = append(lineList, string(line))
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// 读取文件内容(字符串)
|
||||
// fileName:文件的绝对路径
|
||||
// 返回值:
|
||||
// 文件内容
|
||||
// 错误信息
|
||||
func ReadFileContent(fileName string) (content string, err error) {
|
||||
bytes, err1 := ioutil.ReadFile(fileName)
|
||||
if err1 != nil {
|
||||
err = err1
|
||||
return
|
||||
}
|
||||
|
||||
content = string(bytes)
|
||||
return
|
||||
}
|
||||
|
||||
// 读取文件内容(字符数组)
|
||||
// fileName:文件的绝对路径
|
||||
// 返回值:
|
||||
// 文件内容
|
||||
// 错误信息
|
||||
func ReadFileBytes(fileName string) (content []byte, err error) {
|
||||
content, err = ioutil.ReadFile(fileName)
|
||||
return
|
||||
}
|
||||
|
||||
// 写入文件
|
||||
// filePath:文件夹路径
|
||||
// fileName:文件名称
|
||||
// ifAppend:是否追加内容
|
||||
// args:可变参数
|
||||
// 返回值:
|
||||
// error:错误信息
|
||||
func WriteFile(filePath, fileName string, ifAppend bool, args ...string) error {
|
||||
// 得到最终的fileName
|
||||
fileName = filepath.Join(filePath, fileName)
|
||||
|
||||
// 判断文件夹是否存在,如果不存在则创建
|
||||
mutex.Lock()
|
||||
if !IsDirExists(filePath) {
|
||||
os.MkdirAll(filePath, os.ModePerm|os.ModeTemporary)
|
||||
}
|
||||
mutex.Unlock()
|
||||
|
||||
// 打开文件(如果文件存在就以写模式打开,并追加写入;如果文件不存在就创建,然后以写模式打开。)
|
||||
var f *os.File
|
||||
var err error
|
||||
if ifAppend == false {
|
||||
f, err = os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm|os.ModeTemporary)
|
||||
} else {
|
||||
f, err = os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm|os.ModeTemporary)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
// 写入内容
|
||||
for _, arg := range args {
|
||||
_, err = f.WriteString(arg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// 写入文件
|
||||
// filePath:文件夹路径
|
||||
// fileName:文件名称
|
||||
// ifAppend:是否追加内容
|
||||
// args:可变参数
|
||||
// 返回值:
|
||||
// error:错误信息
|
||||
func WriteFile4Byte(filePath, fileName string, ifAppend bool, args ...[]byte) error {
|
||||
// 得到最终的fileName
|
||||
fileName = filepath.Join(filePath, fileName)
|
||||
|
||||
// 判断文件夹是否存在,如果不存在则创建
|
||||
mutex.Lock()
|
||||
if !IsDirExists(filePath) {
|
||||
os.MkdirAll(filePath, os.ModePerm|os.ModeTemporary)
|
||||
}
|
||||
mutex.Unlock()
|
||||
|
||||
// 打开文件(如果文件存在就以写模式打开,并追加写入;如果文件不存在就创建,然后以写模式打开。)
|
||||
var f *os.File
|
||||
var err error
|
||||
if ifAppend == false {
|
||||
f, err = os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm|os.ModeTemporary)
|
||||
} else {
|
||||
f, err = os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm|os.ModeTemporary)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
// 写入内容
|
||||
for _, arg := range args {
|
||||
_, err = f.Write(arg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// 删除文件
|
||||
// fileName:文件的绝对路径
|
||||
// 返回值:
|
||||
// 错误对象
|
||||
func DeleteFile(fileName string) error {
|
||||
return os.Remove(fileName)
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package managecenterModel
|
||||
|
||||
import "goutil/stringUtil"
|
||||
|
||||
// 大区对象
|
||||
type Area struct {
|
||||
// 大区Id
|
||||
AreaId int32 `json:"AreaId"`
|
||||
|
||||
//大区名字
|
||||
AreaName string `json:"AreaName"`
|
||||
|
||||
//客户端显示名字
|
||||
ClientName string `json:"ClientName"`
|
||||
|
||||
//区服范围
|
||||
ServerRange string `json:"ServerRange"`
|
||||
|
||||
//资源包下载地址
|
||||
ResourceURL string `json:"ResourceURL"`
|
||||
|
||||
//推荐服开关:0关闭,1:打开
|
||||
RecommendStitch int32 `json:"RecommendStitch"`
|
||||
|
||||
//推荐最大注册人数
|
||||
MaxRegistration int32 `json:"MaxRegistration"`
|
||||
|
||||
//限制注册的开关
|
||||
RegRestrictionSwitch int32 `json:"RegRestrictionSwitch"`
|
||||
|
||||
//玩家数量大于该数量,自动开服
|
||||
AutoOpenServerPlayers int32 `json:"AutoOpenServerPlayers"`
|
||||
|
||||
//大区维护状态(1:正常;2:维护)
|
||||
AreaMaintainStatus int32 `json:"AreaMaintainStatus"`
|
||||
|
||||
//维护消息
|
||||
AreaMaintainMsg string `json:"AreaMaintainMsg"`
|
||||
|
||||
//大区页签集合
|
||||
AreaLabelList []*AreaLabel `json:"AreaLabelList"`
|
||||
}
|
||||
|
||||
//
|
||||
//检测服务器是否在大区的区间范围
|
||||
func (this *Area) CheckServerIdIsInRange(serverId int32) (isVaild bool) {
|
||||
isVaild = false
|
||||
for _, serverRangeItem := range stringUtil.Split(this.ServerRange, []string{","}) {
|
||||
serverRange, _ := stringUtil.SplitToInt32Slice(serverRangeItem, "-")
|
||||
lower := serverRange[0]
|
||||
upper := serverRange[1]
|
||||
|
||||
//如果范围大小顺序不对,则换位
|
||||
if lower > upper {
|
||||
temp := lower
|
||||
lower = upper
|
||||
upper = temp
|
||||
}
|
||||
|
||||
//如果服务器在该大区的任意区服区间,则返回true
|
||||
if serverId >= lower && serverId <= upper {
|
||||
isVaild = true
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
package stringUtil
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// test IsEmpty
|
||||
func TestIsEmpty(t *testing.T) {
|
||||
isOk := IsEmpty("")
|
||||
if isOk == false {
|
||||
t.Error("\"\" test is Not pass")
|
||||
return
|
||||
}
|
||||
|
||||
isOk = IsEmpty(" ")
|
||||
if isOk == false {
|
||||
t.Error("\" \" test is Not pass")
|
||||
return
|
||||
}
|
||||
|
||||
isOk = IsEmpty(" \t\n")
|
||||
if isOk == false {
|
||||
t.Error("\" \\t\\n\" test is Not pass")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func TestSubstr(t *testing.T) {
|
||||
str := "Hello, Jordan.左贤清"
|
||||
substr := Substring(str, 0, 5)
|
||||
expectedstr := "Hello"
|
||||
|
||||
if substr != expectedstr {
|
||||
t.Errorf("Failed. Expected:%s, Got %s\n", expectedstr, substr)
|
||||
}
|
||||
|
||||
substr = Substring(str, 0, 10)
|
||||
expectedstr = "Hello, Jor"
|
||||
|
||||
if substr != expectedstr {
|
||||
t.Errorf("Failed. Expected:%s, Got %s\n", expectedstr, substr)
|
||||
}
|
||||
|
||||
substr = Substring(str, 0, 15)
|
||||
expectedstr = "Hello, Jordan.左"
|
||||
|
||||
if substr != expectedstr {
|
||||
t.Errorf("Failed. Expected:%s, Got %s\n", expectedstr, substr)
|
||||
}
|
||||
|
||||
substr = Substring(str, 0, 20)
|
||||
expectedstr = "Hello, Jordan.左贤清"
|
||||
|
||||
if substr != expectedstr {
|
||||
t.Errorf("Failed. Expected:%s, Got %s\n", expectedstr, substr)
|
||||
}
|
||||
|
||||
guid1 := GetNewGUID()
|
||||
guid2 := GetNewGUID()
|
||||
fmt.Printf("guid1:%s, guid2:%s\n", guid1, guid2)
|
||||
fmt.Printf("length of %s is %d\n", guid1, len(guid1))
|
||||
if guid1 == guid2 {
|
||||
t.Errorf("%s should not be equal with %s", guid1, guid2)
|
||||
}
|
||||
}
|
||||
|
||||
// test 特殊字符
|
||||
func TestIfHaveSpecialChar(t *testing.T) {
|
||||
tstVal := map[string]string{
|
||||
"中文": "你好啊",
|
||||
"繁体中文": "這是什麼天氣",
|
||||
"泰文": "สวัสดีครับ !",
|
||||
"英文": "helloworld",
|
||||
"越南语": "Đó là gì thời tiết.",
|
||||
"日语": "これは何の天気ですか",
|
||||
"标点符号": "!@#$%^^&*())(__+{}[]|:<>",
|
||||
}
|
||||
|
||||
for key, val := range tstVal {
|
||||
if IfHaveSpecialChar(val) {
|
||||
t.Errorf("语言处理错误:%s", key)
|
||||
}
|
||||
}
|
||||
|
||||
specialChar := "\\'\""
|
||||
if IfHaveSpecialChar(specialChar) == false {
|
||||
t.Errorf("特殊字符匹配错误:")
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsDistinct_string(t *testing.T) {
|
||||
list := make([]string, 0, 8)
|
||||
result := IsDistinct_string(list)
|
||||
fmt.Printf("list:%v,result:%v-------1\n", list, result)
|
||||
if result == false {
|
||||
t.Errorf("it's should be true, but now false-------1")
|
||||
}
|
||||
|
||||
list = append(list, "Hello")
|
||||
result = IsDistinct_string(list)
|
||||
fmt.Printf("list:%v,result:%v-------2\n", list, result)
|
||||
if result == false {
|
||||
t.Errorf("it's should be true, but now false-------2")
|
||||
}
|
||||
|
||||
list = append(list, "Hello")
|
||||
result = IsDistinct_string(list)
|
||||
fmt.Printf("list:%v,result:%v-------3\n", list, result)
|
||||
if result {
|
||||
t.Errorf("it's should be false, but now true-------3")
|
||||
}
|
||||
|
||||
list = append(list, "")
|
||||
result = IsDistinct_string(list)
|
||||
fmt.Printf("list:%v,result:%v-------4\n", list, result)
|
||||
if result {
|
||||
t.Errorf("it's should be false, but now true-------4")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
package mysqlUtil
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// 转换数据库连接字符串(从C#->Go)
|
||||
// connString:C#的数据库连接字符串
|
||||
// 返回值:
|
||||
// Go的数据库连接字符串
|
||||
func ConvertConnectionStringFromCSharpToGo(connString string) string {
|
||||
goConnString := "{userid}:{password}@tcp({datasource}:{port})/{database}?charset={charset}&parseTime=true&loc=Local&timeout={timeout}s||MaxOpenConns={MaxOpenConns}||MaxIdleConns={MaxIdleConns}"
|
||||
|
||||
// 将字符串按;进行切割
|
||||
connStringList := strings.Split(connString, ";")
|
||||
var datasource string // DataSource=10.162.2.205;
|
||||
var port string // port=3306;
|
||||
var userid string // UserId=admin;
|
||||
var password string // Password=MOQIkaka$#@!1234;
|
||||
var database string // Database=s201_dzz_log;
|
||||
var charset string // charset=utf8;
|
||||
var pooling string // pooling=true;
|
||||
var minimumpoolsize string // MinimumPoolSize=20; or min pool size=20;
|
||||
var maximumpoolsize string // maximumpoolsize=200; or max pool size=200;
|
||||
var commandtimeout string // command timeout=60;
|
||||
|
||||
// 遍历处理
|
||||
for _, item := range connStringList {
|
||||
// 将字符串按=进行切割
|
||||
subItemList := strings.Split(item, "=")
|
||||
|
||||
// 对每一项进行判断
|
||||
if len(subItemList) != 2 {
|
||||
continue
|
||||
}
|
||||
|
||||
// 先转换为小写字母
|
||||
switch strings.ToLower(subItemList[0]) {
|
||||
case "datasource":
|
||||
datasource = subItemList[1]
|
||||
case "port":
|
||||
port = subItemList[1]
|
||||
case "userid":
|
||||
userid = subItemList[1]
|
||||
case "password":
|
||||
password = subItemList[1]
|
||||
case "database":
|
||||
database = subItemList[1]
|
||||
case "charset":
|
||||
charset = subItemList[1]
|
||||
case "pooling":
|
||||
pooling = subItemList[1]
|
||||
case "minimumpoolsize", "min pool size":
|
||||
minimumpoolsize = subItemList[1]
|
||||
case "maximumpoolsize", "max pool size":
|
||||
maximumpoolsize = subItemList[1]
|
||||
case "command timeout":
|
||||
commandtimeout = subItemList[1]
|
||||
}
|
||||
}
|
||||
|
||||
// 替换占位符
|
||||
goConnString = strings.Replace(goConnString, "{userid}", userid, 1)
|
||||
goConnString = strings.Replace(goConnString, "{password}", password, 1)
|
||||
goConnString = strings.Replace(goConnString, "{datasource}", datasource, 1)
|
||||
goConnString = strings.Replace(goConnString, "{port}", port, 1)
|
||||
goConnString = strings.Replace(goConnString, "{database}", database, 1)
|
||||
goConnString = strings.Replace(goConnString, "{charset}", charset, 1)
|
||||
goConnString = strings.Replace(goConnString, "{timeout}", commandtimeout, 1)
|
||||
if pooling == "true" {
|
||||
goConnString = strings.Replace(goConnString, "{MaxOpenConns}", maximumpoolsize, 1)
|
||||
goConnString = strings.Replace(goConnString, "{MaxIdleConns}", minimumpoolsize, 1)
|
||||
} else {
|
||||
goConnString = strings.Replace(goConnString, "{MaxOpenConns}", "0", 1)
|
||||
goConnString = strings.Replace(goConnString, "{MaxIdleConns}", "0", 1)
|
||||
}
|
||||
|
||||
return goConnString
|
||||
}
|
||||
|
||||
// 解析连接字符串(obsolete,建议使用NewDBConfig2)
|
||||
// connString:数据库连接字符串
|
||||
// 返回值
|
||||
// 有效的连接字符串
|
||||
// 最大开启连接数量
|
||||
// 最大空闲连接数量
|
||||
// 错误对象
|
||||
func ParseConnectionString(connString string) (conn string, maxOpenConns int, maxIdleConns int, err error) {
|
||||
connSlice := strings.Split(connString, "||")
|
||||
length := len(connSlice)
|
||||
if length != 1 && length != 3 {
|
||||
err = fmt.Errorf("connString:%s格式不正确,length:%d", connString, length)
|
||||
return
|
||||
}
|
||||
|
||||
// 获取连接字符串
|
||||
conn = connSlice[0]
|
||||
if conn == "" {
|
||||
err = fmt.Errorf("connString:%s格式不正确,length:%d", connString, length)
|
||||
return
|
||||
}
|
||||
|
||||
// 如果只配置了连接字符串,则MaxOpenConns、MaxIdleConns取默认值
|
||||
if length == 1 {
|
||||
return
|
||||
}
|
||||
|
||||
// 获取连接池相关
|
||||
maxOpenConns_string := strings.Replace(connSlice[1], "MaxOpenConns=", "", 1)
|
||||
maxOpenConns, err = strconv.Atoi(maxOpenConns_string)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("MaxOpenConns必须为int型,连接字符串为:%s", connString)
|
||||
return
|
||||
}
|
||||
|
||||
maxIdleConns_string := strings.Replace(connSlice[2], "MaxIdleConns=", "", 1)
|
||||
maxIdleConns, err = strconv.Atoi(maxIdleConns_string)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("MaxIdleConns必须为int型,连接字符串为:%s", connString)
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// 连接字符串是否为C#格式
|
||||
func IsCSharpStyle(connString string) bool {
|
||||
lowerString := strings.ToLower(connString)
|
||||
if strings.Contains(lowerString, "datasource") && strings.Contains(lowerString, "port") {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// 连接字符串是否为Go格式
|
||||
func IsGoStyle(connString string) bool {
|
||||
lowerString := strings.ToLower(connString)
|
||||
if strings.Contains(lowerString, "@tcp") {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
Reference in New Issue
Block a user