db.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package filedb
  2. import (
  3. "fmt"
  4. "gadmin/internal/admin/forms"
  5. "gadmin/utility"
  6. "sync"
  7. "github.com/google/btree"
  8. "github.com/spf13/cast"
  9. )
  10. type Node struct {
  11. Pk int64 `json:"pk"` // 索引
  12. Ref interface{} `json:"ref"` // 引用
  13. }
  14. type ider interface {
  15. ID() int64
  16. SetID(int64)
  17. }
  18. func (node *Node) Less(item btree.Item) bool {
  19. return node.Pk < (item.(*Node)).Pk
  20. }
  21. type Collection struct {
  22. AutoIncrement int64 `json:"ai"`
  23. Idx *btree.BTree `json:"-"`
  24. Data map[string]*forms.EmailItem `json:"data"`
  25. IdxMap map[string]*btree.BTree `json:"-"` // 索引
  26. lock sync.Mutex `json:"-"`
  27. Name string `json:"name"`
  28. }
  29. func NewCollection(name string) *Collection {
  30. return &Collection{
  31. AutoIncrement: 1,
  32. Idx: btree.New(2),
  33. Name: name,
  34. Data: make(map[string]*forms.EmailItem, 0),
  35. }
  36. }
  37. func (db *Collection) LoadDb() (err error) {
  38. err = utility.LoadDb(&db.lock, db.Name, db)
  39. if err != nil {
  40. return err
  41. }
  42. for k, v := range db.Data {
  43. if v == nil {
  44. delete(db.Data, k)
  45. db.Idx.Delete(&Node{Pk: cast.ToInt64(k)})
  46. } else {
  47. db.Idx.ReplaceOrInsert(&Node{Pk: cast.ToInt64(k)})
  48. }
  49. }
  50. return
  51. }
  52. func (db *Collection) SaveDb() error {
  53. return utility.SaveDb(&db.lock, db, db.Name)
  54. }
  55. func (db *Collection) Add(row *forms.EmailItem) error {
  56. db.lock.Lock()
  57. defer db.lock.Unlock()
  58. if row.Id == 0 {
  59. row.SetID(db.AutoIncrement)
  60. }
  61. db.Data[cast.ToString(row.Id)] = row
  62. db.AutoIncrement++
  63. db.Idx.ReplaceOrInsert(&Node{Pk: row.ID()})
  64. return nil
  65. }
  66. func (db *Collection) Remove(Id int64) error {
  67. if item := db.Idx.Delete(&Node{Pk: Id}); item == nil {
  68. return fmt.Errorf("不存在该值")
  69. }
  70. delete(db.Data, cast.ToString(Id))
  71. return nil
  72. }
  73. func (db *Collection) All() (data []interface{}, err error) {
  74. db.Idx.Descend(func(i btree.Item) bool {
  75. id := i.(*Node).Pk
  76. if item, ok := db.Data[cast.ToString(id)]; ok {
  77. data = append(data, item)
  78. }
  79. return true
  80. })
  81. return
  82. }
  83. func (db *Collection) Find(id int64) (data interface{}, err error) {
  84. db.lock.Lock()
  85. defer db.lock.Unlock()
  86. item := db.Idx.Get(&Node{Pk: id})
  87. if v, ok := item.(*Node); ok {
  88. data = db.Data[cast.ToString(v.Pk)]
  89. }
  90. return
  91. }