Project Moscato Team Messaging Middleware Implemetation Message Middleware by Golang Operate as Secure, Effectively
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

subscription.go 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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 debugging
  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. Sub 추가
  36. nameptr := manager.list.head
  37. findOk := false
  38. //namelist에서 name찾고, 없으면 추가
  39. for nameptr != nil {
  40. // * compare함수 구현되기 전 임시로 끼어넣은 것 (이 부분은 secure.go 완성되면 다시 확인)
  41. if compare(nameptr.name, name) == 1 {
  42. findOk = true
  43. break
  44. }
  45. nameptr = nameptr.next
  46. }
  47. if findOk == false {
  48. newNode := &NameNode{name, nil, List{}}
  49. manager.list.tail.next = newNode
  50. manager.list.tail = newNode
  51. manager.list.size++
  52. nameptr = manager.list.tail
  53. }
  54. // * --- 가정 ---
  55. // * 데이터의 value형식은 아래의 두 개 꼴로만 들어온다고 가정
  56. // * (1). {enc(val), op} == 부등식
  57. // * -> (ex) {2, '<'} , { "baseball", == }
  58. // * (2). {부등식, '&&', 부등식} or {부등식, '||', 부등식}
  59. // * -> (ex1) {2, '<=', '&&', 3 , '>'} == {2 <= x < 3}
  60. // * (ex2) {12, '<', '||', 5 , '>'} == {12 < x || x < 5}
  61. // * -------------
  62. // list[name]에 value추가
  63. if len(value) == 2 { // 단일 식이라면 (single)
  64. valptr := nameptr.list.head
  65. for valptr != nil {
  66. // * 이 부분도 compare함수 구현하면 다시봐야함
  67. if compare(valptr.val, conv(value[0])) == 1 { // value와 같은 val을 갖는 노드가 존재한다면
  68. valptr.insert_Sub(value[1], subnumber, true)
  69. return nil // add_subscription ok
  70. }
  71. valptr = valptr.next
  72. }
  73. // value와 일치하는 노드가 x -> 추가
  74. nameptr.list.add_ValueNode(value[0], value[1], subnumber, true)
  75. return nil // add_subscription ok
  76. } else {
  77. // rangesub check
  78. manager.israngesub[subnumber] = true
  79. // '&&' , '||'로 묶여 있는 복합식에 대하여
  80. logical_operator := value[2]
  81. // find(namelist[name].list.val == value)인 노드
  82. valptr1 := nameptr.list.getPos(conv(value[0]))
  83. valptr2 := nameptr.list.getPos(conv(value[3]))
  84. if logical_operator == "&&" { // '&&'로 묶여있다면
  85. if valptr1 != nil && valptr2 != nil { // val1, val2를 갖는 노드가 둘 다 존재
  86. valptr1.insert_Sub(value[1], subnumber, false)
  87. valptr2.insert_Sub(value[4], subnumber, false)
  88. }
  89. if valptr1 == nil {
  90. nameptr.list.add_ValueNode(value[0], value[1], subnumber, false)
  91. }
  92. if valptr2 == nil {
  93. nameptr.list.add_ValueNode(value[3], value[4], subnumber, false)
  94. }
  95. } else {
  96. // '||'로 묶여 있다면 두 식 모두 single로 처리가능
  97. if valptr1 != nil && valptr2 != nil { // val1, val2를 갖는 노드가 둘 다 존재
  98. valptr1.insert_Sub(value[1], subnumber, true)
  99. valptr2.insert_Sub(value[4], subnumber, true)
  100. }
  101. if valptr1 == nil {
  102. nameptr.list.add_ValueNode(value[0], value[1], subnumber, true)
  103. }
  104. if valptr2 == nil {
  105. nameptr.list.add_ValueNode(value[3], value[4], subnumber, true)
  106. }
  107. }
  108. return nil
  109. }
  110. return errors.New("Can't add_subscription")
  111. }
  112. // * ### To delete sub#
  113. func (manager *sub_manager) delete(subnumber int) error {
  114. s := errors.New("!23")
  115. return s
  116. }
  117. // * string형태로 암호화 되어있는 value -> int64[]로 변환(임시)
  118. func conv(val string) []int64 {
  119. ret := make([]int64, len(val))
  120. return ret
  121. }
  122. // * 암호화된 두 value 비교함수 (임시)
  123. func compare(v1 []int64, v2 []int64) int {
  124. return 1
  125. }