Project Moscato Team Messaging Middleware Implemetation Message Middleware by Golang Operate as Secure, Effectively
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

subscription.go 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package modules
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. type sub_manager struct {
  7. // NameList의 노드들이 각각의 list를 갖음
  8. list NameList
  9. /* sub# 관리 */
  10. count_sub int // Subscription #
  11. emptylist []int // To administrate sub #
  12. num2sub map[int]MsgUnit // num2sub[sub#] = msg
  13. sub2num map[MsgUnit]int // delete시에 관리를 위해
  14. israngesub map[int]bool // delete시에 관리를 위해
  15. }
  16. // ### To Insert sub#
  17. func (manager *sub_manager) add_subscription(msg MsgUnit) error {
  18. name := msg.(*SubscriptionMsg).subscription
  19. value := msg.(*SubscriptionMsg).value
  20. subnumber := 0
  21. fmt.Println("name = ", name, " value = ", value) // for debuging
  22. // * 1. 들어온 Msg -> sub#, sub# -> Msg로 매핑
  23. if len(manager.emptylist) == 0 {
  24. manager.num2sub[manager.count_sub] = msg
  25. manager.sub2num[msg] = manager.count_sub
  26. subnumber = manager.count_sub
  27. manager.count_sub++
  28. } else {
  29. subidx := manager.emptylist[len(manager.emptylist)-1]
  30. manager.emptylist = manager.emptylist[:len(manager.emptylist)-1]
  31. manager.num2sub[subidx] = msg
  32. manager.sub2num[msg] = subidx
  33. subnumber = subidx
  34. }
  35. // * 2. value가 연산식인지 확인
  36. isformula := check_Subtype(value)
  37. // * 3. Sub 추가
  38. nameidx := manager.list.head
  39. findOk := false
  40. // * namelist에서 name찾고, 없으면 추가
  41. for nameidx != nil {
  42. // * compare함수 구현되기 전 임시로 끼어넣은 것 (이 부분은 secure.go 완성되면 다시 확인)
  43. if compare(nameidx.name, name) == 1 {
  44. findOk = true
  45. break
  46. }
  47. nameidx = nameidx.next
  48. }
  49. newNode := &NameNode{name, nil, List{}}
  50. if findOk == false {
  51. manager.list.tail.next = newNode
  52. manager.list.tail = newNode
  53. manager.list.size++
  54. nameidx = manager.list.tail
  55. }
  56. // * list[name]에 value추가
  57. if isformula == false { // 단순 매칭이라면
  58. valptr := nameidx.list.head
  59. for valptr != nil {
  60. // * 이 부분도 compare함수 구현하면 다시봐야함
  61. if compare(valptr.val, conv(value)) == 1{ // value와 같은 val을 갖는 노드가 존재한다면
  62. valptr.single2sub_e = append(valptr.single2sub_e, subnumber)
  63. return nil // 제대로 insert된 것
  64. }
  65. valptr=valptr.next
  66. }
  67. // value와 일치하는 노드가 x -> 추가
  68. newValNode := & Node{conv(value)}
  69. newValNode.single2sub_e = append(newValNode.single2sub_e, subnumber)
  70. nameidx.list.tail.next = newValNode
  71. nameidx.list.tail = newValNode
  72. nameidx.list.size++
  73. } else{ // 연산식이라면
  74. }
  75. return nil
  76. }
  77. // * string형태로 암호화 되어있는 value -> int64[]로 변환(임시)
  78. func conv(val string) []int64{
  79. var ret := [] int64
  80. return ret
  81. }
  82. // * 암호화된 두 value 비교함수 (임시)
  83. func compare(v1 []int64, v2 []int64) int {
  84. return 1
  85. }
  86. // * ### To delete sub#
  87. func (manager *sub_manager) delete(subnumber int) error {
  88. s := errors.New("!23")
  89. return s
  90. }
  91. func check_Subtype(value []string) bool {
  92. if len(value) == 1 {
  93. return false
  94. } else {
  95. return true
  96. }
  97. }