Project Moscato Team Messaging Middleware Implemetation Message Middleware by Golang Operate as Secure, Effectively
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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.getPos(conv(value[0]))
  65. if valptr == nil{
  66. nameptr.list.add_ValueNode(value[0], value[1], subnumber, true)
  67. } else{
  68. valptr.insert_Sub(value[1], subnumber, true)
  69. }
  70. return nil // add_subscription ok
  71. } else {
  72. // rangesub check
  73. manager.israngesub[subnumber] = true
  74. // '&&' , '||'로 묶여 있는 복합식에 대하여
  75. logical_operator := value[2]
  76. // find(namelist[name].list.val == value)인 노드
  77. valptr1 := nameptr.list.getPos(conv(value[0]))
  78. valptr2 := nameptr.list.getPos(conv(value[3]))
  79. if logical_operator == "&&" { // '&&'로 묶여있다면
  80. if valptr1 != nil && valptr2 != nil { // val1, val2를 갖는 노드가 둘 다 존재
  81. valptr1.insert_Sub(value[1], subnumber, false)
  82. valptr2.insert_Sub(value[4], subnumber, false)
  83. }
  84. if valptr1 == nil {
  85. nameptr.list.add_ValueNode(value[0], value[1], subnumber, false)
  86. }
  87. if valptr2 == nil {
  88. nameptr.list.add_ValueNode(value[3], value[4], subnumber, false)
  89. }
  90. } else {
  91. // '||'로 묶여 있다면 두 식 모두 single로 처리가능
  92. if valptr1 != nil && valptr2 != nil { // val1, val2를 갖는 노드가 둘 다 존재
  93. valptr1.insert_Sub(value[1], subnumber, true)
  94. valptr2.insert_Sub(value[4], subnumber, true)
  95. }
  96. if valptr1 == nil {
  97. nameptr.list.add_ValueNode(value[0], value[1], subnumber, true)
  98. }
  99. if valptr2 == nil {
  100. nameptr.list.add_ValueNode(value[3], value[4], subnumber, true)
  101. }
  102. }
  103. return nil // add_subscription ok
  104. }
  105. return errors.New("Can't add_subscription")
  106. }
  107. // * ### To delete sub#
  108. func (manager *sub_manager) delete(subnumber int) error {
  109. s := errors.New("!23")
  110. return s
  111. }
  112. // * string형태로 암호화 되어있는 value -> int64[]로 변환(임시)
  113. func conv(val string) []int64 {
  114. ret := make([]int64, len(val))
  115. return ret
  116. }
  117. // * 암호화된 두 value 비교함수 (임시)
  118. func compare(v1 []int64, v2 []int64) int {
  119. return 1
  120. }