|
|
@@ -2,7 +2,6 @@ package modules
|
|
2
|
2
|
|
|
3
|
3
|
import (
|
|
4
|
4
|
"errors"
|
|
5
|
|
- "fmt"
|
|
6
|
5
|
)
|
|
7
|
6
|
|
|
8
|
7
|
type sub_manager struct {
|
|
|
@@ -10,33 +9,35 @@ type sub_manager struct {
|
|
10
|
9
|
list NameList
|
|
11
|
10
|
|
|
12
|
11
|
/* sub# 관리 */
|
|
13
|
|
- count_sub int // Subscription #
|
|
14
|
|
- emptylist []int // To administrate sub #
|
|
15
|
|
- num2sub map[int]MsgUnit // num2sub[sub#] = msg
|
|
16
|
|
- sub2num map[MsgUnit]int // delete시에 관리를 위해
|
|
17
|
|
- israngesub map[int]bool // delete시에 관리를 위해
|
|
|
12
|
+ count_sub int // Subscription #
|
|
|
13
|
+ emptylist []int // To administrate sub #
|
|
|
14
|
+ sub2ip map[int]string // sub2ip[sub#] = ip
|
|
|
15
|
+ ip2sub map[string][]int // ip2sub[ip]= sub#...
|
|
|
16
|
+ sub2node map[int][]*Node // sub2node[sub#] = node_addr
|
|
|
17
|
+ israngesub map[int]bool // delete시에 관리를 위해
|
|
18
|
18
|
}
|
|
19
|
19
|
|
|
20
|
20
|
// ### To Insert sub#
|
|
21
|
21
|
func (manager *sub_manager) add_subscription(msg MsgUnit) error {
|
|
22
|
22
|
|
|
23
|
|
- name := msg.(*SubscriptionMsg).subscription
|
|
|
23
|
+ topic := msg.(*SubscriptionMsg).topic
|
|
24
|
24
|
value := msg.(*SubscriptionMsg).value
|
|
|
25
|
+ operator := msg.(*SubscriptionMsg).operator
|
|
25
|
26
|
subnumber := 0
|
|
26
|
27
|
|
|
27
|
|
- fmt.Println("name = ", name, " value = ", value) // for debugging
|
|
|
28
|
+ //fmt.Println("message = ", msg)
|
|
28
|
29
|
|
|
29
|
30
|
// * 1. 들어온 Msg -> sub#, sub# -> Msg로 매핑
|
|
30
|
31
|
if len(manager.emptylist) == 0 {
|
|
31
|
|
- manager.num2sub[manager.count_sub] = msg
|
|
32
|
|
- manager.sub2num[msg] = manager.count_sub
|
|
|
32
|
+ manager.sub2ip[manager.count_sub] = msg.(*SubscriptionMsg).from
|
|
|
33
|
+ manager.ip2sub[msg.(*SubscriptionMsg).from] = append(manager.ip2sub[msg.(*SubscriptionMsg).from], manager.count_sub)
|
|
33
|
34
|
subnumber = manager.count_sub
|
|
34
|
35
|
manager.count_sub++
|
|
35
|
36
|
} else {
|
|
36
|
37
|
subidx := manager.emptylist[len(manager.emptylist)-1]
|
|
37
|
38
|
manager.emptylist = manager.emptylist[:len(manager.emptylist)-1]
|
|
38
|
|
- manager.num2sub[subidx] = msg
|
|
39
|
|
- manager.sub2num[msg] = subidx
|
|
|
39
|
+ manager.sub2ip[subidx] = msg.(*SubscriptionMsg).from
|
|
|
40
|
+ manager.ip2sub[msg.(*SubscriptionMsg).from] = append(manager.ip2sub[msg.(*SubscriptionMsg).from], subidx)
|
|
40
|
41
|
subnumber = subidx
|
|
41
|
42
|
}
|
|
42
|
43
|
|
|
|
@@ -47,89 +48,164 @@ func (manager *sub_manager) add_subscription(msg MsgUnit) error {
|
|
47
|
48
|
//namelist에서 name찾고, 없으면 추가
|
|
48
|
49
|
for nameptr != nil {
|
|
49
|
50
|
// * compare함수 구현되기 전 임시로 끼워넣은 것 (이 부분은 secure.go 완성되면 다시 확인)
|
|
50
|
|
- if compare(nameptr.name, name) == 1 {
|
|
|
51
|
+ if compare(nameptr.topic, topic) == 0 {
|
|
51
|
52
|
findOk = true
|
|
52
|
53
|
break
|
|
53
|
54
|
}
|
|
54
|
55
|
nameptr = nameptr.next
|
|
55
|
56
|
}
|
|
56
|
57
|
|
|
57
|
|
- if findOk == false {
|
|
58
|
|
- newNode := &NameNode{name, nil, List{}}
|
|
|
58
|
+ if !findOk {
|
|
|
59
|
+ newNode := &NameNode{topic, nil, nil, List{}}
|
|
59
|
60
|
manager.list.tail.next = newNode
|
|
60
|
61
|
manager.list.tail = newNode
|
|
61
|
62
|
manager.list.size++
|
|
62
|
63
|
nameptr = manager.list.tail
|
|
63
|
64
|
}
|
|
64
|
65
|
|
|
65
|
|
- // * --- 가정 ---
|
|
66
|
|
- // * 데이터의 value형식은 아래의 두 개 꼴로만 들어온다고 가정
|
|
67
|
|
- // * (1). {enc(val), op} == 부등식
|
|
68
|
|
- // * -> (ex) {2, '<'} , { "baseball", == }
|
|
69
|
|
- // * (2). {부등식, '&&', 부등식} or {부등식, '||', 부등식}
|
|
70
|
|
- // * -> (ex1) {2, '<=', '&&', 3 , '>'} == {2 <= x < 3}
|
|
71
|
|
- // * (ex2) {12, '<', '||', 5 , '>'} == {12 < x || x < 5}
|
|
72
|
|
- // * -------------
|
|
73
|
|
-
|
|
74
|
66
|
// list[name]에 value추가
|
|
75
|
|
- if len(value) == 2 { // 단일 식이라면 (single)
|
|
76
|
|
- valptr := nameptr.list.getPos(conv(value[0]))
|
|
77
|
|
- if valptr == nil{
|
|
78
|
|
- nameptr.list.add_ValueNode(value[0], value[1], subnumber, true)
|
|
79
|
|
- } else{
|
|
80
|
|
- valptr.insert_Sub(value[1], subnumber, true)
|
|
|
67
|
+ if len(operator) == 1 { // 단일 식이라면 (single)
|
|
|
68
|
+ valptr := nameptr.list.getPos(value)
|
|
|
69
|
+ if valptr == nil {
|
|
|
70
|
+ nameptr.list.add_ValueNode(value)
|
|
|
71
|
+ valptr = nameptr.list.tail
|
|
81
|
72
|
}
|
|
|
73
|
+
|
|
|
74
|
+ manager.sub2node[subnumber] = append(manager.sub2node[subnumber], valptr)
|
|
|
75
|
+ valptr.insert_Sub(operator[0], subnumber, true)
|
|
|
76
|
+
|
|
82
|
77
|
return nil // add_subscription ok
|
|
83
|
78
|
} else {
|
|
84
|
|
- // rangesub check
|
|
85
|
|
- manager.israngesub[subnumber] = true
|
|
86
|
79
|
|
|
87
|
80
|
// '&&' , '||'로 묶여 있는 복합식에 대하여
|
|
88
|
|
- logical_operator := value[2]
|
|
|
81
|
+ logical_operator := operator[1]
|
|
89
|
82
|
|
|
90
|
83
|
// find(namelist[name].list.val == value)인 노드
|
|
91
|
|
- valptr1 := nameptr.list.getPos(conv(value[0]))
|
|
92
|
|
- valptr2 := nameptr.list.getPos(conv(value[3]))
|
|
|
84
|
+ // * 이 부분 다시 봐야함..
|
|
|
85
|
+ valptr1 := nameptr.list.getPos(value)
|
|
|
86
|
+ valptr2 := nameptr.list.getPos(value)
|
|
|
87
|
+
|
|
|
88
|
+ if valptr1 == nil {
|
|
|
89
|
+ nameptr.list.add_ValueNode(value)
|
|
|
90
|
+ valptr1 = nameptr.list.tail
|
|
|
91
|
+ }
|
|
|
92
|
+ if valptr2 == nil {
|
|
|
93
|
+ nameptr.list.add_ValueNode(value)
|
|
|
94
|
+ valptr2 = nameptr.list.tail
|
|
|
95
|
+ }
|
|
|
96
|
+
|
|
|
97
|
+ manager.sub2node[subnumber] = append(manager.sub2node[subnumber], valptr1)
|
|
|
98
|
+ manager.sub2node[subnumber] = append(manager.sub2node[subnumber], valptr2)
|
|
93
|
99
|
|
|
94
|
100
|
if logical_operator == "&&" { // '&&'로 묶여있다면
|
|
95
|
|
- if valptr1 != nil && valptr2 != nil { // val1, val2를 갖는 노드가 둘 다 존재
|
|
96
|
|
- valptr1.insert_Sub(value[1], subnumber, false)
|
|
97
|
|
- valptr2.insert_Sub(value[4], subnumber, false)
|
|
98
|
|
- }
|
|
99
|
|
- if valptr1 == nil {
|
|
100
|
|
- nameptr.list.add_ValueNode(value[0], value[1], subnumber, false)
|
|
101
|
|
- }
|
|
102
|
|
- if valptr2 == nil {
|
|
103
|
|
- nameptr.list.add_ValueNode(value[3], value[4], subnumber, false)
|
|
104
|
|
- }
|
|
|
101
|
+ // rangesub check
|
|
|
102
|
+ manager.israngesub[subnumber] = true
|
|
|
103
|
+ valptr1.insert_Sub(operator[0], subnumber, false)
|
|
|
104
|
+ valptr2.insert_Sub(operator[2], subnumber, false)
|
|
|
105
|
+
|
|
105
|
106
|
} else {
|
|
106
|
107
|
// '||'로 묶여 있다면 두 식 모두 single로 처리가능
|
|
107
|
|
- if valptr1 != nil && valptr2 != nil { // val1, val2를 갖는 노드가 둘 다 존재
|
|
108
|
|
- valptr1.insert_Sub(value[1], subnumber, true)
|
|
109
|
|
- valptr2.insert_Sub(value[4], subnumber, true)
|
|
110
|
|
- }
|
|
111
|
|
- if valptr1 == nil {
|
|
112
|
|
- nameptr.list.add_ValueNode(value[0], value[1], subnumber, true)
|
|
113
|
|
- }
|
|
114
|
|
- if valptr2 == nil {
|
|
115
|
|
- nameptr.list.add_ValueNode(value[3], value[4], subnumber, true)
|
|
116
|
|
- }
|
|
|
108
|
+ valptr1.insert_Sub(operator[0], subnumber, true)
|
|
|
109
|
+ valptr2.insert_Sub(operator[2], subnumber, true)
|
|
117
|
110
|
}
|
|
118
|
111
|
return nil // add_subscription ok
|
|
119
|
112
|
}
|
|
120
|
113
|
return errors.New("Can't add_subscription")
|
|
121
|
114
|
}
|
|
122
|
115
|
|
|
123
|
|
-// * ### To delete sub#
|
|
124
|
|
-func (manager *sub_manager) delete(subnumber int) error {
|
|
125
|
|
- s := errors.New("!23")
|
|
126
|
|
- return s
|
|
127
|
|
-}
|
|
128
|
|
-
|
|
129
|
|
-// * string형태로 암호화 되어있는 value -> int64[]로 변환(임시)
|
|
130
|
|
-func conv(val string) []int64 {
|
|
131
|
|
- ret := make([]int64, len(val))
|
|
132
|
|
- return ret
|
|
|
116
|
+// * To delete subscription
|
|
|
117
|
+func (manager *sub_manager) delete(from string) error {
|
|
|
118
|
+
|
|
|
119
|
+ ip := from
|
|
|
120
|
+ cand := manager.ip2sub[ip]
|
|
|
121
|
+
|
|
|
122
|
+ for i := 0; i < len(cand); i++ {
|
|
|
123
|
+
|
|
|
124
|
+ sub := cand[i]
|
|
|
125
|
+ node := manager.sub2node[sub]
|
|
|
126
|
+
|
|
|
127
|
+ if manager.israngesub[sub] {
|
|
|
128
|
+ for j := 0; j < len(node); j++ {
|
|
|
129
|
+ pos := findSub(node[j].range2sub_s, sub)
|
|
|
130
|
+ if pos != -1 {
|
|
|
131
|
+ node[j].range2sub_s = remove(node[j].range2sub_s, pos)
|
|
|
132
|
+ manager.emptylist = append(manager.emptylist, sub)
|
|
|
133
|
+ }
|
|
|
134
|
+
|
|
|
135
|
+ pos = findSub(node[j].range2sub_es, sub)
|
|
|
136
|
+ if pos != -1 {
|
|
|
137
|
+ node[j].range2sub_es = remove(node[j].range2sub_es, pos)
|
|
|
138
|
+ manager.emptylist = append(manager.emptylist, sub)
|
|
|
139
|
+ }
|
|
|
140
|
+
|
|
|
141
|
+ pos = findSub(node[j].range2sub_b, sub)
|
|
|
142
|
+ if pos != -1 {
|
|
|
143
|
+ node[j].range2sub_b = remove(node[j].range2sub_b, pos)
|
|
|
144
|
+ manager.emptylist = append(manager.emptylist, sub)
|
|
|
145
|
+ }
|
|
|
146
|
+
|
|
|
147
|
+ pos = findSub(node[j].range2sub_eb, sub)
|
|
|
148
|
+ if pos != -1 {
|
|
|
149
|
+ node[j].range2sub_eb = remove(node[j].range2sub_eb, pos)
|
|
|
150
|
+ manager.emptylist = append(manager.emptylist, sub)
|
|
|
151
|
+ }
|
|
|
152
|
+
|
|
|
153
|
+ // node가 비어있으면 delete
|
|
|
154
|
+ isempty := node[j].isempty()
|
|
|
155
|
+ if isempty && node[j] != nil {
|
|
|
156
|
+ prev_node := node[j].prev
|
|
|
157
|
+ next_node := node[j].next
|
|
|
158
|
+
|
|
|
159
|
+ prev_node.next = node[j].next
|
|
|
160
|
+ next_node.prev = node[j].prev
|
|
|
161
|
+ }
|
|
|
162
|
+ }
|
|
|
163
|
+ } else {
|
|
|
164
|
+ for j := 0; j < len(node); j++ {
|
|
|
165
|
+ pos := findSub(node[j].single2sub_s, sub)
|
|
|
166
|
+ if pos != -1 {
|
|
|
167
|
+ node[j].single2sub_s = remove(node[j].single2sub_s, pos)
|
|
|
168
|
+ manager.emptylist = append(manager.emptylist, sub)
|
|
|
169
|
+ }
|
|
|
170
|
+
|
|
|
171
|
+ pos = findSub(node[j].single2sub_es, sub)
|
|
|
172
|
+ if pos != -1 {
|
|
|
173
|
+ node[j].single2sub_es = remove(node[j].single2sub_es, pos)
|
|
|
174
|
+ manager.emptylist = append(manager.emptylist, sub)
|
|
|
175
|
+ }
|
|
|
176
|
+
|
|
|
177
|
+ pos = findSub(node[j].single2sub_b, sub)
|
|
|
178
|
+ if pos != -1 {
|
|
|
179
|
+ node[j].single2sub_b = remove(node[j].single2sub_b, pos)
|
|
|
180
|
+ manager.emptylist = append(manager.emptylist, sub)
|
|
|
181
|
+ }
|
|
|
182
|
+
|
|
|
183
|
+ pos = findSub(node[j].single2sub_eb, sub)
|
|
|
184
|
+ if pos != -1 {
|
|
|
185
|
+ node[j].single2sub_eb = remove(node[j].single2sub_eb, pos)
|
|
|
186
|
+ manager.emptylist = append(manager.emptylist, sub)
|
|
|
187
|
+ }
|
|
|
188
|
+
|
|
|
189
|
+ pos = findSub(node[j].single2sub_e, sub)
|
|
|
190
|
+ if pos != -1 {
|
|
|
191
|
+ node[j].single2sub_e = remove(node[j].single2sub_e, pos)
|
|
|
192
|
+ manager.emptylist = append(manager.emptylist, sub)
|
|
|
193
|
+ }
|
|
|
194
|
+
|
|
|
195
|
+ isempty := node[j].isempty()
|
|
|
196
|
+ // node가 비어있으면 delete
|
|
|
197
|
+ if isempty && node[j] != nil {
|
|
|
198
|
+ prev_node := node[j].prev
|
|
|
199
|
+ next_node := node[j].next
|
|
|
200
|
+
|
|
|
201
|
+ prev_node.next = node[j].next
|
|
|
202
|
+ next_node.prev = node[j].prev
|
|
|
203
|
+ }
|
|
|
204
|
+ }
|
|
|
205
|
+ }
|
|
|
206
|
+ }
|
|
|
207
|
+ manager.ip2sub[ip]=nil
|
|
|
208
|
+ return nil
|
|
133
|
209
|
}
|
|
134
|
210
|
|
|
135
|
211
|
// * 암호화된 두 value 비교함수 (임시)
|