Browse Source

修改exec

GTong 11 months ago
parent
commit
0eed391c40

BIN
BIN/功能性sql自动测试.docx


+ 0 - 36
file/test copy.txt

@@ -1,36 +0,0 @@
-[xugu]
-ip = 10.28.20.101
-port = 5190
-database = system
-user_password = sysdba:sysdba
-
-[sql]
-用例名称 = 基础数据类型
-测试要求 = "基础数据类型应符合下列条款;支持数值类型;支持字符类型;支持二进制类型;支持日期类型;支持布尔类型;支持大文本类型支持大对象类型;"
-测试步骤 = """
---支持二进制类型;
-create table IF NOT EXISTS t3(a blob,b binary);
-insert into t3 values(?,'a'); <# /home/gtong/xugu_work/xgtest/file/test_pic_1.png
-select * from t3;
-"""
-
-
---支持数值类型;
-create table t1(a int,b bigint,c float,d double,e tinyint,f smallint,g numeric(5,2));
-insert into t1 values(1,100,123456,123456,12,123,123.12);
-select * from t1;
---支持字符类型;
-create table t2(a char(20),b varchar,c clob);
-insert into t2 values('a','ab','abc');
-select * from t2;
-
-
-
-用例名称 = 12321数据类型
-测试要求 = "据类型大苏打萨达萨达是;支持数值类型;支持字符类型;支持二进制类型;支持日期类型;支持布尔类型;支持大文本类型支持大对象类型;"
-测试步骤 = """
---支持二进制类型;
-create table IF NOT EXISTS t4(a blob,b binary);
-insert into t4 values(?,'a'); <# /home/gtong/xugu_work/xgtest/file/test_pic_1.png
-select * from t4;
-"""

+ 0 - 83
file/test.txt

@@ -1,83 +0,0 @@
-[xugu]
-ip = 10.28.20.101
-port = 5190
-database = TESTDB
-user = sysdba
-password = SYSDBA
-
-[sql]
-用例名称 = 基础数据类型
-测试要求 = "基础数据类型应符合下列条款;支持数值类型;支持字符类型;支持二进制类型;支持日期类型;支持布尔类型;支持大文本类型支持大对象类型;"
-预置条件 = "数据库集群运行正常"
-测试程序 = "虚谷数据库管理系统(XGDBMS V11.0);虚谷数据库控制台工具(xgconsole V1)"
-测试步骤 = """
---支持数值类型;
-create table  IF NOT EXISTS  t1(a int,b bigint,c float,d double,e tinyint,f smallint,g numeric(5,2));
-insert into t1 values(1,100,123456,123456,12,123,123.12);
-select * from t1;
---删除表;
-drop table if EXISTS   t1;
---支持字符类型;
-create table  IF NOT EXISTS  t2(a char(20),b varchar,c clob);
-insert into t2 values('a','ab','abc');
-select * from t2;
-drop table if  EXISTS  t2;
---支持日期类型;
-create table IF NOT EXISTS  t4(a date,b datetime,c datetime with time zone,d time,e time with time zone);
-insert into t4 values('2020-01-01','2021-01-01 10:10:10.111','2021-01-01 10:10:10.111 +8:00','10:10:10.111', '10:10:10.111 +8:00');
-select * from t4;
---删除表;
-drop table if  EXISTS  t4;
---创建表,表列类型为布尔类型;
-create table t5(a boolean);
-insert into t5 values('true')('false');
-select * from t5;
---删除表;
-drop table if  EXISTS  t5;
-"""
-
-用例名称 = 扩展数据类型
-测试要求 = "完成扩展数据类型的要求;"
-预置条件 = "数据库安装部署完毕,使用xgconsole连接数据库成功,管理器工具连接数据库成功"
-测试程序 = "虚谷数据库控制台工具(xgconsole V1)"
-测试步骤 = """
-    --删除测试表;
-    DROP TABLE IF EXISTS INTERVAL_TABLE; 
-    --创建表,表列类型时间间隔;
-   CREATE TABLE INTERVAL_TABLE(
-    A INTERVAL YEAR,
-    B INTERVAL MONTH,
-    C INTERVAL DAY,
-    D INTERVAL HOUR,
-    E INTERVAL MINUTE,
-    F INTERVAL SECOND,
-    G INTERVAL YEAR TO MONTH,
-    H INTERVAL DAY TO HOUR,
-    I INTERVAL DAY TO MINUTE,
-    J INTERVAL DAY TO SECOND,
-    K INTERVAL HOUR TO MINUTE,
-    L INTERVAL HOUR TO SECOND,
-    M INTERVAL MINUTE TO SECOND);
-    --插入数据;
-    INSERT INTO INTERVAL_TABLE VALUES(
-    '1',
-    '2',
-    '3',
-    '4',
-    '5',
-    '6',
-    '12-1',
-    '10 1',
-    '10 11:01',
-    '10 10:10:01',
-    '10:10',
-    '10:10:10',
-    '10:10'); 
-    --查询表数据;
-    SELECT * FROM INTERVAL_TABLE;
-    --删除表;
-    drop table INTERVAL_TABLE;
-"""
-
-
-

+ 144 - 17
internal/auto/auto.go

@@ -76,7 +76,7 @@ func AutoRun(config config.ConfigInfo) {
 		var sql string
 		for partTestStepScanner.Scan() {
 			partLine := strings.ToLower(strings.TrimSpace(partTestStepScanner.Text()))
-			//fmt.Printf("partLine: %s\n", partLine)
+			fmt.Printf("解析一行的sql partLine: %s\n", partLine)
 
 			switch {
 			//sql注释--
@@ -91,7 +91,71 @@ func AutoRun(config config.ConfigInfo) {
 			//sql语句
 			case strings.Contains(partLine, ";"):
 				//fmt.Println("带有;key")
-				//fmt.Printf("不带有--sql: %s\n", partLine)
+				fmt.Printf("是sql: %s\n", partLine)
+				if strings.Contains(partLine, "<#") {
+					texts += partLine
+					texts += "\n"
+					sql = ""
+					sqlPart, files := fileInsert(db, partLine)
+					retStr := dbBase.ExecFiles(db, sqlPart, files, partLine)
+
+					var im produce.ImageInfo
+					imageRet, err := im.Runimage(retStr)
+					if err != nil {
+						global.Logs.Error(err)
+						return
+					}
+					imagesList = append(imagesList, imageRet)
+					tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
+					now := time.Now()
+					im.SaveImage(fmt.Sprintf("%s/(%s)_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sqlPart[:15], now.Format("2006-01-02 15.04.05.00000")))
+
+					break
+				}
+
+				if strings.Contains(partLine, "<%") {
+					fmt.Println("带有<%key")
+					texts += partLine
+					texts += "\n"
+					sql = ""
+					sqlPart, files := fileInsert(db, partLine)
+					retStr := dbBase.ExecClob(db, sqlPart, files, partLine)
+					fmt.Println("CLOB:", retStr)
+
+					var im produce.ImageInfo
+					imageRet, err := im.Runimage(retStr)
+					if err != nil {
+						global.Logs.Error(err)
+						return
+					}
+					imagesList = append(imagesList, imageRet)
+					tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
+					now := time.Now()
+					im.SaveImage(fmt.Sprintf("%s/(%s)_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sqlPart[:15], now.Format("2006-01-02 15.04.05.00000")))
+
+					break
+				}
+
+				if strings.Contains(partLine, "drop") {
+					sql += strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1])
+					//fmt.Printf("sql TrimSpace: %s\n", sql)
+					texts += sql
+					texts += "\n"
+					isQueryOrInsert(db, sql, &tableUpperPartTemp)
+					sql = ""
+					break
+				}
+				if strings.Contains(partLine, "procedure ") {
+					endStr := "end;"
+					sql += strings.TrimSpace(partLine[:strings.Index(partLine, endStr)+len(endStr)])
+					fmt.Println("带有procedure key :", sql)
+					texts += sql
+					texts += "\n"
+					isQueryOrInsert(db, sql, &tableUpperPartTemp)
+					sql = ""
+					break
+				}
+
 				sql += strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1])
 				//fmt.Printf("sql TrimSpace: %s\n", sql)
 				texts += sql
@@ -116,6 +180,9 @@ func AutoRun(config config.ConfigInfo) {
 			fmt.Println("partTestStepScanner.Error reading input:", err)
 		}
 
+		//删除当前用户的所有表
+		// tableNames := dbBase.QueryUserTableName(db, "select table_name from user_tables ")
+		// dbBase.ExecDorpTable(db, tableNames)
 	}
 
 	// for i := range tableUpperParts1 {
@@ -164,19 +231,36 @@ func isQueryOrInsert(db *sql.DB, sql string, tableUpperPartTemp *produce.TableUp
 			imagesList = append(imagesList, imageRet)
 			tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
 			now := time.Now()
-			im.SaveImage(fmt.Sprintf("%s/select %s_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sql[len(sql)-5:], now.Format("2006-01-02 15:04:05.00000")))
+			im.SaveImage(fmt.Sprintf("%s/select %s_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sql[len(sql)-5:], now.Format("2006-01-02 15.04.05.00000")))
 
 		}
 	//执行大对象插入语句
-	case isBlob(sql):
-		{
-			//fmt.Printf("\nsql is 大对象插入: %s\n", sql)
-		}
+	// case strings.Contains(sql, "<#"):
+	// 	{
+	// 		fmt.Printf("\nsql is 大对象插入: %s\n", sql)
+	// 		sqlPart, files := isBlob(db, sql)
+	// 		fmt.Println("大对象:", sqlPart)
+	// 		retStr := dbBase.ExecFiles(db, sqlPart, files)
+	// 		fmt.Println("大对象:", retStr)
+	// 		var im produce.ImageInfo
+	// 		imageRet, err := im.Runimage(retStr)
+	// 		if err != nil {
+	// 			global.Logs.Error(err)
+	// 			return
+	// 		}
+	// 		imagesList = append(imagesList, imageRet)
+	// 		tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
+	// 		now := time.Now()
+	// 		im.SaveImage(fmt.Sprintf("%s/(%s)_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sql[:15], now.Format("2006-01-02 15.04.05.00000")))
+	// 	}
 	//其他语句调用exec函数
 	default:
 		{
 			//不是大对象插入语句的处理
 			//fmt.Printf("\nsql is 不是大对象插入语句的处理: %s\n", sql)
+			if strings.Contains(sql, "set session") {
+				fmt.Println("执行set session")
+			}
 			ret := dbBase.ExecString(db, sql)
 			var im produce.ImageInfo
 			imageRet, err := im.Runimage(ret)
@@ -187,24 +271,61 @@ func isQueryOrInsert(db *sql.DB, sql string, tableUpperPartTemp *produce.TableUp
 			imagesList = append(imagesList, imageRet)
 			tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
 			now := time.Now()
-			im.SaveImage(fmt.Sprintf("%s/(%s)_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sql[:15], now.Format("2006-01-02 15:04:05.00000")))
+			if len(sql) < 15 {
+				im.SaveImage(fmt.Sprintf("%s/(%s)_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sql[5:], now.Format("2006-01-02 15.04.05.00000")))
+				break
+			}
+			im.SaveImage(fmt.Sprintf("%s/(%s)_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sql[:15], now.Format("2006-01-02 15.04.05.00000")))
 		}
 	}
 }
 
 // 是否是大对象语句
-func isBlob(sql string) bool {
-	utils.ContainsKeyword(sql, "values")
+func fileInsert(db *sql.DB, sql string) (string, []string) {
 	questionMarksCount := utils.IsInsertBlob(sql)
-	switch {
-	case questionMarksCount > 0:
-		{
-			return true
+	fmt.Println("questionMarksCount", questionMarksCount)
+	sqlPart, filePart, err := splitBlobAndClobString(sql)
+	if err != nil {
+		global.Logs.Error("切分Blob语句错误", err)
+		return "", nil
+	}
+	fmt.Printf("part1: %s\n", sqlPart)
+	fmt.Printf("part2: %s\n", filePart)
+	files := deleteSymbol(filePart)
+	fmt.Println("isBlob")
+	return sqlPart, files
+}
+
+func splitBlobAndClobString(input string) (string, string, error) {
+	fmt.Println("splitBlobString: ", input)
+	splitIndex := strings.Index(input, "<#")
+	if splitIndex == -1 {
+		splitIndex = strings.Index(input, "<%")
+		if splitIndex == -1 {
+			return "", "", fmt.Errorf("delimiter '<#' not found in the input string")
 		}
-	default:
-		return false
 	}
 
+	part1 := strings.TrimSpace(input[:splitIndex])
+	part2 := strings.TrimSpace(input[splitIndex:]) // +2 to exclude '<#'
+
+	return part1, part2, nil
+}
+
+func deleteSymbol(input string) []string {
+	// 去掉 <# 符号
+	cleanedInput := strings.ReplaceAll(input, "<#", "")
+	fmt.Println("cleanedInput: ", cleanedInput)
+	cleanedInput2 := strings.ReplaceAll(cleanedInput, "<%", "")
+	fmt.Println("cleanedInput2: ", cleanedInput2)
+	// 按空格切割
+	parts := strings.Fields(cleanedInput2)
+
+	// 打印结果
+	for _, part := range parts {
+		fmt.Println(part)
+	}
+	return parts
 }
 
 // 生成word
@@ -214,6 +335,12 @@ func generateWord(tableUpperParts1 []produce.TableUpperPart) {
 	for _, tableUpperPart := range tableUpperParts1 {
 
 		//fmt.Printf("text: %v\n", text)
+		//fmt.Println("tableUpperPart.ImagesList: ", tableUpperPart.ImagesList)
+		if tableUpperPart.ImagesList == nil || len(tableUpperPart.ImagesList) == 0 {
+
+			global.Logs.Error("图片缓存为空,退出程序")
+			return
+		}
 		mergedImage, err := produce.MergeImages(tableUpperPart.ImagesList)
 		if err != nil {
 			panic(err)
@@ -222,7 +349,7 @@ func generateWord(tableUpperParts1 []produce.TableUpperPart) {
 		wd.WriterTable(global.FileLocal, tableUpperPart, mergedImage)
 
 		//保存图片
-		timeNow := time.Now().Format("2006-01-02 15:04:05.00000")
+		timeNow := time.Now().Format("2006-01-02 15.04.05.00000")
 		// 生成随机整数
 		randomInt := rand.Intn(100) // 生成0到99之间的随机整数
 		err = os.WriteFile(fmt.Sprintf("%s/merged_image_%s_%d.png", fmt.Sprintf(global.FileLocal+"/images/merged"), timeNow, randomInt), mergedImage, 0644)

+ 213 - 38
internal/dbBase/db.go

@@ -1,15 +1,19 @@
 package dbBase
 
 import (
-	"C"
 	"database/sql"
 	"fmt"
+	"io"
 	"log"
 	"os"
+	"runtime"
 	"strings"
+	"time"
+	"unsafe"
+	"xgAutoTest/internal/global"
 	_ "xgAutoTest/pkg/go-driver-xugusql"
 )
-import "time"
+import "C"
 
 var db *sql.DB
 
@@ -18,59 +22,97 @@ func InitDb(ip string, port string, dbBase string, user string, pwd string) {
 	dbLink := fmt.Sprintf("IP=%s;DB=%s;User=%s;"+"PWD=%s;Port=%s;AUTO_COMMIT=on;CHAR_SET=UTF8", ip, dbBase, user, pwd, port)
 	db, err = sql.Open("xugusql", dbLink)
 	if err != nil {
-		log.Fatal("db open fail")
+
+		global.Logs.Fatal("db open fail", err)
 	}
 	err = db.Ping()
 	if err != nil {
-		log.Fatal("db Ping fail")
+		global.Logs.Fatal("db Ping fail", err)
 	} else {
-		log.Printf("db Ping ok")
+		global.Logs.Println("db Ping ok")
 	}
+	db.Exec("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ")
 }
 
 func GetDb() *sql.DB {
+
 	return db
 }
 
 func QueryString(db *sql.DB, sql string) string {
 	fmt.Println("执行查询sql: ", sql)
+	var sqlResult string
+	var records int
 	// 记录开始时间
 	start := time.Now()
+
 	rows, err := db.Query(sql)
 	if err != nil {
-		log.Fatal(err)
+		if strings.Contains(sql, "exec") || strings.Contains(sql, "call") {
+			sqlResult += fmt.Sprintf("SQL> %s \nConnect ok.\n%s", sql, err.Error())
+
+			sqlResult += fmt.Sprintf("\n\nExecute successful.\n")
+
+			sqlResult += fmt.Sprintf("Use time:1 ms.")
+			fmt.Println("sqlResult: ", sqlResult)
+			return sqlResult
+		}
+
+		global.Logs.Errorln("Query执行错误", err)
+		sqlResult += fmt.Sprintf("SQL> %s\nError: %s", sql, err.Error())
+		return sqlResult
+	}
+	colTypes, err := rows.ColumnTypes()
+	if err != nil {
+		global.Logs.Fatal(err)
 	}
+
 	var cols []string
 	cols, err = rows.Columns()
 	if err != nil {
-		log.Fatal(err)
+		global.Logs.Fatal(err)
 	}
-
-	var sqlResult string
-	sqlResult += fmt.Sprintf("SQL> %s", sql+"\n\n")
 	pvals := make([]interface{}, len(cols))
 	for key, _ := range pvals {
 		dest := make([]byte, 216)
 		pvals[key] = &dest
 	} /* end for */
+
+	sqlResult += fmt.Sprintf("SQL> %s", sql+"\n\n")
+
 	for _, v := range cols {
 		//fmt.Printf("%s | ", v)
 		sqlResult += fmt.Sprintf("%s | ", v)
 	}
 	sqlResult += "\n------------------------------------------------------------------------------\n"
-	records := 0
+
+	records = 0
 	for rows.Next() {
 		err = rows.Scan(pvals...)
 		if err != nil {
-			log.Fatal(err)
+			global.Logs.Fatal(err)
 		}
-		for _, v := range pvals {
-			if string(*(v.(*[]byte))) == "" {
-				//	fmt.Printf("%s| ", "<NULL>")
-				sqlResult += fmt.Sprintf("%s | ", "<NULL>")
-			} else {
-				//	fmt.Printf("%s | ", string(*(v.(*[]byte))))
-				sqlResult += fmt.Sprintf("%s | ", string(*(v.(*[]byte))))
+		for i, v := range pvals {
+			//fmt.Println("colTypes[i].DatabaseTypeName(): ", colTypes[i].DatabaseTypeName())
+			switch colTypes[i].DatabaseTypeName() {
+			case "BLOB":
+				if string(*(v.(*[]byte))) == "" {
+					//	fmt.Printf("%s| ", "<NULL>")
+					sqlResult += fmt.Sprintf("%s | ", "<NULL>")
+				} else {
+					//	fmt.Printf("%s | ", string(*(v.(*[]byte))))
+					sqlResult += fmt.Sprintf("%s | ", "<BLOB>")
+				}
+
+			default:
+				if string(*(v.(*[]byte))) == "" {
+					//	fmt.Printf("%s| ", "<NULL>")
+					sqlResult += fmt.Sprintf("%s | ", "<NULL>")
+				} else {
+					//	fmt.Printf("%s | ", string(*(v.(*[]byte))))
+					sqlResult += fmt.Sprintf("%s | ", string(*(v.(*[]byte))))
+				}
+
 			}
 
 		}
@@ -80,6 +122,7 @@ func QueryString(db *sql.DB, sql string) string {
 	}
 
 	//fmt.Println("--------------------------------")
+
 	// 记录结束时间
 	end := time.Now()
 
@@ -89,22 +132,24 @@ func QueryString(db *sql.DB, sql string) string {
 	if durationInt == 0 {
 		durationInt = 1
 	}
-	rows.Close()
-
 	sqlResult += fmt.Sprintf("\nTotal %d records.\n", records)
 
 	sqlResult += fmt.Sprintf("\nUse time:%d ms.", durationInt)
 	//fmt.Println("sqlResult:", sqlResult)
+	rows.Close()
 	return sqlResult
 }
 
 func ExecString(db *sql.DB, sql string) string {
 	fmt.Println("执行插入sql: ", sql)
+
 	var sqlResult string
 	start := time.Now()
 	result, err := db.Exec(sql)
 	if err != nil {
-		log.Fatal("Exe查询错误", err)
+		global.Logs.Errorln("Exe执行错误", err)
+		sqlResult += fmt.Sprintf("SQL> %s\nError: %s", sql, err.Error())
+		return sqlResult
 	}
 	// 记录结束时间
 	end := time.Now()
@@ -115,7 +160,8 @@ func ExecString(db *sql.DB, sql string) string {
 	// 获取影响的行数
 	rowsAffected, err := result.RowsAffected()
 	if err != nil {
-		log.Fatal(err)
+		global.Logs.Fatal(err)
+
 	}
 	//fmt.Printf("Rows affected: %d\n", rowsAffected)
 
@@ -123,48 +169,177 @@ func ExecString(db *sql.DB, sql string) string {
 	if durationInt == 0 {
 		durationInt = 1
 	}
-	sqlResult += fmt.Sprintf("Total %d records effected.\n", rowsAffected)
-	sqlResult += fmt.Sprintf("\nUse time:%d ms.", durationInt)
+
+	if strings.Contains(sql, "grant") {
+		sqlResult += "Execute successful."
+		sqlResult += fmt.Sprintf("\nUse time:%d ms.", durationInt)
+		return sqlResult
+	} else if strings.Contains(sql, "insert") {
+		sqlResult += fmt.Sprintf("Total %d records effected.\n", rowsAffected)
+		sqlResult += fmt.Sprintf("\nUse time:%d ms.", durationInt)
+		return sqlResult
+	} else {
+		sqlResult += "Execute successful."
+		sqlResult += fmt.Sprintf("\nUse time:%d ms.", durationInt)
+		return sqlResult
+	}
+
 	//fmt.Println("sqlResult", sqlResult)
 
 	return sqlResult
 }
 
-func ExecPrepareString(db1 *sql.DB, sql string, fileLocal []string) {
+func ExecFiles(db *sql.DB, sql string, fileLocal []string, partLine string) string {
 
-	//var sqlResult string
+	var sqlResult string
 	fmt.Println("fileLocal的数量: ", len(fileLocal))
 	var args []interface{}
 	for _, v := range fileLocal {
-
+		fmt.Println("文件地址:", v)
 		// 读取图像文件
 		v := strings.ReplaceAll(v, " ", "")
 		fmt.Println("文件地址:", v)
 		imageData, err := os.ReadFile(v)
 		if err != nil {
-			log.Fatal(err)
+			global.Logs.Fatal(err)
 		}
 
 		args = append(args, &imageData)
 	}
 
 	fmt.Println("sql查询:", sql)
+	//ret := "insert into t4 values(?,?,2);"
+
+	runtime.KeepAlive(sql)
+	ptr := unsafe.Pointer(&sql)
+
+	runtime.KeepAlive(ptr)
 	stmt, err := db.Prepare(sql)
+	if err != nil {
+		global.Logs.Fatal(err)
+	}
+
+	result, err := stmt.Exec(args...)
+	if err != nil {
+
+		global.Logs.Errorln("Exe执行错误", err)
+		sqlResult += fmt.Sprintf("SQL> %s\nError: %s", partLine, err.Error())
+		return sqlResult
+
+	}
+
+	// 获取影响的行数
+	_, err = result.RowsAffected()
 	if err != nil {
 		log.Fatal(err)
 	}
+	sqlResult += fmt.Sprintf("SQL> %s", partLine+"\n\n")
+	//sqlResult += fmt.Sprintf("Total %d records effected.", rowsAffected)
+	sqlResult += fmt.Sprintf("Use time:1 ms.")
+	return sqlResult
+}
+
+func ExecClob(db *sql.DB, sql string, fileLocal []string, partLine string) string {
+	var sqlResult string
+	fmt.Println("fileLocal的数量: ", len(fileLocal))
+	var args []interface{}
+	for _, v := range fileLocal {
+		// 打开文件
+		file, err := os.Open(v)
+		if err != nil {
+			log.Fatal(err)
+		}
+		defer file.Close()
+		// 读取文件内容
+		content, err := io.ReadAll(file)
+		if err != nil {
+			log.Fatal(err)
+		}
+		// 将内容转换为字符串
+		fileContent := string(content)
+
+		args = append(args, &fileContent)
+	}
+
+	fmt.Println("sql查询:", sql)
+	//ret := "insert into t4 values(?,?,2);"
+
+	stmt, err := db.Prepare(sql)
+	if err != nil {
+		global.Logs.Fatal(err)
+	}
 
-	_, err = stmt.Exec(args...)
+	result, err := stmt.Exec(args...)
+	if err != nil {
+		if err != nil {
+			global.Logs.Errorln("Exe执行错误", err)
+			sqlResult += fmt.Sprintf("SQL> %s\nError: %s", partLine, err.Error())
+			return sqlResult
+		}
+
+	}
+
+	// 获取影响的行数
+	_, err = result.RowsAffected()
 	if err != nil {
 		log.Fatal(err)
 	}
+	sqlResult += fmt.Sprintf("SQL> %s", partLine+"\n\n")
+	//sqlResult += fmt.Sprintf("Total %d records effected.", rowsAffected)
+	sqlResult += fmt.Sprintf("Use time:1 ms.")
+	return sqlResult
+}
+
+func QueryUserTableName(db *sql.DB, sql string) []string {
+	rows, err := db.Query(sql)
+	if err != nil {
+		global.Logs.Errorln("Query执行错误", err)
+		return nil
+	}
+	_, err = rows.ColumnTypes()
+	if err != nil {
+		global.Logs.Fatal(err)
+	}
+
+	var cols []string
+	cols, err = rows.Columns()
+	if err != nil {
+		global.Logs.Fatal(err)
+	}
+	pvals := make([]interface{}, len(cols))
+	for key, _ := range pvals {
+		dest := make([]byte, 216)
+		pvals[key] = &dest
+	} /* end for */
+	var tableNames []string
+	for rows.Next() {
+		err = rows.Scan(pvals...)
+		if err != nil {
+			global.Logs.Fatal(err)
+		}
+		for _, v := range pvals {
+
+			tableNames = append(tableNames, string(*(v.(*[]byte))))
+
+		}
+	}
+	return tableNames
+}
+
+func ExecDorpTable(db *sql.DB, tableNames []string) {
+
+	_, err := db.Exec("COMMIT;")
+	if err != nil {
+		global.Logs.Errorln("Exe执行错误", err)
+		return
+	}
+	for _, v := range tableNames {
+		sql := fmt.Sprintf("drop table %s;", v)
+		_, err := db.Exec(sql)
+		if err != nil {
+			global.Logs.Errorln("Exe执行错误", err)
+			return
+		}
+	}
 
-	// // 获取影响的行数
-	// rowsAffected, err := result.RowsAffected()
-	// if err != nil {
-	// 	log.Fatal(err)
-	// }
-	// sqlResult += fmt.Sprintf("Total %d records effected.", rowsAffected)
-	// sqlResult += fmt.Sprintf("\nUse time:1 ms.")
-	// return sqlResult
 }

+ 3 - 3
internal/dbBase/db_test.go

@@ -36,7 +36,7 @@ func TestIns(t1 *testing.T) {
 	InitDb("10.28.20.101", "5190", "TESTDB", "SYSDBA", "SYSDBA")
 	db := GetDb()
 	defer db.Close()
-	a := "<# /home/gtong/xugu_work/xgtest/file/test_pic_1.png;"
+	a := `<# C:\Program_GT\Code\Go\Work\xugu\xg_autotest\file\test_pic_1.png`
 	ExecString(db, fmt.Sprintf("insert into t3 values(%s,'a');", a))
 }
 
@@ -47,7 +47,7 @@ func TestInsPrepare(t1 *testing.T) {
 	defer db.Close()
 	var args []interface{}
 	// 读取图像文件
-	imageData, err := os.ReadFile("/home/gtong/xugu_work/xgtest/file/test_pic_1.png")
+	imageData, err := os.ReadFile(`C:\Program_GT\Code\Go\Work\xugu\xg_autotest\file\test_pic_1.png`)
 	if err != nil {
 		log.Fatal(err)
 	}
@@ -71,5 +71,5 @@ func TestInsPrepare2(t1 *testing.T) {
 	db := GetDb()
 	defer db.Close()
 	abc := []string{" ../../file/test.txt"}
-	ExecPrepareString(db, "     insert into t3 values(?,'a');", abc)
+	ExecFiles(db, "     insert into t3 values(?,'a');", abc, "")
 }

BIN
internal/dbBase/xugusql.dll


+ 2 - 2
internal/global/global.go

@@ -15,11 +15,11 @@ var FileLocal string
 func Init() {
 	nowTime := time.Now()
 	//初始化文件保存地址
-	FileLocal = fmt.Sprintf("./file/OK_%s", nowTime.Format("2006-01-02 15:04:05.00000"))
+	FileLocal = fmt.Sprintf("./file/OK_%s", nowTime.Format("2006-01-02 15.04.05.00000"))
 	err := utils.CreateFolder(fmt.Sprintf("%s/logs", FileLocal))
 	if err != nil {
 		fmt.Println("创建logs文件夹出错:", err)
 	}
 	//初始化日志
-	Logs = logger.Init(fmt.Sprintf("%s/logs/logs_%s", FileLocal, nowTime.Format("2006-01-02 15:04:05.00")), "info")
+	Logs = logger.Init(fmt.Sprintf("%s/logs/logs_%s", FileLocal, nowTime.Format("2006-01-02 15.04.05.00")), "info")
 }

BIN
internal/produce/abcd.png


+ 1 - 1
internal/produce/image.go

@@ -135,7 +135,7 @@ func (im *ImageInfo) Runimage(sql string) ([]byte, error) {
 	}
 
 	//设置高度
-	height += lineHeight * int(fontSize*1.2)
+	height += lineHeight*int(fontSize*1.2) - 65
 	// 创建一个新的绘图上下文
 	width = int(width) * 2 // 保留一些空白边距
 

BIN
internal/produce/output.png


+ 17 - 3
main.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"fmt"
+	"os"
 	"xgAutoTest/internal/auto"
 	"xgAutoTest/internal/config"
 	"xgAutoTest/internal/dbBase"
@@ -10,13 +11,26 @@ import (
 )
 
 func main() {
+	if len(os.Args) < 2 {
+		fmt.Println("请输入配置文件路径")
+		return
+	}
+	path := os.Args[1]
+	if path == "version" {
+		fmt.Println("当前版本:demo")
+		return
+	}
+	fmt.Println("配置文件路径:", path)
+
+	checkAll()
+	global.Init()
+
 	config := config.ConfigInfo{}
-	config.GetConfigInfo("./file/test.txt")
+	config.GetConfigInfo(path)
 	//dbBase.InitDb("10.28.20.101", "5190", "TESTDB", "SYSDBA", "SYSDBA")
 	fmt.Println(config.DbInfo)
 	dbBase.InitDb(config.DbInfo.Ip, config.DbInfo.Prot, config.DbInfo.Database, config.DbInfo.User, config.DbInfo.PassWord)
-	checkAll()
-	global.Init()
+
 	auto.AutoRun(config)
 	db := dbBase.GetDb()
 	defer db.Close()

BIN
pkg/go-driver-xugusql/lib/arm/libxugusql.so


BIN
pkg/go-driver-xugusql/lib/win/xugusql.dll


+ 4 - 4
pkg/go-driver-xugusql/xugusql_cgo.go

@@ -6,7 +6,7 @@ import (
 
 /*
 #cgo CFLAGS : -I/usr/include
-#cgo LDFLAGS : -L/usr/lib64 -lxugusql
+#cgo LDFLAGS : -L/lib/win -lxugusql
 
 #include <stdlib.h>
 #include <string.h>
@@ -19,6 +19,7 @@ var IPS_BODY unsafe.Pointer
 
 /* Collect error information from the database server */
 func cgo_xgc_error(__pConn *unsafe.Pointer, pLog *C.char, act *C.int) int {
+
 	return int(C.XGC_GetError(__pConn, pLog, act))
 }
 
@@ -45,7 +46,7 @@ func cgo_xgc_connect_ips(pdsn *C.char, __pConn *unsafe.Pointer) int {
  * to realize the user's memory allocation application.
  */
 func cgo_c_calloc(Size uint) *C.char {
-	return (*C.char)(C.calloc(C.ulong(1), C.ulong(Size)))
+	return (*C.char)(C.calloc(C.ulonglong(1), C.ulonglong(Size)))
 }
 
 /*
@@ -53,7 +54,7 @@ func cgo_c_calloc(Size uint) *C.char {
  * to cleans up the data in the memory requested by cgo_c_calloc.
  */
 func cgo_c_memset(pointer *C.char, length uint) {
-	C.memset(unsafe.Pointer(pointer), 0x0, C.ulong(length))
+	C.memset(unsafe.Pointer(pointer), 0x0, C.ulonglong(length))
 }
 
 /*
@@ -168,7 +169,6 @@ func cgo_xgc_next_result(__pRes *unsafe.Pointer) int {
 	return int(C.XGC_NextResult(__pRes))
 }
 
-//
 func cgo_xgc_exec_with_cursor(__pConn *unsafe.Pointer, query *C.char,
 	curname *C.char, __pRes *unsafe.Pointer, fields *C.int, rows *C.longlong, effects *C.int) int {
 	return int(C.XGC_ExecwithServerCursorReader(__pConn, query, curname, __pRes, fields, rows, effects))

+ 8 - 0
xg_autotest.code-workspace

@@ -0,0 +1,8 @@
+{
+	"folders": [
+		{
+			"path": "."
+		}
+	],
+	"settings": {}
+}

BIN
xgtest.exe


BIN
xugusql.dll