mysql.go 8.7 KB

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