dict_rec.go 2.4 KB

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