[ Agent ] [ App ] - ingress front backend srs

This commit is contained in:
zeaslity
2023-12-06 09:53:21 +08:00
parent 386812625e
commit 46c9668ce6
7 changed files with 415 additions and 337 deletions

View File

@@ -3,12 +3,9 @@ package executor
import (
"fmt"
"net"
"os"
"path/filepath"
"regexp"
"sort"
"strconv"
"strings"
"time"
)
@@ -59,9 +56,9 @@ func (op *AgentOsOperator) Deploy(appFuncName string, funcArgs ...string) (bool,
case "DEPLOY_K8S_MYSQL":
resultOK, result = op.deployMySQL(funcArgs)
break
case "LOAD_MYSQL_INIT_SCRIPT":
resultOK, result = op.loadMysqlInitScript(funcArgs)
break
//case "LOAD_MYSQL_INIT_SCRIPT":
// resultOK, result = op.loadMysqlInitScript(funcArgs)
// break
case "checkMySQL":
resultOK, result = op.checkMySQL(funcArgs)
break
@@ -499,95 +496,95 @@ func (op *AgentOsOperator) deployMySQL(funcArgs []string) (bool, []string) {
}
}
func (op *AgentOsOperator) loadMysqlInitScript(funcArgs []string) (bool, []string) {
folder, i := CheckAppInstallFolder()
if !folder {
return false, i
}
// download offline sql list
if len(funcArgs) <= 7 {
return false, []string{
"[loadMysqlInitScript]- MySQL初始化参数有误 无法进行初始化",
}
}
jackeyLove := funcArgs[7]
if !strings.HasSuffix(jackeyLove, "tar") {
return false, []string{
"[loadMysqlInitScript]- jackeyLove 有误!",
}
}
log.DebugF("[loadMysqlInitScript] - start to load jackeyLove file from %s", jackeyLove)
jackeyLoveLocalPrefix := "/root/wdd/jackeylove/"
PureResultSingleExecute([]string{
"rm",
"-f",
jackeyLoveLocalPrefix,
})
BasicCreateFolder(jackeyLoveLocalPrefix)
jackeyLoveFolder := strings.Split(jackeyLove, ".tar")[0]
ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+jackeyLove, jackeyLoveLocalPrefix+jackeyLove)
if !ok {
return false, append(resultLog, "[loadMysqlInitScript]- jackeyLove 下载失败!")
}
// unzip
if !PureResultSingleExecute([]string{
"tar",
"-vxf",
jackeyLoveLocalPrefix + jackeyLove,
"-C",
jackeyLoveLocalPrefix,
}) {
return false, []string{
"[loadMysqlInitScript]- jackeyLove unzip error ",
}
}
// list all sql file and sort and convert to []string
files, err := os.ReadDir(jackeyLoveLocalPrefix + jackeyLoveFolder)
if err != nil {
return false, []string{
"[loadMysqlInitScript]- read unzipped jackeylove error ",
}
}
var jackeyLoveFileList []string
for _, file := range files {
if !file.IsDir() && filepath.Ext(file.Name()) == ".sql" {
jackeyLoveFileList = append(jackeyLoveFileList, file.Name())
}
}
// sort for numeric order
sortFileNames(jackeyLoveFileList)
var jackeyLoveFileAbsolutePath []string
for _, jackeyLoveFile := range jackeyLoveFileList {
jackeyLoveFileAbsolutePath = append(jackeyLoveFileAbsolutePath, jackeyLoveLocalPrefix+jackeyLoveFolder+string(os.PathSeparator)+jackeyLoveFile)
}
log.InfoF("[loadMysqlInitScript] - all jackey love files are => %v", jackeyLoveFileAbsolutePath)
// dispatch mysql execution command
jackeyLoveIP := funcArgs[0]
parseIP := net.ParseIP(jackeyLoveIP)
if parseIP == nil {
return false, []string{
"[loadMysqlInitScript]- ip config error ",
}
}
load, result := MysqlSqlFileLoad(jackeyLoveIP, jackeyLoveFileAbsolutePath)
if !load {
return false, result
}
return true, append(jackeyLoveFileAbsolutePath, "[loadMysqlInitScript] - execute success !")
}
//func (op *AgentOsOperator) loadMysqlInitScript(funcArgs []string) (bool, []string) {
//
// folder, i := CheckAppInstallFolder()
// if !folder {
// return false, i
// }
//
// // download offline sql list
// if len(funcArgs) <= 7 {
// return false, []string{
// "[loadMysqlInitScript]- MySQL初始化参数有误 无法进行初始化",
// }
// }
//
// jackeyLove := funcArgs[7]
// if !strings.HasSuffix(jackeyLove, "tar") {
// return false, []string{
// "[loadMysqlInitScript]- jackeyLove 有误!",
// }
// }
// log.DebugF("[loadMysqlInitScript] - start to load jackeyLove file from %s", jackeyLove)
//
// jackeyLoveLocalPrefix := "/root/wdd/jackeylove/"
// PureResultSingleExecute([]string{
// "rm",
// "-f",
// jackeyLoveLocalPrefix,
// })
// BasicCreateFolder(jackeyLoveLocalPrefix)
//
// jackeyLoveFolder := strings.Split(jackeyLove, ".tar")[0]
// ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+jackeyLove, jackeyLoveLocalPrefix+jackeyLove)
// if !ok {
// return false, append(resultLog, "[loadMysqlInitScript]- jackeyLove 下载失败!")
// }
//
// // unzip
// if !PureResultSingleExecute([]string{
// "tar",
// "-vxf",
// jackeyLoveLocalPrefix + jackeyLove,
// "-C",
// jackeyLoveLocalPrefix,
// }) {
// return false, []string{
// "[loadMysqlInitScript]- jackeyLove unzip error ",
// }
// }
//
// // list all sql file and sort and convert to []string
// files, err := os.ReadDir(jackeyLoveLocalPrefix + jackeyLoveFolder)
// if err != nil {
// return false, []string{
// "[loadMysqlInitScript]- read unzipped jackeylove error ",
// }
// }
//
// var jackeyLoveFileList []string
// for _, file := range files {
// if !file.IsDir() && filepath.Ext(file.Name()) == ".sql" {
// jackeyLoveFileList = append(jackeyLoveFileList, file.Name())
// }
// }
//
// // sort for numeric order
// sortFileNames(jackeyLoveFileList)
// var jackeyLoveFileAbsolutePath []string
// for _, jackeyLoveFile := range jackeyLoveFileList {
// jackeyLoveFileAbsolutePath = append(jackeyLoveFileAbsolutePath, jackeyLoveLocalPrefix+jackeyLoveFolder+string(os.PathSeparator)+jackeyLoveFile)
// }
//
// log.InfoF("[loadMysqlInitScript] - all jackey love files are => %v", jackeyLoveFileAbsolutePath)
//
// // dispatch mysql execution command
// jackeyLoveIP := funcArgs[0]
// parseIP := net.ParseIP(jackeyLoveIP)
// if parseIP == nil {
// return false, []string{
// "[loadMysqlInitScript]- ip config error ",
// }
// }
// load, result := MysqlSqlFileLoad(jackeyLoveIP, jackeyLoveFileAbsolutePath)
// if !load {
// return false, result
// }
//
// return true, append(jackeyLoveFileAbsolutePath, "[loadMysqlInitScript] - execute success !")
//
//}
func sortFileNames(fileNames []string) {
re := regexp.MustCompile(`(\d+)_`)
@@ -741,6 +738,8 @@ func (op *AgentOsOperator) deployRedis(funcArgs []string) (bool, []string) {
}
}
// todo should I check ingress exists ?
// 成功启动
return true, []string{
"Redis 部署成功!",
@@ -750,15 +749,12 @@ func (op *AgentOsOperator) deployRedis(funcArgs []string) (bool, []string) {
func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) {
ingressTemplate := "ingress-template.yaml"
ingressTemplate := "k8s-ingress-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署 Ingress !")
// 环境判定
commandExist, commandName := BasicCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
if !BasicCommandExistByPath("kubectl") {
result = append(result, "命令不存在", "kubectl")
return false, result
}
folder, i := CheckAppInstallFolder()
@@ -767,37 +763,38 @@ func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) {
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + ingressTemplate,
}) {
result = append(result, "下载模板文件")
return false, result
k8sIngressYamlFile := "/root/wdd/install/k8s-ingress.yaml"
ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+ingressTemplate, k8sIngressYamlFile)
if !ok {
return false, resultLog
}
// 根据参数 A1C2IP 替换
if !BasicReplace(ingressTemplate, "SUPREME", funcArgs[0]) {
result = append(result, "替换SUPREME信息")
return false, result
parseIP := net.ParseIP(funcArgs[0])
if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(ingressTemplate, "A1C2IP", funcArgs[1]) {
if !BasicReplace(k8sIngressYamlFile, "A1C2IP", funcArgs[0]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
if !BasicReplace(ingressTemplate, "A1C1JS", funcArgs[1]) {
if !BasicReplace(k8sIngressYamlFile, "SUPREME", funcArgs[1]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BasicReplace(k8sIngressYamlFile, "A1C1JS", funcArgs[4]) {
result = append(result, "替换A1C1JS信息")
return false, result
}
if !BasicReplace(k8sIngressYamlFile, "KIMMY", funcArgs[6]) {
result = append(result, "替换KIMMY信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
ingressTemplate,
}) {
result = append(result, "创建 Ingress 失败!")
return false, result
exec, strings := KubectlApplyExec(k8sIngressYamlFile)
if !exec {
return false, append(result, strings...)
}
// 成功启动
@@ -808,15 +805,12 @@ func (op *AgentOsOperator) deployIngress(funcArgs []string) (bool, []string) {
func (op *AgentOsOperator) deployFront(funcArgs []string) (bool, []string) {
fontTemplate := "front-template.yaml"
fontTemplate := "k8s-front-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署 前端服务 !")
// 环境判定
commandExist, commandName := BasicCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
if !BasicCommandExistByPath("kubectl") {
result = append(result, "命令不存在", "kubectl")
return false, result
}
folder, i := CheckAppInstallFolder()
@@ -825,35 +819,38 @@ func (op *AgentOsOperator) deployFront(funcArgs []string) (bool, []string) {
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + fontTemplate,
}) {
result = append(result, "下载模板文件")
k8sFrontYamlFilePath := "/root/wdd/install/k8s-front.yaml"
ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+fontTemplate, k8sFrontYamlFilePath)
if !ok {
return false, resultLog
}
// 根据参数 A1C2IP 替换
parseIP := net.ParseIP(funcArgs[0])
if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(k8sFrontYamlFilePath, "A1C2IP", funcArgs[0]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
// 根据参数 A1C2IP 替换
if !BasicReplace(fontTemplate, "SUPREME", funcArgs[0]) {
if !BasicReplace(k8sFrontYamlFilePath, "SUPREME", funcArgs[1]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BasicReplace(fontTemplate, "A1C2IP", funcArgs[1]) {
result = append(result, "替换A1C2IP信息")
if !BasicReplace(k8sFrontYamlFilePath, "KIMMY", funcArgs[6]) {
result = append(result, "替换KIMMY信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
fontTemplate,
}) {
result = append(result, "创建 前端服务 失败!")
return false, result
exec, strings := KubectlApplyExec(k8sFrontYamlFilePath)
if !exec {
return false, append(result, strings...)
}
// check all front end pod exits!
// 成功启动
return true, []string{
"前端服务 部署成功!",
@@ -893,12 +890,20 @@ func (op *AgentOsOperator) initMinio(funcArgs []string) (bool, []string) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BasicReplace(initMinioTemplate, "A1C2IP", funcArgs[1]) {
parseIP := net.ParseIP(funcArgs[0])
if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(initMinioTemplate, "A1C2IP", funcArgs[0]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
if !BasicReplace(initMinioTemplate, "M2D2IP", funcArgs[1]) {
result = append(result, "替换A1C2IP信息")
parseIP = net.ParseIP(funcArgs[5])
if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(initMinioTemplate, "M2D2IP", funcArgs[5]) {
result = append(result, "替换M2D2IP信息")
return false, result
}
@@ -922,15 +927,12 @@ func (op *AgentOsOperator) initMinio(funcArgs []string) (bool, []string) {
func (op *AgentOsOperator) deploySRS(funcArgs []string) (bool, []string) {
srsTemplate := "srs-template.yaml"
srsTemplate := "k8s-srs-template.yaml"
result := append(AppExecuteErrorLogPrefix, "开始部署SRS服务")
// 环境判定
commandExist, commandName := BasicCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
if !BasicCommandExistByPath("kubectl") {
result = append(result, "命令不存在", "kubectl")
return false, result
}
folder, i := CheckAppInstallFolder()
@@ -939,43 +941,51 @@ func (op *AgentOsOperator) deploySRS(funcArgs []string) (bool, []string) {
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + srsTemplate,
}) {
result = append(result, "下载模板文件")
return false, result
k8sSRSYamlFilePath := "/root/wdd/install/k8s-srs.yaml"
ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+srsTemplate, k8sSRSYamlFilePath)
if !ok {
return false, resultLog
}
// 根据参数 A1C2IP 替换
if !BasicReplace(srsTemplate, "SUPREME", funcArgs[0]) {
if !BasicReplace(k8sSRSYamlFilePath, "SUPREME", funcArgs[1]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BasicReplace(srsTemplate, "A1C2IP", funcArgs[1]) {
parseIP := net.ParseIP(funcArgs[0])
if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(k8sSRSYamlFilePath, "A1C2IP", funcArgs[0]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
if !BasicReplace(srsTemplate, "A1C1JS", funcArgs[1]) {
if !BasicReplace(k8sSRSYamlFilePath, "A1C1JS", funcArgs[4]) {
result = append(result, "替换A1C1JS信息")
return false, result
}
if !BasicReplace(srsTemplate, "M2D2IP", funcArgs[1]) {
parseIP = net.ParseIP(funcArgs[5])
if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(k8sSRSYamlFilePath, "M2D2IP", funcArgs[5]) {
result = append(result, "替换M2D2IP信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
srsTemplate,
}) {
result = append(result, "部署 SRS 失败!")
if !BasicReplace(k8sSRSYamlFilePath, "KIMMY", funcArgs[6]) {
result = append(result, "替换KIMMY信息")
return false, result
}
// 启动服务
exec, strings := KubectlApplyExec(k8sSRSYamlFilePath)
if !exec {
return false, append(result, strings...)
}
// check pod ok
// 成功启动
return true, []string{
"部署 SRS 成功!",
@@ -1008,48 +1018,52 @@ func (op *AgentOsOperator) modifyNacos(funcArgs []string) (bool, []string) {
func (op *AgentOsOperator) deployBackend(funcArgs []string) (bool, []string) {
backendTemplate := "backend-template.yaml"
backendTemplate := "k8s-backend-template.yaml"
result := append(AppExecuteErrorLogPrefix, "部署 后端 服务 !")
// 环境判定
commandExist, commandName := BasicCommandExistsBatch([]string{
"kubectl",
})
if !commandExist {
result = append(result, "命令不存在", commandName)
if !BasicCommandExistByPath("kubectl") {
result = append(result, "命令不存在", "kubectl")
return false, result
}
folder, i := CheckAppInstallFolder()
if !folder {
return false, i
}
// 下载模板文件
if !PureResultSingleExecute([]string{
"wget",
"-q",
op.OssOfflinePrefix + "/" + backendTemplate,
}) {
result = append(result, "下载模板文件")
k8sBackendYamlFilePath := "/root/wdd/install/k8s-backend.yaml"
ok, resultLog := BasicDownloadFile(op.OssOfflinePrefix+backendTemplate, k8sBackendYamlFilePath)
if !ok {
return false, resultLog
}
// 根据参数 A1C2IP 替换
parseIP := net.ParseIP(funcArgs[0])
if parseIP == nil {
return false, append(result, "ip args error !")
}
if !BasicReplace(k8sBackendYamlFilePath, "A1C2IP", funcArgs[0]) {
result = append(result, "替换A1C2IP信息")
return false, result
}
// 根据参数 A1C2IP 替换
if !BasicReplace(backendTemplate, "SUPREME", funcArgs[0]) {
if !BasicReplace(k8sBackendYamlFilePath, "SUPREME", funcArgs[1]) {
result = append(result, "替换SUPREME信息")
return false, result
}
if !BasicReplace(backendTemplate, "A1C2IP", funcArgs[1]) {
result = append(result, "替换A1C2IP信息")
if !BasicReplace(k8sBackendYamlFilePath, "KIMMY", funcArgs[6]) {
result = append(result, "替换KIMMY信息")
return false, result
}
// 启动服务
if !PureResultSingleExecute([]string{
"kubectl",
"apply",
"-f",
backendTemplate,
}) {
result = append(result, "创建 后端服务 失败!")
return false, result
exec, strings := KubectlApplyExec(k8sBackendYamlFilePath)
if !exec {
return false, append(result, strings...)
}
// check all front end pod exits!
// 成功启动
return true, []string{
"后端服务 部署成功!",

View File

@@ -222,6 +222,7 @@ func BasicPrettyPrint(resultOk bool, resultLog []string) {
}
for _, s := range resultLog {
fmt.Println(s)
fmt.Println()
}
}

View File

@@ -1,127 +1,183 @@
package executor
import (
"bufio"
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"os"
"strings"
)
//import (
// _ "github.com/go-sql-driver/mysql"
//)
func MysqlSqlFileLoad(jackeyLoveIp string, jackeyLoveFileList []string) (bool, []string) {
//func MysqlSqlFileLoad(jackeyLoveIp string, jackeyLoveFileList []string) (bool, []string) {
//
// dsn := "root:QzfXQhd3bQ@tcp(" + jackeyLoveIp + ":33306)/"
// db, err := sql.Open("mysql", dsn)
// if err != nil {
// errConnect := fmt.Sprintf("[MysqlSqlFileLoad]- mysql connection error ! please check ! => %s error is %s ", dsn, err.Error())
// log.Error(errConnect)
// return false, []string{
// errConnect,
// }
// }
// defer db.Close()
//
// // 确保数据库连接是有效的
// if err := db.Ping(); err != nil {
// errConnect := "[MysqlSqlFileLoad]- mysql ping error ! please check !"
// log.Error(errConnect)
// return false, []string{
// errConnect,
// }
// }
//
// for _, jackeyLoveFile := range jackeyLoveFileList {
//
// // 打开 SQL 文件
// jackeyLove, err := os.Open(jackeyLoveFile)
// if err != nil {
// log.ErrorF("[MysqlSqlFileLoad] - failed to load jackeyLoveFile => %s", jackeyLove.Name())
// }
// defer jackeyLove.Close()
//
// // 逐行读取 SQL 文件并执行
// query := ""
// delimiterSwitched := false
// scanner := bufio.NewScanner(jackeyLove)
// for scanner.Scan() {
// sqlStatement := scanner.Text()
//
// if strings.HasPrefix(strings.TrimSpace(sqlStatement), "DELIMITER") {
// delimiterSwitched = true
// continue
// }
// if delimiterSwitched {
// if strings.TrimSpace(sqlStatement) == "" || strings.TrimSpace(sqlStatement) == ";" {
// delimiterSwitched = false
// // 替换自定义分隔符为 ;
// sqlStatement = strings.ReplaceAll(sqlStatement, ";;", ";")
// } else {
// // 忽略自定义分隔符行
// continue
// }
// }
//
// // 这里可以添加逻辑来忽略空行或注释行
// if sqlStatement == "" || sqlStatement[:2] == "--" || sqlStatement[:2] == "/*" {
// continue
// }
//
// query += sqlStatement
//
// if strings.HasSuffix(strings.TrimSpace(sqlStatement), ";") {
//
// fmt.Printf("%s -> %s", jackeyLoveFile, query)
//
// _, err := db.Exec(query)
// if err != nil {
// executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 执行出错: %s, 错误信息: %s", jackeyLove.Name(), sqlStatement, err.Error())
// log.Error(executeError)
// return false, []string{
// executeError,
// }
// }
// query = ""
// } else {
// query += " " // 添加空格以便连接多行语句
// }
// }
//
// // 检查扫描过程中是否有错误
// if err := scanner.Err(); err != nil {
// executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 文件加载错误! 错误信息: %s", jackeyLove.Name(), err.Error())
// log.Error(executeError)
// return false, []string{
// executeError,
// }
// }
// log.DebugF("[MysqlSqlFileLoad] - jackeyLoveFile %s execute success !", jackeyLove.Name())
// }
//
// return true, append(jackeyLoveFileList, "[MysqlSqlFileLoad] all file loaded !")
//}
dsn := "root:QzfXQhd3bQ@tcp(" + jackeyLoveIp + ":33306)/"
db, err := sql.Open("mysql", dsn)
if err != nil {
errConnect := fmt.Sprintf("[MysqlSqlFileLoad]- mysql connection error ! please check ! => %s error is %s ", dsn, err.Error())
log.Error(errConnect)
return false, []string{
errConnect,
}
}
defer db.Close()
// 确保数据库连接是有效的
if err := db.Ping(); err != nil {
errConnect := "[MysqlSqlFileLoad]- mysql ping error ! please check !"
log.Error(errConnect)
return false, []string{
errConnect,
}
}
for _, jackeyLoveFile := range jackeyLoveFileList {
// 打开 SQL 文件
jackeyLove, err := os.Open(jackeyLoveFile)
if err != nil {
log.ErrorF("[MysqlSqlFileLoad] - failed to load jackeyLoveFile => %s", jackeyLove.Name())
}
defer jackeyLove.Close()
// 逐行读取 SQL 文件并执行
query := ""
delimiterSwitched := false
scanner := bufio.NewScanner(jackeyLove)
for scanner.Scan() {
sqlStatement := scanner.Text()
if strings.HasPrefix(strings.TrimSpace(sqlStatement), "DELIMITER") {
delimiterSwitched = true
continue
}
if delimiterSwitched {
if strings.TrimSpace(sqlStatement) == "" || strings.TrimSpace(sqlStatement) == ";" {
delimiterSwitched = false
// 替换自定义分隔符为 ;
sqlStatement = strings.ReplaceAll(sqlStatement, ";;", ";")
} else {
// 忽略自定义分隔符行
continue
}
}
// 这里可以添加逻辑来忽略空行或注释行
if sqlStatement == "" || sqlStatement[:2] == "--" || sqlStatement[:2] == "/*" {
continue
}
query += sqlStatement
if strings.HasSuffix(strings.TrimSpace(sqlStatement), ";") {
fmt.Printf("%s -> %s", jackeyLoveFile, query)
_, err := db.Exec(query)
if err != nil {
executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 执行出错: %s, 错误信息: %s", jackeyLove.Name(), sqlStatement, err.Error())
log.Error(executeError)
return false, []string{
executeError,
}
}
query = ""
} else {
query += " " // 添加空格以便连接多行语句
}
}
// 检查扫描过程中是否有错误
if err := scanner.Err(); err != nil {
executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 文件加载错误! 错误信息: %s", jackeyLove.Name(), err.Error())
log.Error(executeError)
return false, []string{
executeError,
}
}
log.DebugF("[MysqlSqlFileLoad] - jackeyLoveFile %s execute success !", jackeyLove.Name())
}
return true, append(jackeyLoveFileList, "[MysqlSqlFileLoad] all file loaded !")
}
func MySqlConnection(jackeyLoveIp string, jackeyLovePort string) (bool, []string) {
dsn := "root:QzfXQhd3bQ@tcp(" + jackeyLoveIp + ":33306)/"
db, err := sql.Open("mysql", dsn)
if err != nil {
errConnect := fmt.Sprintf("[MysqlSqlFileLoad]- mysql connection error ! please check ! => %s error is %s ", dsn, err.Error())
log.Error(errConnect)
return false, []string{
errConnect,
}
}
defer db.Close()
// 确保数据库连接是有效的
if err := db.Ping(); err != nil {
errConnect := "[MysqlSqlFileLoad]- mysql ping error ! please check !"
log.Error(errConnect)
return false, []string{
errConnect,
}
}
return true, nil
}
//func MySqlParseSQLFile(sqlFilePath string) []string {
//
// var result []string
//
// // 打开 SQL 文件
// jackeyLove, err := os.Open(sqlFilePath)
// if err != nil {
// log.ErrorF("[MySqlParseSQLFile] - failed to load jackeyLoveFile => %s", jackeyLove.Name())
// }
// defer jackeyLove.Close()
//
// // 逐行读取 SQL 文件并执行
// query := ""
// delimiterSwitched := false
// scanner := bufio.NewScanner(jackeyLove)
// for scanner.Scan() {
// sqlStatement := scanner.Text()
//
// if strings.HasPrefix(strings.TrimSpace(sqlStatement), "DELIMITER") {
// delimiterSwitched = true
// continue
// }
// if delimiterSwitched {
// if strings.TrimSpace(sqlStatement) == "" || strings.TrimSpace(sqlStatement) == ";" {
// delimiterSwitched = false
// // 替换自定义分隔符为 ;
// sqlStatement = strings.ReplaceAll(sqlStatement, ";;", ";")
// } else {
// // 忽略自定义分隔符行
// continue
// }
// }
//
// // 这里可以添加逻辑来忽略空行或注释行
// if sqlStatement == "" || sqlStatement[:2] == "--" || sqlStatement[:2] == "/*" {
// continue
// }
//
// query += sqlStatement
//
// if strings.HasSuffix(strings.TrimSpace(sqlStatement), ";") {
//
// result = append(result, query)
//
// query = ""
// } else {
// query += "" // 添加空格以便连接多行语句
// }
// }
//
// // 检查扫描过程中是否有错误
// if err := scanner.Err(); err != nil {
// executeError := fmt.Sprintf("[MysqlSqlFileLoad] - jackeyLoveFile %s 文件加载错误! 错误信息: %s", jackeyLove.Name(), err.Error())
// log.Error(executeError)
//
//
// }
//
// return result
//}
//
//func MySqlConnection(jackeyLoveIp string, jackeyLovePort string) (bool, []string) {
//
// dsn := "root:QzfXQhd3bQ@tcp(" + jackeyLoveIp + ":33306)/"
// db, err := sql.Open("mysql", dsn)
// if err != nil {
// errConnect := fmt.Sprintf("[MysqlSqlFileLoad]- mysql connection error ! please check ! => %s error is %s ", dsn, err.Error())
// log.Error(errConnect)
// return false, []string{
// errConnect,
// }
// }
// defer db.Close()
//
// // 确保数据库连接是有效的
// if err := db.Ping(); err != nil {
// errConnect := "[MysqlSqlFileLoad]- mysql ping error ! please check !"
// log.Error(errConnect)
// return false, []string{
// errConnect,
// }
// }
//
// return true, nil
//}

View File

@@ -1,13 +1,18 @@
package executor
import "testing"
func TestMySqlConnection(t *testing.T) {
connection, strings := MySqlConnection("10.250.0.126", "33306")
if !connection {
t.Error(strings)
}
println("success!")
}
//func TestMySqlConnection(t *testing.T) {
//
// connection, strings := MySqlConnection("10.250.0.126", "33306")
// if !connection {
// t.Error(strings)
// }
//
// println("success!")
//}
//
//func TestMySqlParseSQLFile(t *testing.T) {
//
// parseSQLFile := MySqlParseSQLFile("C:\\Users\\wdd\\Documents\\4.1.6-部署\\init_5.1.0\\1_all_tables_demo_5.1.0.sql")
//
// BasicPrettyPrint(true, parseSQLFile)
//}