sqlserver.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package database
  2. //import _ "github.com/denisenkom/go-mssqldb"
  3. import (
  4. "bet24.com/log"
  5. "database/sql"
  6. "encoding/json"
  7. "fmt"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. type SqlServer struct {
  13. m_db *sql.DB
  14. goroutine_cnt chan int
  15. }
  16. func NewSqlServer(datasource, database, user, password string) *SqlServer {
  17. this := new(SqlServer)
  18. if !this.OpenDB(datasource, database, user, password) {
  19. return nil
  20. }
  21. this.goroutine_cnt = make(chan int, 30)
  22. return this
  23. }
  24. func (this *SqlServer) OpenDB(ds string, database string, user string, password string) bool {
  25. connString := fmt.Sprintf("server=%s;database=%s;user id=%s;password=%s;port=1433;encrypt=disable",
  26. ds, database, user, password)
  27. fmt.Printf(" connString:%s\n", connString)
  28. db, err := sql.Open("mssql", connString)
  29. if err != nil {
  30. log.Error("Open connection failed: %v", err.Error())
  31. return false
  32. }
  33. db.SetMaxIdleConns(64)
  34. db.SetMaxOpenConns(64)
  35. err = db.Ping()
  36. if err != nil {
  37. log.Error("PING:%s\n", err)
  38. return false
  39. }
  40. this.m_db = db
  41. return true
  42. }
  43. func (this *SqlServer) execSqlJson(sqlString string) (string, error) {
  44. this.goroutine_cnt <- 1
  45. db := this.m_db
  46. defer func() {
  47. //c <- ret
  48. <-this.goroutine_cnt
  49. }()
  50. rows, err := db.Query(sqlString)
  51. if err != nil {
  52. return "", err
  53. }
  54. defer rows.Close()
  55. columns, err := rows.Columns()
  56. if err != nil {
  57. return "", err
  58. }
  59. count := len(columns)
  60. tableData := make([]map[string]interface{}, 0)
  61. values := make([]interface{}, count)
  62. valuePtrs := make([]interface{}, count)
  63. for rows.Next() {
  64. for i := 0; i < count; i++ {
  65. valuePtrs[i] = &values[i]
  66. }
  67. rows.Scan(valuePtrs...)
  68. entry := make(map[string]interface{})
  69. for i, col := range columns {
  70. var v interface{}
  71. val := values[i]
  72. b, ok := val.([]byte)
  73. if ok {
  74. str := string(b)
  75. // 可能是float
  76. if strings.Contains(str, ".") {
  77. f, err := strconv.ParseFloat(str, 64)
  78. if err == nil {
  79. v = f
  80. }
  81. }
  82. if v == nil {
  83. v = str
  84. }
  85. } else {
  86. v = val
  87. }
  88. entry[col] = v
  89. }
  90. tableData = append(tableData, entry)
  91. }
  92. jsonData, err := json.Marshal(tableData)
  93. if err != nil {
  94. return "", err
  95. }
  96. // fmt.Println(string(jsonData))
  97. return string(jsonData), nil
  98. }
  99. func (this *SqlServer) execSql(sqlstring string) [][]interface{} {
  100. this.goroutine_cnt <- 1
  101. db := this.m_db
  102. var ret [][]interface{}
  103. defer func() {
  104. //c <- ret
  105. <-this.goroutine_cnt
  106. }()
  107. rows, err := db.Query(sqlstring)
  108. if err != nil {
  109. log.Error("db.Query %v %s\n", err.Error(), sqlstring)
  110. return ret
  111. }
  112. defer rows.Close()
  113. for {
  114. cols, err := rows.Columns()
  115. if err != nil {
  116. log.Error("rows.Columns() %v", err.Error())
  117. return ret
  118. }
  119. if cols == nil {
  120. log.Error("cols == nil %v", err.Error())
  121. return ret
  122. }
  123. for rows.Next() {
  124. vals := make([]interface{}, len(cols))
  125. for i := 0; i < len(cols); i++ {
  126. vals[i] = new(interface{})
  127. }
  128. err = rows.Scan(vals...)
  129. if err != nil {
  130. fmt.Println(err)
  131. continue
  132. }
  133. //log
  134. //for i := 0; i < len(vals); i++ {
  135. // if i != 0 {
  136. // log.Debug("\t")
  137. // }
  138. // printValue(vals[i].(*interface{}))
  139. //}
  140. //fmt.Println()
  141. ret = append(ret, vals)
  142. }
  143. if !rows.NextResultSet() {
  144. break
  145. }
  146. }
  147. return ret
  148. }
  149. func printValue(pval *interface{}) {
  150. switch v := (*pval).(type) {
  151. case nil:
  152. log.Debug("nil NULL")
  153. case bool:
  154. if v {
  155. log.Debug("bool 1")
  156. } else {
  157. log.Debug("bool 0")
  158. }
  159. case []byte:
  160. log.Debug("[]byte %s", v)
  161. case time.Time:
  162. log.Debug("time.Time %s", v.Format("2006-01-02 15:04:05.999"))
  163. default:
  164. log.Debug("default %v", v)
  165. }
  166. }