db.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package main
  2. import (
  3. "database/sql"
  4. "errors"
  5. "fmt"
  6. _ "github.com/go-sql-driver/mysql"
  7. client "iaun.cn/linux/services/client"
  8. )
  9. const (
  10. USERNAME = "root"
  11. PASSWORD = "123456"
  12. NETWORK = "tcp"
  13. SERVER = "127.0.0.1"
  14. PORT = 3306
  15. DATABASE = "monitor"
  16. )
  17. func sqlOpen() (*sql.DB, error) {
  18. dsn := fmt.Sprintf("%s:%s@%s(%s:%d)/%s", USERNAME, PASSWORD, NETWORK, SERVER, PORT, DATABASE)
  19. db, err := sql.Open("mysql", dsn)
  20. if err != nil {
  21. fmt.Println(err)
  22. return &sql.DB{}, errors.New("can not connect to db")
  23. }
  24. return db, nil
  25. }
  26. func sqlQuery(db *sql.DB, sql string, args ...interface{}) (*sql.Rows, error) {
  27. rows, err := db.Query(sql, args...)
  28. if err != nil {
  29. fmt.Println(err)
  30. return rows, err
  31. }
  32. return rows, nil
  33. }
  34. func addCPUPercent(cpu *client.CPUReq) bool {
  35. result, err := db.Exec("call insert_cpu_percent(?,?,?)",
  36. cpu.Server.Id, cpu.Server.Timestamp, cpu.Percent)
  37. if err != nil {
  38. fmt.Println(err)
  39. return false
  40. }
  41. fmt.Println(result)
  42. return true
  43. }
  44. func addMemory(mem *client.MemoryReq) bool {
  45. result, err := db.Exec("call insert_memory(?,?,?,?,?,?)",
  46. mem.Server.Id, mem.Server.Timestamp, mem.Total, mem.Free, mem.Cached, mem.UsedPercent)
  47. if err != nil {
  48. fmt.Println(err)
  49. return false
  50. }
  51. fmt.Println(result)
  52. return true
  53. }
  54. type CPUPercentDB struct {
  55. Time int64 `db:"time" json:"time"`
  56. Percent float64 `db:"percent" json:"percent"`
  57. }
  58. type MaxTimestamp struct {
  59. Time int64 `db:"time"`
  60. }
  61. func getCPUPercent(id string, timestamp int64, limit int) (*[]CPUPercentDB, int64, error) {
  62. s := "call select_cpu_percent_with_time(?,?,?)"
  63. rows, err := sqlQuery(db, s, id, timestamp, limit)
  64. if err != nil {
  65. return nil, 0, err
  66. }
  67. defer func() {
  68. if rows != nil {
  69. _ = rows.Close()
  70. }
  71. }()
  72. percent := make([]CPUPercentDB, 0)
  73. for rows.Next() {
  74. temp := CPUPercentDB{}
  75. if err := rows.Scan(&temp.Time, &temp.Percent); err != nil {
  76. continue
  77. }
  78. percent = append(percent, temp)
  79. }
  80. if !rows.NextResultSet() {
  81. return nil, 0, errors.New("could not get max timestamp")
  82. }
  83. t := MaxTimestamp{}
  84. for rows.Next() {
  85. if err := rows.Scan(&t.Time); err != nil {
  86. continue
  87. }
  88. }
  89. return &percent, t.Time, nil
  90. }
  91. type MemoryDB struct {
  92. Time int64 `db:"time" json:"time"`
  93. Total uint64 `db:"total" json:"total"`
  94. Free uint64 `db:"free" json:"free"`
  95. Cached uint64 `db:"cached" json:"cached"`
  96. UsedPercent float64 `db:"used_percent" json:"used_percent"`
  97. }
  98. func getMemory(id string, timestamp int64, limit int) (*[]MemoryDB, int64, error) {
  99. s := "call select_memory(?,?,?)"
  100. rows, err := sqlQuery(db, s, id, timestamp, limit)
  101. if err != nil {
  102. return nil, 0, err
  103. }
  104. defer func() {
  105. if rows != nil {
  106. _ = rows.Close()
  107. }
  108. }()
  109. percent := make([]MemoryDB, 0)
  110. for rows.Next() {
  111. temp := MemoryDB{}
  112. if err := rows.Scan(&temp.Time, &temp.Total, &temp.Free, &temp.Cached, &temp.UsedPercent); err != nil {
  113. fmt.Println("scan failed")
  114. fmt.Println(err.Error())
  115. continue
  116. }
  117. percent = append(percent, temp)
  118. }
  119. if !rows.NextResultSet() {
  120. return nil, 0, errors.New("could not get max timestamp")
  121. }
  122. t := MaxTimestamp{}
  123. for rows.Next() {
  124. if err := rows.Scan(&t.Time); err != nil {
  125. fmt.Println("scan failed")
  126. fmt.Println(err.Error())
  127. continue
  128. }
  129. }
  130. return &percent, t.Time, nil
  131. }
  132. type ClientDB struct {
  133. Id string `json:"id"`
  134. }
  135. // 获取所有客户端ID
  136. func getClient() (*[]ClientDB, error) {
  137. s := "select id from info"
  138. rows, err := sqlQuery(db, s)
  139. if err != nil {
  140. return nil, err
  141. }
  142. defer func() {
  143. if rows != nil {
  144. _ = rows.Close()
  145. }
  146. }()
  147. clients := make([]ClientDB, 0)
  148. for rows.Next() {
  149. temp := ClientDB{}
  150. if err := rows.Scan(&temp.Id); err != nil {
  151. fmt.Println("scan failed")
  152. fmt.Println(err.Error())
  153. continue
  154. }
  155. clients = append(clients, temp)
  156. }
  157. return &clients, nil
  158. }
  159. func registerClient(data *client.InitReq) bool {
  160. s := "call register_client(?,?,?,?,?)"
  161. reg, err := db.Prepare(s)
  162. if err != nil {
  163. return false
  164. }
  165. defer func() {
  166. _ = reg.Close()
  167. }()
  168. results, err := reg.Exec(data.Server.Id, data.CPU[0].Name, data.CPU[0].Count, data.CPU[0].Mhz, data.CPU[0].CacheSize)
  169. if err != nil {
  170. return false
  171. }
  172. fmt.Println()
  173. count, err := results.RowsAffected()
  174. if err != nil || count == 0 {
  175. return false
  176. }
  177. return true
  178. }