db.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package db
  2. import (
  3. "ehang.io/nps/lib/logger"
  4. "github.com/pkg/errors"
  5. "gorm.io/driver/sqlite"
  6. "gorm.io/gorm"
  7. glog "gorm.io/gorm/logger"
  8. "log"
  9. "reflect"
  10. "time"
  11. )
  12. type Db interface {
  13. Init() error
  14. SetConfig(key string, val string) error
  15. GetConfig(key string) (string, error)
  16. Insert(table string, uuid string, data string) error
  17. Delete(table string, uuid string) error
  18. Update(table string, uuid string, data string) error
  19. Count(table string, filterValue string) (int64, error)
  20. QueryOne(table string, uuid string) (string, error)
  21. QueryAll(table string, filterValue string) ([]string, error)
  22. QueryPage(table string, limit int, offset int, filterValue string) ([]string, error)
  23. }
  24. type dbLogger struct{}
  25. func (_ dbLogger) Write(p []byte) (n int, err error) {
  26. logger.Warn(string(p))
  27. return len(p), nil
  28. }
  29. var _ Db = (*SqliteDb)(nil)
  30. type SqliteDb struct {
  31. Path string
  32. db *gorm.DB
  33. }
  34. func NewSqliteDb(path string) *SqliteDb {
  35. return &SqliteDb{Path: path}
  36. }
  37. func (sd *SqliteDb) SetConfig(key string, val string) error {
  38. c := &Config{Key: key}
  39. err := sd.db.First(c, "key = ?", key).Error
  40. if err != nil {
  41. return sd.db.Create(&Config{Key: key, Val: val}).Error
  42. }
  43. return sd.db.Model(c).Update("val", val).Error
  44. }
  45. func (sd *SqliteDb) GetConfig(key string) (string, error) {
  46. c := &Config{}
  47. err := sd.db.First(c, "key = ?", key).Error
  48. return c.Val, err
  49. }
  50. func (sd *SqliteDb) Count(table string, filterValue string) (int64, error) {
  51. i, err := sd.GetTable(table, "", "")
  52. if err != nil {
  53. return 0, err
  54. }
  55. var count int64
  56. err = sd.db.Where("data LIKE ?", "%"+filterValue+"%").Model(i).Count(&count).Error
  57. return count, err
  58. }
  59. func (sd *SqliteDb) QueryOne(table string, uuid string) (string, error) {
  60. i, err := sd.GetTable(table, "", "")
  61. if err != nil {
  62. return "", err
  63. }
  64. err = sd.db.First(i, "uuid = ?", uuid).Error
  65. if err != nil {
  66. return "", err
  67. }
  68. return getData(i), err
  69. }
  70. func getData(i interface{}) string {
  71. immutable := reflect.ValueOf(i)
  72. return immutable.Elem().FieldByName("Data").String()
  73. }
  74. func (sd *SqliteDb) QueryAll(table string, filterValue string) (data []string, err error) {
  75. list := make([]string, 0)
  76. switch table {
  77. case "rule":
  78. var r []Rule
  79. d := sd.db.Order("id desc")
  80. if filterValue != "" {
  81. d = d.Where("data LIKE ?", "%"+filterValue+"%")
  82. }
  83. err = d.Find(&r).Error
  84. for _, v := range r {
  85. list = append(list, v.Data)
  86. }
  87. case "cert":
  88. var c []Cert
  89. d := sd.db.Order("id desc")
  90. if filterValue != "" {
  91. d = d.Where("data LIKE ?", "%"+filterValue+"%")
  92. }
  93. err = d.Find(&c).Error
  94. for _, v := range c {
  95. list = append(list, v.Data)
  96. }
  97. default:
  98. err = errors.New("error table")
  99. }
  100. return list, err
  101. }
  102. func (sd *SqliteDb) QueryPage(table string, limit int, offset int, filterValue string) (data []string, err error) {
  103. list := make([]string, 0)
  104. switch table {
  105. case "rule":
  106. var r []Rule
  107. d := sd.db.Limit(limit).Offset(offset)
  108. if filterValue != "" {
  109. d = d.Where("data LIKE ?", "%"+filterValue+"%")
  110. }
  111. err = d.Order("id desc").Find(&r).Error
  112. for _, v := range r {
  113. list = append(list, v.Data)
  114. }
  115. case "cert":
  116. var c []Cert
  117. d := sd.db.Limit(limit).Offset(offset)
  118. if filterValue != "" {
  119. d = d.Where("data LIKE ?", "%"+filterValue+"%")
  120. }
  121. err = d.Order("id desc").Find(&c).Error
  122. for _, v := range c {
  123. list = append(list, v.Data)
  124. }
  125. default:
  126. err = errors.New("error table")
  127. }
  128. return list, err
  129. }
  130. func (sd *SqliteDb) Insert(table string, uuid string, data string) error {
  131. i, err := sd.GetTable(table, uuid, data)
  132. if err != nil {
  133. return err
  134. }
  135. return sd.db.Create(i).Error
  136. }
  137. func (sd *SqliteDb) Delete(table string, uuid string) error {
  138. i, err := sd.GetTable(table, uuid, "")
  139. if err != nil {
  140. return err
  141. }
  142. return sd.db.Where("uuid", uuid).Delete(i).Error
  143. }
  144. func (sd *SqliteDb) Update(table string, uuid string, data string) error {
  145. i, err := sd.GetTable(table, uuid, "")
  146. if err != nil {
  147. return err
  148. }
  149. return sd.db.Model(i).Where("uuid", uuid).Update("data", data).Error
  150. }
  151. func (sd *SqliteDb) Init() error {
  152. var err error
  153. newLogger := glog.New(
  154. log.New(dbLogger{}, "\r\n", log.LstdFlags),
  155. glog.Config{
  156. SlowThreshold: time.Second,
  157. LogLevel: glog.Silent,
  158. IgnoreRecordNotFoundError: true,
  159. Colorful: false,
  160. },
  161. )
  162. sd.db, err = gorm.Open(sqlite.Open(sd.Path), &gorm.Config{Logger: newLogger})
  163. if err != nil {
  164. return err
  165. }
  166. return sd.db.AutoMigrate(&Cert{}, &Rule{}, &Config{})
  167. }
  168. func (sd *SqliteDb) GetTable(table string, uuid string, data string) (i interface{}, err error) {
  169. switch table {
  170. case "rule":
  171. i = &Rule{Uuid: uuid, Data: data}
  172. case "cert":
  173. i = &Cert{Uuid: uuid, Data: data}
  174. default:
  175. err = errors.New("error table")
  176. }
  177. return
  178. }
  179. type Cert struct {
  180. ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
  181. Uuid string `gorm:"column:uuid" json:"uuid"`
  182. Data string `gorm:"column:data" json:"data"`
  183. }
  184. type Rule struct {
  185. ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
  186. Uuid string `gorm:"column:uuid" json:"uuid"`
  187. Data string `gorm:"column:data" json:"data"`
  188. }
  189. type Config struct {
  190. ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
  191. Key string `gorm:"column:key" json:"key"`
  192. Val string `gorm:"column:val" json:"val"`
  193. }