extra1563 4 лет назад
Родитель
Сommit
f893f71d35
1 измененных файлов: 43 добавлений и 45 удалений
  1. 43
    45
      src/broker/modules/subscription.go

+ 43
- 45
src/broker/modules/subscription.go Просмотреть файл

2
 
2
 
3
 import (
3
 import (
4
 	"errors"
4
 	"errors"
5
-	"fmt"
6
 )
5
 )
7
 
6
 
8
 type sub_manager struct {
7
 type sub_manager struct {
9
-	// NameList의 노드들이 각각의 list를 갖음
10
 	list topicList
8
 	list topicList
11
 
9
 
12
-	/* sub# 관리 */
10
+	/* Manage sub# */
13
 	count_sub 	 int               // Subscription #
11
 	count_sub 	 int               // Subscription #
14
 	emptylist  []int                // To administrate sub #
12
 	emptylist  []int                // To administrate sub #
15
-	ip2sub     map[string][]int     // ip2sub[ip]= sub#...
16
-	sub2node   map[int][]*valueNode // sub2node[sub#] = node_addr
17
-	israngesub map[int]bool         // delete시에 관리를 위해
13
+	ip2sub     map[string][]int     // ip2sub[ip] = sub# ...
14
+	sub2ip	   map[int]string		// sub2ip[sub#] = ip
15
+	sub2node   map[int][]*valueNode // sub2node[sub#] = node_addr ...
16
+	israngesub map[int]bool         // To manage when deleted
18
 }
17
 }
19
 
18
 
20
-// 초기화 시에 하고 싶은 처리
21
-func (self *sub_manager) Initialize() {
19
+func (manager *sub_manager) Initialize() {
22
 	// Some initialize
20
 	// Some initialize
23
-	self.ip2sub = make(map[string][]int)
24
-	self.sub2node = make(map[int][]*valueNode)
25
-	self.israngesub = make(map[int]bool)
21
+	manager.ip2sub = make(map[string][]int)
22
+	manager.sub2ip = make(map[int]string)
23
+	manager.sub2node = make(map[int][]*valueNode)
24
+	manager.israngesub = make(map[int]bool)
26
 }
25
 }
27
 
26
 
28
-// 생성자 함수를 정의
29
 func newSubmng() *sub_manager {
27
 func newSubmng() *sub_manager {
30
-	sub_mng := &sub_manager{}
31
-	sub_mng.Initialize()
32
-	return sub_mng
28
+	subMng := &sub_manager{}
29
+	subMng.Initialize()
30
+	return subMng
33
 }
31
 }
34
 
32
 
35
 //	### To Insert sub#
33
 //	### To Insert sub#
38
 	topic := msg.(*SubscriptionMsg).topic
36
 	topic := msg.(*SubscriptionMsg).topic
39
 	value := msg.(*SubscriptionMsg).value
37
 	value := msg.(*SubscriptionMsg).value
40
 	operator := msg.(*SubscriptionMsg).operator
38
 	operator := msg.(*SubscriptionMsg).operator
41
-	isAlpha := msg.(*SubscriptionMsg).isAlpha
42
 	subnumber := 0
39
 	subnumber := 0
43
 
40
 
44
-	//fmt.Println("message = ", msg)
41
+	// * 1. Mapping incoming IP address to sub #
45
 
42
 
46
-	// * 1. 들어온 ipaddr -> sub# 매핑
47
 	if len(manager.emptylist) == 0 {
43
 	if len(manager.emptylist) == 0 {
48
 		manager.ip2sub[msg.(*SubscriptionMsg).from] = append(manager.ip2sub[msg.(*SubscriptionMsg).from], manager.count_sub)
44
 		manager.ip2sub[msg.(*SubscriptionMsg).from] = append(manager.ip2sub[msg.(*SubscriptionMsg).from], manager.count_sub)
49
 		subnumber = manager.count_sub
45
 		subnumber = manager.count_sub
55
 		subnumber = subidx
51
 		subnumber = subidx
56
 	}
52
 	}
57
 
53
 
58
-	// * 2. Sub 추가
59
 	nameptr := manager.list.head
54
 	nameptr := manager.list.head
60
 	findOk := false
55
 	findOk := false
61
 
56
 
62
-	//namelist에서 name찾고, 없으면 추가
57
+	// * 2. Add Subscription
58
+
59
+	// Find name in namelist, add if not found
63
 	for nameptr != nil {
60
 	for nameptr != nil {
64
-		// *  compare함수 구현되기 전 임시로 끼워넣은 것 (이 부분은 secure.go 완성되면 다시 확인)
65
-		if nameptr.topic[0] == topic[0] {
61
+		if Compare(nameptr.topic, topic) == 0 {
66
 			findOk = true
62
 			findOk = true
67
 			break
63
 			break
68
 		}
64
 		}
74
 		nameptr = manager.list.tail
70
 		nameptr = manager.list.tail
75
 	}
71
 	}
76
 
72
 
77
-	// list[name]에 value추가
78
-	if len(operator) == 1 { // 단일 식이라면 (single)
79
-		valptr := nameptr.list.getValueNodePos(value, isAlpha)
80
-		fmt.Println("pos = " ,valptr.val)
73
+	// Add value to list[name]
74
+	if len(operator) == 1 { // if single expression
75
+		valptr := nameptr.list.getValueNodePos(value)
81
 		if valptr == nil {
76
 		if valptr == nil {
82
 			nameptr.list.addValueNode(value)
77
 			nameptr.list.addValueNode(value)
83
 			valptr = nameptr.list.tail
78
 			valptr = nameptr.list.tail
86
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], valptr)
81
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], valptr)
87
 		valptr.insertSub(operator[0], subnumber, true)
82
 		valptr.insertSub(operator[0], subnumber, true)
88
 
83
 
89
-		return nil // addSubscription ok
84
+		return nil // AddSubscription ok
90
 	} else {
85
 	} else {
91
 
86
 
92
-		// '&&' , '||'로 묶여 있는 복합식에 대하여
87
+		// For compound expressions bounded by '&&' and '||'
88
+		// (ex) { (234 < x) && (x <= 1293) } , { (234 < x) || ( x < 1293) }
93
 		logical_operator := operator[1]
89
 		logical_operator := operator[1]
94
 
90
 
95
-		// find(namelist[name].list.val == value)인 노드
96
-		// * 이 부분 다시 봐야함..
97
-		valptr1 := nameptr.list.getValueNodePos(value, isAlpha)
98
-		valptr2 := nameptr.list.getValueNodePos(value, isAlpha)
91
+		// Find ValueNode = (namelist[name].list.val == value)
92
+		valptr1 := nameptr.list.getValueNodePos([]int64{value[0]})
93
+		valptr2 := nameptr.list.getValueNodePos([]int64{value[1]})
99
 
94
 
100
 		if valptr1 == nil {
95
 		if valptr1 == nil {
101
-			nameptr.list.addValueNode(value)
96
+			nameptr.list.addValueNode([]int64{value[0]})
102
 			valptr1 = nameptr.list.tail
97
 			valptr1 = nameptr.list.tail
103
 		}
98
 		}
104
 		if valptr2 == nil {
99
 		if valptr2 == nil {
105
-			nameptr.list.addValueNode(value)
100
+			nameptr.list.addValueNode([]int64{value[1]})
106
 			valptr2 = nameptr.list.tail
101
 			valptr2 = nameptr.list.tail
107
 		}
102
 		}
108
 
103
 
109
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], valptr1)
104
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], valptr1)
110
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], valptr2)
105
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], valptr2)
111
 
106
 
112
-		if logical_operator == "&&" { // '&&'로 묶여있다면
113
-			// rangesub check
107
+		if logical_operator == "&&" {
108
+			// If they are enclosed in '&&' -> Insert value to range_operator_list
114
 			manager.israngesub[subnumber] = true
109
 			manager.israngesub[subnumber] = true
115
 			valptr1.insertSub(operator[0], subnumber, false)
110
 			valptr1.insertSub(operator[0], subnumber, false)
116
 			valptr2.insertSub(operator[2], subnumber, false)
111
 			valptr2.insertSub(operator[2], subnumber, false)
117
 
112
 
118
 		} else {
113
 		} else {
119
-			// '||'로 묶여 있다면 두 식 모두 single로 처리가능
114
+			// if they are enclosed in '||' -> Insert value to single_operator_list
120
 			valptr1.insertSub(operator[0], subnumber, true)
115
 			valptr1.insertSub(operator[0], subnumber, true)
121
 			valptr2.insertSub(operator[2], subnumber, true)
116
 			valptr2.insertSub(operator[2], subnumber, true)
122
 		}
117
 		}
118
+
123
 		return nil // addSubscription ok
119
 		return nil // addSubscription ok
124
 	}
120
 	}
125
 	return errors.New("Can't addSubscription")
121
 	return errors.New("Can't addSubscription")
126
 }
122
 }
127
 
123
 
128
-//	* To delete subscription
124
+// To delete subscription
129
 func (manager *sub_manager) delete(from string) error {
125
 func (manager *sub_manager) delete(from string) error {
130
 
126
 
131
 	ip := from
127
 	ip := from
162
 					manager.emptylist = append(manager.emptylist, sub)
158
 					manager.emptylist = append(manager.emptylist, sub)
163
 				}
159
 				}
164
 
160
 
165
-				// node가 비어있으면 delete
166
 				isempty := node[j].isEmpty()
161
 				isempty := node[j].isEmpty()
162
+
163
+				// Delete if Value Node is empty
167
 				if isempty && node[j] != nil {
164
 				if isempty && node[j] != nil {
168
 					prev_node := node[j].prev
165
 					prev_node := node[j].prev
169
 					next_node := node[j].next
166
 					next_node := node[j].next
205
 				}
202
 				}
206
 
203
 
207
 				isempty := node[j].isEmpty()
204
 				isempty := node[j].isEmpty()
208
-				// node가 비어있으면 delete
205
+
206
+				// Delete if Value Node is empty
209
 				if isempty && node[j] != nil {
207
 				if isempty && node[j] != nil {
210
-					prev_node := node[j].prev
211
-					next_node := node[j].next
208
+					prevNode := node[j].prev
209
+					nextNode := node[j].next
212
 
210
 
213
-					prev_node.next = node[j].next
214
-					next_node.prev = node[j].prev
211
+					prevNode.next = node[j].next
212
+					nextNode.prev = node[j].prev
215
 				}
213
 				}
216
 			}
214
 			}
217
 		}
215
 		}
218
 	}
216
 	}
219
-	manager.ip2sub[ip]=nil
217
+	manager.ip2sub[ip]=nil // Delete sub#s mapped to Ip address
220
 	return nil
218
 	return nil
221
 }
219
 }

Загрузка…
Отмена
Сохранить