mysql.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. package util
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "fmt"
  6. "log"
  7. "math"
  8. "reflect"
  9. "strings"
  10. "sync"
  11. _ "github.com/go-sql-driver/mysql"
  12. "github.com/jmoiron/sqlx"
  13. "github.com/pborman/uuid"
  14. "xiaoniaokuaiyan.com/xiaoniao/config"
  15. )
  16. var instance *sqlx.DB
  17. var once sync.Once
  18. func createSqlDB() {
  19. var err error
  20. var (
  21. dsec = config.IniConf.Section("database")
  22. host = dsec.Key("mysql.host").Value()
  23. user = dsec.Key("mysql.user").Value()
  24. password = dsec.Key("mysql.password").Value()
  25. port = dsec.Key("mysql.port").Value()
  26. database = dsec.Key("mysql.database").Value()
  27. dns = fmt.Sprintf("%s:%s@(%s:%s)/%s", user, password, host, port, database)
  28. )
  29. if instance != nil {
  30. instance.Close()
  31. }
  32. instance, err = sqlx.Connect("mysql", dns)
  33. //instance, err = sqlx.Connect("mysql", "xiaoniao:xn321#@!@tcp(123.57.224.234:3306)/jeecg")
  34. if err != nil {
  35. log.Println(err)
  36. }
  37. instance = instance.Unsafe()
  38. }
  39. func GetSqlDB() *sqlx.DB {
  40. once.Do(func() {
  41. createSqlDB()
  42. config.RegistChangeCallback(createSqlDB)
  43. })
  44. return instance
  45. }
  46. var winstance *sqlx.DB
  47. var wonce sync.Once
  48. func createWriteSqlDB() {
  49. var err error
  50. var (
  51. dsec = config.IniConf.Section("database")
  52. host = dsec.Key("mysql.write.host").Value()
  53. user = dsec.Key("mysql.write.user").Value()
  54. password = dsec.Key("mysql.write.password").Value()
  55. port = dsec.Key("mysql.write.port").Value()
  56. database = dsec.Key("mysql.database").Value()
  57. dns = fmt.Sprintf("%s:%s@(%s:%s)/%s", user, password, host, port, database)
  58. )
  59. if winstance != nil {
  60. winstance.Close()
  61. }
  62. winstance, err = sqlx.Connect("mysql", dns)
  63. //instance, err = sqlx.Connect("mysql", "xiaoniao:xn321#@!@tcp(123.57.224.234:3306)/jeecg")
  64. if err != nil {
  65. log.Println(err)
  66. }
  67. winstance = winstance.Unsafe()
  68. }
  69. func GetWriteSqlDB() *sqlx.DB {
  70. wonce.Do(func() {
  71. createWriteSqlDB()
  72. config.RegistChangeCallback(createWriteSqlDB)
  73. })
  74. return winstance
  75. }
  76. func GenerateUpdateSql(tableName string, fields map[string]interface{}, where string) string {
  77. if len(fields) < 1 {
  78. return ""
  79. }
  80. var sqlStr = "update " + tableName + " set "
  81. var fstr = ""
  82. for key, _ := range fields {
  83. fstr += key + "=:" + key + ","
  84. }
  85. return sqlStr + fstr[0:len(fstr)-1] + where
  86. }
  87. func structToMap(fields interface{}) map[string]interface{} {
  88. rv := reflect.ValueOf(fields).Elem()
  89. rt := rv.Type()
  90. fnum := rt.NumField()
  91. resultMap := map[string]interface{}{}
  92. var fv reflect.Value
  93. for i := 0; i < fnum; i++ {
  94. fv = rv.Field(i)
  95. zero := reflect.Zero(fv.Type()).Interface()
  96. current := fv.Interface()
  97. tag := rt.Field(i).Tag.Get("db")
  98. tags := strings.Split(tag, ",")
  99. if reflect.DeepEqual(zero, current) {
  100. continue
  101. }
  102. if len(tags) > 1 && tags[1] == "positive" {
  103. if reflect.DeepEqual(current, -1) {
  104. current = zero
  105. }
  106. }
  107. tag = tags[0]
  108. if tag == "null" || tag == "-" {
  109. continue
  110. }
  111. if tag == "" {
  112. tag = rt.Field(i).Name
  113. }
  114. resultMap[tag] = current
  115. }
  116. return resultMap
  117. }
  118. func GenerateUpdateSqlFromStruct(tableName string, fields interface{}, where string) (string, map[string]interface{}) {
  119. kvm := structToMap(fields)
  120. sqlStr := GenerateUpdateSql(tableName, kvm, where)
  121. return sqlStr, kvm
  122. }
  123. func GenerateInsertSql(tableName string, fields map[string]interface{}) string {
  124. var sqlStr = "insert into " + tableName + "("
  125. var (
  126. fstr = ""
  127. vstr = " values("
  128. )
  129. for key, _ := range fields {
  130. fstr += key + ","
  131. vstr += ":" + key + ","
  132. }
  133. fstr = fstr[0:len(fstr)-1] + ")"
  134. return sqlStr + fstr + vstr[0:len(vstr)-1] + ")"
  135. }
  136. func GenerateInsertSqlFromStruct(tableName string, fields interface{}) (string, map[string]interface{}) {
  137. kvm := structToMap(fields)
  138. sqlStr := GenerateInsertSql(tableName, kvm)
  139. return sqlStr, kvm
  140. }
  141. func GenerateSelectSql(tableName string, selFields []string, where string) string {
  142. var sqlStr = "select "
  143. for _, key := range selFields {
  144. sqlStr += key + ","
  145. }
  146. sqlStr = sqlStr[0:len(sqlStr)-1] + " from " + tableName + " " + where
  147. return sqlStr
  148. }
  149. func GenerateWhereSql(params []string) string {
  150. mlen := len(params) - 1
  151. var whereStr string = " where "
  152. for i, v := range params {
  153. whereStr += v + "= ? "
  154. if i < mlen {
  155. whereStr += "and "
  156. }
  157. }
  158. return whereStr
  159. }
  160. func GenerateDBID() string {
  161. randBuf := uuid.NewRandom()
  162. ret := md5.Sum(randBuf)
  163. id := hex.EncodeToString(ret[0:])
  164. return strings.ToLower(id)
  165. }
  166. type TagIndex struct {
  167. Idx int
  168. IsOmitEmpty bool
  169. }
  170. func ToFix(num float64, places int) float64 {
  171. pow := math.Pow(10, float64(places+1))
  172. digit := num * pow
  173. mod := math.Mod(digit, float64(10))
  174. if mod >= 5 {
  175. return (math.Floor(digit/10) + 1) * 10 / pow
  176. }
  177. return math.Floor(digit) / pow
  178. }
  179. /*func ScanStruct(rows *sql.Rows, dest interface{}) error {
  180. rv := reflect.ValueOf(dest)
  181. if rv.Kind() != reflect.Ptr {
  182. return errors.New("must pass a pointer, not a value, to StructScan destination")
  183. }
  184. if rv.IsNil() {
  185. return errors.New("nil pointer passed to StructScan destination")
  186. }
  187. direct := rv.Elem()
  188. dtype := direct.Type()
  189. if dtype.Kind() != reflect.Slice {
  190. return fmt.Errorf("expected %s but got %s", reflect.Slice, dtype.Kind())
  191. }
  192. elemType := dtype.Elem()
  193. var (
  194. field reflect.StructField
  195. fmap = map[string]TagIndex{}
  196. dbtagVal string
  197. tagSplits []string
  198. fimap = map[TagIndex]int{}
  199. )
  200. cols, _ := rows.Columns()
  201. for i := 0; i < elemType.NumField(); i++ {
  202. field = elemType.Field(i)
  203. dbtagVal = field.Tag.Get("db")
  204. tagIdx := TagIndex{}
  205. tagSplits = strings.Split(dbtagVal, ",")
  206. if len(tagSplits) > 1 {
  207. dbtagVal = tagSplits[0]
  208. if tagSplits[1] == "omitempty" {
  209. tagIdx.IsOmitEmpty = true
  210. }
  211. }
  212. if dbtagVal == "" {
  213. dbtagVal = field.Name
  214. }
  215. tagIdx.Idx = i
  216. fmap[dbtagVal] = tagIdx
  217. }
  218. for rows.Next() {
  219. nelemVal := reflect.New(elemType)
  220. valArr := make([]interface{}, len(cols))
  221. for i, col := range cols {
  222. if fieldIdx, ok := fmap[col]; !ok {
  223. valArr[i] = &struct{}{}
  224. } else {
  225. field = elemType.Field(fieldIdx.Idx)
  226. if fieldIdx.IsOmitEmpty {
  227. valArr[i] = &[]byte{}
  228. } else {
  229. valArr[i] = reflect.New(field.Type).Interface()
  230. }
  231. fimap[fieldIdx] = i
  232. }
  233. }
  234. rows.Scan(valArr...)
  235. for k, v := range fimap {
  236. fval := reflect.ValueOf(valArr[v])
  237. if k.IsOmitEmpty && fval.IsValid() {
  238. if fval.Elem().Len() <= 0 {
  239. continue
  240. }
  241. field := elemType.Field(k.Idx)
  242. dstFval := reflect.New(field.Type)
  243. switch field.Type.Kind() {
  244. case reflect.Float64:
  245. //bits := binary.LittleEndian.Uint64(fval.Elem().Bytes())
  246. //float := math.Float64frombits(bits)
  247. float, _ := strconv.ParseFloat(string(fval.Elem().Bytes()), 64)
  248. float = ToFix(float, 2)
  249. dstFval.Elem().Set(reflect.ValueOf(float))
  250. case reflect.String:
  251. str := string(fval.Elem().Bytes())
  252. dstFval.Elem().Set(reflect.ValueOf(str))
  253. case reflect.Int:
  254. //bits := binary.LittleEndian.Uint64(fval.Elem().Bytes())
  255. intVal, _ := strconv.ParseInt(string(fval.Elem().Bytes()), 10, 0)
  256. dstFval.Elem().Set(reflect.ValueOf(int(intVal)))
  257. }
  258. //fmt.Println(dstFval.Elem().Interface())
  259. nelemVal.Elem().Field(k.Idx).Set(dstFval.Elem())
  260. } else {
  261. nelemVal.Elem().Field(k.Idx).Set(fval.Elem())
  262. }
  263. }
  264. direct.Set(reflect.Append(direct, nelemVal.Elem()))
  265. }
  266. return nil
  267. }
  268. func ScanStructOld(rows *sql.Rows, dest interface{}) error {
  269. rv := reflect.ValueOf(dest)
  270. if rv.Kind() != reflect.Ptr {
  271. return errors.New("must pass a pointer, not a value, to StructScan destination")
  272. }
  273. if rv.IsNil() {
  274. return errors.New("nil pointer passed to StructScan destination")
  275. }
  276. direct := rv.Elem()
  277. dtype := direct.Type()
  278. if dtype.Kind() != reflect.Slice {
  279. return fmt.Errorf("expected %s but got %s", reflect.Slice, dtype.Kind())
  280. }
  281. elemType := dtype.Elem()
  282. var (
  283. field reflect.StructField
  284. fmap = map[string]int{}
  285. dbtagVal string
  286. fimap = map[int]int{}
  287. )
  288. cols, _ := rows.Columns()
  289. for i := 0; i < elemType.NumField(); i++ {
  290. field = elemType.Field(i)
  291. dbtagVal = field.Tag.Get("db")
  292. if dbtagVal == "null" {
  293. continue
  294. }
  295. if dbtagVal == "" {
  296. dbtagVal = field.Name
  297. }
  298. fmap[dbtagVal] = i
  299. }
  300. for rows.Next() {
  301. nelemVal := reflect.New(elemType)
  302. valArr := make([]interface{}, len(cols))
  303. for i, col := range cols {
  304. if fieldIdx, ok := fmap[col]; !ok {
  305. valArr[i] = &struct{}{}
  306. } else {
  307. field = elemType.Field(fieldIdx)
  308. fval := reflect.New(field.Type)
  309. valArr[i] = fval.Interface()
  310. fimap[fieldIdx] = i
  311. }
  312. }
  313. rows.Scan(valArr...)
  314. fmt.Println(reflect.ValueOf(valArr[len(cols)-3]).Elem().Interface())
  315. for k, v := range fimap {
  316. nelemVal.Elem().Field(k).Set(reflect.ValueOf(valArr[v]).Elem())
  317. }
  318. direct.Set(reflect.Append(direct, nelemVal.Elem()))
  319. }
  320. return nil
  321. }*/