dict_rec.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. dict map[rec_key.ARecKey]rec_kv.IRecKvFix
  22. block *d0.MSafeMutex
  23. }
  24. // NewDictRec -- создание нового потокобезопасного словаря KV.
  25. func NewDictRec() *DictRec {
  26. sf := &DictRec{
  27. dict: map[rec_key.ARecKey]rec_kv.IRecKvFix{},
  28. block: d0.MutSafeMutex(),
  29. }
  30. _ = IDictRec(sf)
  31. return sf
  32. }
  33. // Get -- получение значения по ключу.
  34. func (sf *DictRec) Get(key rec_key.IRecKeyFix) *d0.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 d0.NewNone[rec_kv.IRecKvFix]()
  40. }
  41. return d0.NewSome(rec)
  42. }
  43. // Set -- установка значения по ключу.
  44. func (sf *DictRec) Set(rec rec_kv.IRecKvFix) *d0.Result[d0.Bool] {
  45. if rec == nil {
  46. err := d0.LetErr("DictRec.Set(): rec is nil")
  47. return d0.ResErr[d0.Bool](err)
  48. }
  49. sf.block.Lock()
  50. defer sf.block.Unlock()
  51. sf.dict[rec.Key().Get()] = rec
  52. return d0.ResOk(d0.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() d0.Num {
  62. sf.block.RLock()
  63. defer sf.block.RUnlock()
  64. return d0.Num(len(sf.dict))
  65. }