db.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package db
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "log"
  6. be "spider_creator/backend"
  7. "github.com/boltdb/bolt"
  8. )
  9. // 在新增表的时候,需要在这里增加实体清单
  10. type Entity interface {
  11. be.SpiderConfig | be.Job
  12. }
  13. var (
  14. // 在新增表的时候,需要在这里增加表名
  15. DB_TABLES = []string{"myBucket", "jobs", "spiderconfig", "systemconfig"}
  16. Db *SpiderDb
  17. )
  18. type (
  19. //SpiderDB 爬虫库,这里模拟真实数据库
  20. SpiderDb struct {
  21. db *bolt.DB
  22. enf be.EventNotifyFace
  23. }
  24. )
  25. // NewSpiderDb
  26. func NewSpiderDb(dbfile string, enf be.EventNotifyFace) *SpiderDb {
  27. db, err := bolt.Open(dbfile, 0600, nil)
  28. if err != nil {
  29. log.Println("db error", err.Error())
  30. }
  31. for _, t := range DB_TABLES {
  32. err = db.Update(func(tx *bolt.Tx) error {
  33. _, err := tx.CreateBucketIfNotExists([]byte(t))
  34. return err
  35. })
  36. if err != nil {
  37. log.Println("db error", err.Error())
  38. }
  39. }
  40. return &SpiderDb{
  41. db, enf,
  42. }
  43. }
  44. // Close
  45. func (s *SpiderDb) Close() {
  46. s.db.Close()
  47. }
  48. // 支持泛型的通用方法
  49. // LoadEntity
  50. func LoadEntity[T any](table, key string) (*T, error) {
  51. var ret *T = new(T)
  52. err := Db.db.View(func(tx *bolt.Tx) error {
  53. bucket := tx.Bucket([]byte(table))
  54. value := bucket.Get([]byte(key))
  55. if value != nil && len(value) > 0 {
  56. _ = json.Unmarshal(value, ret)
  57. }
  58. return nil
  59. })
  60. if err != nil {
  61. return nil, err
  62. }
  63. return ret, nil
  64. }
  65. // LoadEntities
  66. func LoadEntities[T1 Entity](table string) ([]*T1, error) {
  67. ret := make([]*T1, 0)
  68. // 开始读取事务
  69. err := Db.db.View(func(tx *bolt.Tx) error {
  70. // 遍历数据库中的所有桶
  71. bucket := tx.Bucket([]byte(table))
  72. if bucket == nil {
  73. return errors.New("桶不存在")
  74. }
  75. // 遍历桶中的所有键/值对
  76. return bucket.ForEach(func(k, v []byte) error {
  77. var sf = new(T1)
  78. json.Unmarshal(v, sf)
  79. if sf != nil {
  80. ret = append(ret, sf)
  81. }
  82. return nil
  83. })
  84. })
  85. if err != nil {
  86. return ret, err
  87. }
  88. return ret, nil
  89. }
  90. // DeleteEntity
  91. func DeleteEntity[T any](table, key string) error {
  92. return Db.db.Update(func(tx *bolt.Tx) error {
  93. bucket := tx.Bucket([]byte(table))
  94. return bucket.Delete([]byte(key))
  95. })
  96. }
  97. // SaveEntity
  98. func SaveEntity[T any](table, key string, obj *T) error {
  99. //加载原始数据
  100. value, _ := json.Marshal(obj)
  101. return Db.db.Update(func(tx *bolt.Tx) error {
  102. bucket := tx.Bucket([]byte(table))
  103. err := bucket.Put([]byte(key), value)
  104. return err
  105. })
  106. }