Project Moscato Team Messaging Middleware Implemetation Message Middleware by Golang Operate as Secure, Effectively
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

subscription.go 4.0KB

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