db.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. package dbBase
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "io"
  6. "log"
  7. "os"
  8. "runtime"
  9. "strings"
  10. "time"
  11. "unsafe"
  12. "xgAutoTest/internal/global"
  13. _ "xgAutoTest/pkg/go-driver-xugusql"
  14. )
  15. import "C"
  16. var db *sql.DB
  17. func InitDb(ip string, port string, dbBase string, user string, pwd string) {
  18. var err error
  19. dbLink := fmt.Sprintf("IP=%s;DB=%s;User=%s;"+"PWD=%s;Port=%s;AUTO_COMMIT=on;CHAR_SET=UTF8", ip, dbBase, user, pwd, port)
  20. db, err = sql.Open("xugusql", dbLink)
  21. if err != nil {
  22. global.Logs.Fatal("db open fail", err)
  23. }
  24. err = db.Ping()
  25. if err != nil {
  26. global.Logs.Fatal("db Ping fail", err)
  27. } else {
  28. global.Logs.Println("db Ping ok")
  29. }
  30. db.Exec("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ")
  31. }
  32. func GetDb() *sql.DB {
  33. return db
  34. }
  35. func QueryString(db *sql.DB, sql string) string {
  36. fmt.Println("执行查询sql: ", sql)
  37. var sqlResult string
  38. var records int
  39. // 记录开始时间
  40. start := time.Now()
  41. rows, err := db.Query(sql)
  42. if err != nil {
  43. if strings.Contains(sql, "exec") || strings.Contains(sql, "call") {
  44. sqlResult += fmt.Sprintf("SQL> %s \nConnect ok.\n%s", sql, err.Error())
  45. sqlResult += fmt.Sprintf("\n\nExecute successful.\n")
  46. sqlResult += fmt.Sprintf("Use time:1 ms.")
  47. fmt.Println("sqlResult: ", sqlResult)
  48. return sqlResult
  49. }
  50. global.Logs.Errorln("Query执行错误", err)
  51. sqlResult += fmt.Sprintf("SQL> %s\nError: %s", sql, err.Error())
  52. return sqlResult
  53. }
  54. colTypes, err := rows.ColumnTypes()
  55. if err != nil {
  56. global.Logs.Fatal(err)
  57. }
  58. var cols []string
  59. cols, err = rows.Columns()
  60. if err != nil {
  61. global.Logs.Fatal(err)
  62. }
  63. pvals := make([]interface{}, len(cols))
  64. for key, _ := range pvals {
  65. dest := make([]byte, 216)
  66. pvals[key] = &dest
  67. } /* end for */
  68. sqlResult += fmt.Sprintf("SQL> %s", sql+"\n\n")
  69. for _, v := range cols {
  70. //fmt.Printf("%s | ", v)
  71. sqlResult += fmt.Sprintf("%s | ", v)
  72. }
  73. sqlResult += "\n------------------------------------------------------------------------------\n"
  74. records = 0
  75. for rows.Next() {
  76. err = rows.Scan(pvals...)
  77. if err != nil {
  78. global.Logs.Fatal(err)
  79. }
  80. for i, v := range pvals {
  81. //fmt.Println("colTypes[i].DatabaseTypeName(): ", colTypes[i].DatabaseTypeName())
  82. switch colTypes[i].DatabaseTypeName() {
  83. case "BLOB":
  84. if string(*(v.(*[]byte))) == "" {
  85. // fmt.Printf("%s| ", "<NULL>")
  86. sqlResult += fmt.Sprintf("%s | ", "<NULL>")
  87. } else {
  88. // fmt.Printf("%s | ", string(*(v.(*[]byte))))
  89. sqlResult += fmt.Sprintf("%s | ", "<BLOB>")
  90. }
  91. default:
  92. if string(*(v.(*[]byte))) == "" {
  93. // fmt.Printf("%s| ", "<NULL>")
  94. sqlResult += fmt.Sprintf("%s | ", "<NULL>")
  95. } else {
  96. // fmt.Printf("%s | ", string(*(v.(*[]byte))))
  97. sqlResult += fmt.Sprintf("%s | ", string(*(v.(*[]byte))))
  98. }
  99. }
  100. }
  101. records++
  102. //fmt.Printf("\n")
  103. sqlResult += "\n"
  104. }
  105. //fmt.Println("--------------------------------")
  106. // 记录结束时间
  107. end := time.Now()
  108. // 计算操作耗时
  109. duration := end.Sub(start)
  110. durationInt := int64(duration.Milliseconds())
  111. if durationInt == 0 {
  112. durationInt = 1
  113. }
  114. sqlResult += fmt.Sprintf("\nTotal %d records.\n", records)
  115. sqlResult += fmt.Sprintf("\nUse time:%d ms.", durationInt)
  116. //fmt.Println("sqlResult:", sqlResult)
  117. rows.Close()
  118. return sqlResult
  119. }
  120. func ExecString(db *sql.DB, sql string) string {
  121. fmt.Println("执行插入sql: ", sql)
  122. var sqlResult string
  123. start := time.Now()
  124. result, err := db.Exec(sql)
  125. if err != nil {
  126. global.Logs.Errorln("Exe执行错误", err)
  127. sqlResult += fmt.Sprintf("SQL> %s\nError: %s", sql, err.Error())
  128. return sqlResult
  129. }
  130. // 记录结束时间
  131. end := time.Now()
  132. // 计算操作耗时
  133. duration := end.Sub(start)
  134. sqlResult += fmt.Sprintf("SQL> %s", sql+"\n\n")
  135. // 获取影响的行数
  136. rowsAffected, err := result.RowsAffected()
  137. if err != nil {
  138. global.Logs.Fatal(err)
  139. }
  140. //fmt.Printf("Rows affected: %d\n", rowsAffected)
  141. durationInt := int64(duration.Milliseconds())
  142. if durationInt == 0 {
  143. durationInt = 1
  144. }
  145. if strings.Contains(sql, "grant") {
  146. sqlResult += "Execute successful."
  147. sqlResult += fmt.Sprintf("\nUse time:%d ms.", durationInt)
  148. return sqlResult
  149. } else if strings.Contains(sql, "insert") {
  150. sqlResult += fmt.Sprintf("Total %d records effected.\n", rowsAffected)
  151. sqlResult += fmt.Sprintf("\nUse time:%d ms.", durationInt)
  152. return sqlResult
  153. } else {
  154. sqlResult += "Execute successful."
  155. sqlResult += fmt.Sprintf("\nUse time:%d ms.", durationInt)
  156. return sqlResult
  157. }
  158. //fmt.Println("sqlResult", sqlResult)
  159. return sqlResult
  160. }
  161. func ExecFiles(db *sql.DB, sql string, fileLocal []string, partLine string) string {
  162. var sqlResult string
  163. fmt.Println("fileLocal的数量: ", len(fileLocal))
  164. var args []interface{}
  165. for _, v := range fileLocal {
  166. fmt.Println("文件地址:", v)
  167. // 读取图像文件
  168. v := strings.ReplaceAll(v, " ", "")
  169. fmt.Println("文件地址:", v)
  170. imageData, err := os.ReadFile(v)
  171. if err != nil {
  172. global.Logs.Fatal(err)
  173. }
  174. args = append(args, &imageData)
  175. }
  176. fmt.Println("sql查询:", sql)
  177. //ret := "insert into t4 values(?,?,2);"
  178. runtime.KeepAlive(sql)
  179. ptr := unsafe.Pointer(&sql)
  180. runtime.KeepAlive(ptr)
  181. stmt, err := db.Prepare(sql)
  182. if err != nil {
  183. global.Logs.Fatal(err)
  184. }
  185. result, err := stmt.Exec(args...)
  186. if err != nil {
  187. global.Logs.Errorln("Exe执行错误", err)
  188. sqlResult += fmt.Sprintf("SQL> %s\nError: %s", partLine, err.Error())
  189. return sqlResult
  190. }
  191. // 获取影响的行数
  192. _, err = result.RowsAffected()
  193. if err != nil {
  194. log.Fatal(err)
  195. }
  196. sqlResult += fmt.Sprintf("SQL> %s", partLine+"\n\n")
  197. //sqlResult += fmt.Sprintf("Total %d records effected.", rowsAffected)
  198. sqlResult += fmt.Sprintf("Use time:1 ms.")
  199. return sqlResult
  200. }
  201. func ExecClob(db *sql.DB, sql string, fileLocal []string, partLine string) string {
  202. var sqlResult string
  203. fmt.Println("fileLocal的数量: ", len(fileLocal))
  204. var args []interface{}
  205. for _, v := range fileLocal {
  206. // 打开文件
  207. file, err := os.Open(v)
  208. if err != nil {
  209. log.Fatal(err)
  210. }
  211. defer file.Close()
  212. // 读取文件内容
  213. content, err := io.ReadAll(file)
  214. if err != nil {
  215. log.Fatal(err)
  216. }
  217. // 将内容转换为字符串
  218. fileContent := string(content)
  219. args = append(args, &fileContent)
  220. }
  221. fmt.Println("sql查询:", sql)
  222. //ret := "insert into t4 values(?,?,2);"
  223. stmt, err := db.Prepare(sql)
  224. if err != nil {
  225. global.Logs.Fatal(err)
  226. }
  227. result, err := stmt.Exec(args...)
  228. if err != nil {
  229. if err != nil {
  230. global.Logs.Errorln("Exe执行错误", err)
  231. sqlResult += fmt.Sprintf("SQL> %s\nError: %s", partLine, err.Error())
  232. return sqlResult
  233. }
  234. }
  235. // 获取影响的行数
  236. _, err = result.RowsAffected()
  237. if err != nil {
  238. log.Fatal(err)
  239. }
  240. sqlResult += fmt.Sprintf("SQL> %s", partLine+"\n\n")
  241. //sqlResult += fmt.Sprintf("Total %d records effected.", rowsAffected)
  242. sqlResult += fmt.Sprintf("Use time:1 ms.")
  243. return sqlResult
  244. }
  245. func QueryUserTableName(db *sql.DB, sql string) []string {
  246. rows, err := db.Query(sql)
  247. if err != nil {
  248. global.Logs.Errorln("Query执行错误", err)
  249. return nil
  250. }
  251. _, err = rows.ColumnTypes()
  252. if err != nil {
  253. global.Logs.Fatal(err)
  254. }
  255. var cols []string
  256. cols, err = rows.Columns()
  257. if err != nil {
  258. global.Logs.Fatal(err)
  259. }
  260. pvals := make([]interface{}, len(cols))
  261. for key, _ := range pvals {
  262. dest := make([]byte, 216)
  263. pvals[key] = &dest
  264. } /* end for */
  265. var tableNames []string
  266. for rows.Next() {
  267. err = rows.Scan(pvals...)
  268. if err != nil {
  269. global.Logs.Fatal(err)
  270. }
  271. for _, v := range pvals {
  272. tableNames = append(tableNames, string(*(v.(*[]byte))))
  273. }
  274. }
  275. return tableNames
  276. }
  277. func ExecDorpTable(db *sql.DB, tableNames []string) {
  278. _, err := db.Exec("COMMIT;")
  279. if err != nil {
  280. global.Logs.Errorln("Exe执行错误", err)
  281. return
  282. }
  283. for _, v := range tableNames {
  284. sql := fmt.Sprintf("drop table %s;", v)
  285. _, err := db.Exec(sql)
  286. if err != nil {
  287. global.Logs.Errorln("Exe执行错误", err)
  288. return
  289. }
  290. }
  291. }