123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- package util
- import (
- "crypto/md5"
- "encoding/hex"
- "fmt"
- "log"
- "math"
- "reflect"
- "strings"
- "sync"
- _ "github.com/go-sql-driver/mysql"
- "github.com/jmoiron/sqlx"
- "github.com/pborman/uuid"
- "xiaoniaokuaiyan.com/xiaoniao/config"
- )
- var instance *sqlx.DB
- var once sync.Once
- func createSqlDB() {
- var err error
- var (
- dsec = config.IniConf.Section("database")
- host = dsec.Key("mysql.host").Value()
- user = dsec.Key("mysql.user").Value()
- password = dsec.Key("mysql.password").Value()
- port = dsec.Key("mysql.port").Value()
- database = dsec.Key("mysql.database").Value()
- dns = fmt.Sprintf("%s:%s@(%s:%s)/%s", user, password, host, port, database)
- )
- if instance != nil {
- instance.Close()
- }
- instance, err = sqlx.Connect("mysql", dns)
-
- if err != nil {
- log.Println(err)
- }
- instance = instance.Unsafe()
- }
- func GetSqlDB() *sqlx.DB {
- once.Do(func() {
- createSqlDB()
- config.RegistChangeCallback(createSqlDB)
- })
- return instance
- }
- var winstance *sqlx.DB
- var wonce sync.Once
- func createWriteSqlDB() {
- var err error
- var (
- dsec = config.IniConf.Section("database")
- host = dsec.Key("mysql.write.host").Value()
- user = dsec.Key("mysql.write.user").Value()
- password = dsec.Key("mysql.write.password").Value()
- port = dsec.Key("mysql.write.port").Value()
- database = dsec.Key("mysql.database").Value()
- dns = fmt.Sprintf("%s:%s@(%s:%s)/%s", user, password, host, port, database)
- )
- if winstance != nil {
- winstance.Close()
- }
- winstance, err = sqlx.Connect("mysql", dns)
-
- if err != nil {
- log.Println(err)
- }
- winstance = winstance.Unsafe()
- }
- func GetWriteSqlDB() *sqlx.DB {
- wonce.Do(func() {
- createWriteSqlDB()
- config.RegistChangeCallback(createWriteSqlDB)
- })
- return winstance
- }
- func GenerateUpdateSql(tableName string, fields map[string]interface{}, where string) string {
- if len(fields) < 1 {
- return ""
- }
- var sqlStr = "update " + tableName + " set "
- var fstr = ""
- for key, _ := range fields {
- fstr += key + "=:" + key + ","
- }
- return sqlStr + fstr[0:len(fstr)-1] + where
- }
- func structToMap(fields interface{}) map[string]interface{} {
- rv := reflect.ValueOf(fields).Elem()
- rt := rv.Type()
- fnum := rt.NumField()
- resultMap := map[string]interface{}{}
- var fv reflect.Value
- for i := 0; i < fnum; i++ {
- fv = rv.Field(i)
- zero := reflect.Zero(fv.Type()).Interface()
- current := fv.Interface()
- tag := rt.Field(i).Tag.Get("db")
- tags := strings.Split(tag, ",")
- if reflect.DeepEqual(zero, current) {
- continue
- }
- if len(tags) > 1 && tags[1] == "positive" {
- if reflect.DeepEqual(current, -1) {
- current = zero
- }
- }
- tag = tags[0]
- if tag == "null" || tag == "-" {
- continue
- }
- if tag == "" {
- tag = rt.Field(i).Name
- }
- resultMap[tag] = current
- }
- return resultMap
- }
- func GenerateUpdateSqlFromStruct(tableName string, fields interface{}, where string) (string, map[string]interface{}) {
- kvm := structToMap(fields)
- sqlStr := GenerateUpdateSql(tableName, kvm, where)
- return sqlStr, kvm
- }
- func GenerateInsertSql(tableName string, fields map[string]interface{}) string {
- var sqlStr = "insert into " + tableName + "("
- var (
- fstr = ""
- vstr = " values("
- )
- for key, _ := range fields {
- fstr += key + ","
- vstr += ":" + key + ","
- }
- fstr = fstr[0:len(fstr)-1] + ")"
- return sqlStr + fstr + vstr[0:len(vstr)-1] + ")"
- }
- func GenerateInsertSqlFromStruct(tableName string, fields interface{}) (string, map[string]interface{}) {
- kvm := structToMap(fields)
- sqlStr := GenerateInsertSql(tableName, kvm)
- return sqlStr, kvm
- }
- func GenerateSelectSql(tableName string, selFields []string, where string) string {
- var sqlStr = "select "
- for _, key := range selFields {
- sqlStr += key + ","
- }
- sqlStr = sqlStr[0:len(sqlStr)-1] + " from " + tableName + " " + where
- return sqlStr
- }
- func GenerateWhereSql(params []string) string {
- mlen := len(params) - 1
- var whereStr string = " where "
- for i, v := range params {
- whereStr += v + "= ? "
- if i < mlen {
- whereStr += "and "
- }
- }
- return whereStr
- }
- func GenerateDBID() string {
- randBuf := uuid.NewRandom()
- ret := md5.Sum(randBuf)
- id := hex.EncodeToString(ret[0:])
- return strings.ToLower(id)
- }
- type TagIndex struct {
- Idx int
- IsOmitEmpty bool
- }
- func ToFix(num float64, places int) float64 {
- pow := math.Pow(10, float64(places+1))
- digit := num * pow
- mod := math.Mod(digit, float64(10))
- if mod >= 5 {
- return (math.Floor(digit/10) + 1) * 10 / pow
- }
- return math.Floor(digit) / pow
- }
|