dict_rec.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // package dict_rec -- потокобезопасный словарь KV-бакета.
  2. package dict_rec
  3. import (
  4. "sync"
  5. "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_key"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_kv"
  8. )
  9. // IDictRec -- интерфейс потокобезопасного словаря KV-бакета.
  10. type IDictRec interface {
  11. // Get -- возвращает значение по ключу
  12. Get(key rec_key.IRecKeyFix) *lev0.Option[rec_kv.IRecKvFix]
  13. // Set -- устанавливает значение по ключу
  14. Set(val rec_kv.IRecKvFix) *lev0.Result[lev0.Bool]
  15. // Del -- удаляет значение по ключу
  16. Del(key rec_key.IRecKeyFix)
  17. // Len -- возвращает количество записей
  18. Len() lev0.Num
  19. }
  20. // DictRec -- потокобезопасный словарь KV-бакета.
  21. type DictRec struct {
  22. dict map[rec_key.ARecKey]rec_kv.IRecKvFix
  23. block sync.RWMutex
  24. }
  25. // NewDictRec -- создание нового потокобезопасного словаря KV.
  26. func NewDictRec() *DictRec {
  27. sf := &DictRec{
  28. dict: map[rec_key.ARecKey]rec_kv.IRecKvFix{},
  29. }
  30. _ = IDictRec(sf)
  31. return sf
  32. }
  33. // Get -- получение значения по ключу.
  34. func (sf *DictRec) Get(key rec_key.IRecKeyFix) *lev0.Option[rec_kv.IRecKvFix] {
  35. sf.block.RLock()
  36. defer sf.block.RUnlock()
  37. rec, isOk := sf.dict[key.Get()]
  38. if !isOk {
  39. return lev0.NewNone[rec_kv.IRecKvFix]()
  40. }
  41. return lev0.NewSome(rec)
  42. }
  43. // Set -- установка значения по ключу.
  44. func (sf *DictRec) Set(rec rec_kv.IRecKvFix) *lev0.Result[lev0.Bool] {
  45. if rec == nil {
  46. err := lev0.LetErr("DictRec.Set(): rec is nil")
  47. return lev0.ResErr[lev0.Bool](err)
  48. }
  49. sf.block.Lock()
  50. defer sf.block.Unlock()
  51. sf.dict[rec.Key().Get()] = rec
  52. return lev0.ResOk(lev0.Bool(true))
  53. }
  54. // Del -- удаление значения по ключу.
  55. func (sf *DictRec) Del(key rec_key.IRecKeyFix) {
  56. sf.block.Lock()
  57. defer sf.block.Unlock()
  58. delete(sf.dict, key.Get())
  59. }
  60. // Len -- количество элементов в словаре.
  61. func (sf *DictRec) Len() lev0.Num {
  62. sf.block.RLock()
  63. defer sf.block.RUnlock()
  64. return lev0.Num(len(sf.dict))
  65. }