Project Moscato Team Messaging Middleware Implemetation Message Middleware by Golang Operate as Secure, Effectively
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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. }