xugu_utils.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package xugu
  2. import (
  3. "encoding/binary"
  4. "fmt"
  5. "strings"
  6. )
  7. func parseDSN(dsn string) dsnConfig {
  8. // Initialize a dsnConfig struct
  9. var config dsnConfig
  10. // Split the string by semicolons
  11. pairs := strings.Split(dsn, ";")
  12. // Iterate over the pairs and map them to the struct fields
  13. for _, pair := range pairs {
  14. // Split each pair by the equals sign
  15. kv := strings.SplitN(pair, "=", 2)
  16. if len(kv) != 2 {
  17. continue
  18. }
  19. key, value := strings.TrimSpace(kv[0]), strings.Trim(strings.TrimSpace(kv[1]), "'")
  20. keyL := strings.ToLower(key)
  21. // Map the key to the appropriate struct field
  22. switch keyL {
  23. case "ip":
  24. config.IP = value
  25. case "port":
  26. config.Port = value
  27. case "db":
  28. config.Database = value
  29. case "user":
  30. config.User = value
  31. case "pwd":
  32. config.Password = value
  33. case "encryptor":
  34. config.Encryptor = value
  35. case "char_set":
  36. config.CharSet = value
  37. case "time_zone":
  38. config.TimeZone = value
  39. case "iso_level":
  40. config.IsoLevel = value
  41. case "lock_timeout":
  42. config.LockTimeout = value
  43. case "auto_commit":
  44. config.AutoCommit = value
  45. case "strict_commit":
  46. config.StrictCommit = value
  47. case "result":
  48. config.Result = value
  49. case "return_schema":
  50. config.ReturnSchema = value
  51. case "return_cursor_id":
  52. config.ReturnCursorID = value
  53. case "lob_ret":
  54. config.LobRet = value
  55. case "return_rowid":
  56. config.ReturnRowid = value
  57. case "version":
  58. config.Version = value
  59. }
  60. }
  61. return config
  62. }
  63. func generateLoginString(config dsnConfig) string {
  64. baseString := "login database = '%s' user = '%s' password = '%s' "
  65. additionalParams := ""
  66. if config.Encryptor != "" {
  67. additionalParams += fmt.Sprintf(" encryptor='%s'", config.Encryptor)
  68. }
  69. if config.CharSet != "" {
  70. additionalParams += fmt.Sprintf(" char_set='%s'", config.CharSet)
  71. }
  72. if config.TimeZone != "" {
  73. additionalParams += fmt.Sprintf(" time_zone='%s'", config.TimeZone)
  74. }
  75. if config.IsoLevel != "" {
  76. additionalParams += fmt.Sprintf(" iso_level='%s'", config.IsoLevel)
  77. }
  78. if config.LockTimeout != "" {
  79. additionalParams += fmt.Sprintf(" lock_timeout='%s'", config.LockTimeout)
  80. }
  81. if config.AutoCommit != "" {
  82. additionalParams += fmt.Sprintf(" auto_commit='%s'", config.AutoCommit)
  83. }
  84. if config.StrictCommit != "" {
  85. additionalParams += fmt.Sprintf(" strict_commit='%s'", config.StrictCommit)
  86. }
  87. if config.Result != "" {
  88. additionalParams += fmt.Sprintf(" result='%s'", config.Result)
  89. }
  90. if config.ReturnSchema != "" {
  91. additionalParams += fmt.Sprintf(" return_schema='%s'", config.ReturnSchema)
  92. }
  93. if config.ReturnCursorID != "" {
  94. additionalParams += fmt.Sprintf(" return_cursor_id='%s'", config.ReturnCursorID)
  95. }
  96. if config.LobRet != "" {
  97. additionalParams += fmt.Sprintf(" lob_ret='%s'", config.LobRet)
  98. }
  99. if config.ReturnRowid != "" {
  100. additionalParams += fmt.Sprintf(" return_rowid='%s'", config.ReturnRowid)
  101. }
  102. if config.Version != "" {
  103. additionalParams += fmt.Sprintf(" version='%s'", config.Version)
  104. } else {
  105. additionalParams += " version='201'"
  106. }
  107. finalString := fmt.Sprintf(baseString, config.Database, config.User, config.Password)
  108. if additionalParams != "" {
  109. finalString += additionalParams
  110. }
  111. //finalString += " version='201'"
  112. return finalString
  113. }
  114. // reverseBytes 反转 byte slice 的顺序
  115. func reverseBytes(b []byte) []byte {
  116. reversed := make([]byte, len(b))
  117. for i := range b {
  118. reversed[i] = b[len(b)-1-i]
  119. }
  120. return reversed
  121. }
  122. func gt(name string) {
  123. //fmt.Printf("\n=============%s================\n", name)
  124. }
  125. func switchSQLType(sql string) int {
  126. // 去掉首尾的空格、换行符和回车符
  127. sql = strings.TrimSpace(sql)
  128. if len(sql) < 6 {
  129. return SQL_OTHER
  130. }
  131. // 取前6个字符并转为大写
  132. kstr := strings.ToUpper(sql[:6])
  133. // 根据SQL语句前缀判断类型
  134. switch {
  135. case strings.HasPrefix(kstr, "SELECT"):
  136. if strings.Contains(sql, ";") && len(sql[strings.Index(sql, ";"):]) > 5 {
  137. return SQL_OTHER // 多结果集
  138. }
  139. return SQL_SELECT
  140. case strings.HasPrefix(kstr, "INSERT"):
  141. return SQL_INSERT
  142. case strings.HasPrefix(kstr, "UPDATE"):
  143. return SQL_UPDATE
  144. case strings.HasPrefix(kstr, "DELETE"):
  145. return SQL_DELETE
  146. case strings.HasPrefix(kstr, "CREATE"):
  147. return SQL_CREATE
  148. case strings.HasPrefix(kstr, "ALTER "):
  149. return SQL_ALTER
  150. case strings.HasPrefix(kstr, "EXEC "):
  151. return SQL_PROCEDURE
  152. case strings.HasPrefix(kstr, "EXECUT"):
  153. return SQL_PROCEDURE
  154. case strings.HasPrefix(kstr, "STC"):
  155. return SQL_SELECT
  156. default:
  157. return SQL_OTHER
  158. }
  159. }
  160. // CheckEndian 判断机器的字节序
  161. func CheckEndian() bool {
  162. var i int32 = 0x01020304
  163. b := [4]byte{}
  164. // 将整数值写入字节切片
  165. binary.BigEndian.PutUint32(b[:], uint32(i))
  166. // 判断字节序
  167. if b[0] == 0x01 {
  168. return false // 大端字节序
  169. } else {
  170. return true // 小端字节序
  171. }
  172. }