dict_rec.go 2.3 KB

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