Ver código fonte

[fin] subscription.go

master
extra1563 4 anos atrás
pai
commit
f893f71d35
1 arquivos alterados com 43 adições e 45 exclusões
  1. 43
    45
      src/broker/modules/subscription.go

+ 43
- 45
src/broker/modules/subscription.go Ver arquivo

@@ -2,34 +2,32 @@ package modules
2 2
 
3 3
 import (
4 4
 	"errors"
5
-	"fmt"
6 5
 )
7 6
 
8 7
 type sub_manager struct {
9
-	// NameList의 노드들이 각각의 list를 갖음
10 8
 	list topicList
11 9
 
12
-	/* sub# 관리 */
10
+	/* Manage sub# */
13 11
 	count_sub 	 int               // Subscription #
14 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 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 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 33
 //	### To Insert sub#
@@ -38,12 +36,10 @@ func (manager *sub_manager) addSubscription(msg MsgUnit) error {
38 36
 	topic := msg.(*SubscriptionMsg).topic
39 37
 	value := msg.(*SubscriptionMsg).value
40 38
 	operator := msg.(*SubscriptionMsg).operator
41
-	isAlpha := msg.(*SubscriptionMsg).isAlpha
42 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 43
 	if len(manager.emptylist) == 0 {
48 44
 		manager.ip2sub[msg.(*SubscriptionMsg).from] = append(manager.ip2sub[msg.(*SubscriptionMsg).from], manager.count_sub)
49 45
 		subnumber = manager.count_sub
@@ -55,14 +51,14 @@ func (manager *sub_manager) addSubscription(msg MsgUnit) error {
55 51
 		subnumber = subidx
56 52
 	}
57 53
 
58
-	// * 2. Sub 추가
59 54
 	nameptr := manager.list.head
60 55
 	findOk := false
61 56
 
62
-	//namelist에서 name찾고, 없으면 추가
57
+	// * 2. Add Subscription
58
+
59
+	// Find name in namelist, add if not found
63 60
 	for nameptr != nil {
64
-		// *  compare함수 구현되기 전 임시로 끼워넣은 것 (이 부분은 secure.go 완성되면 다시 확인)
65
-		if nameptr.topic[0] == topic[0] {
61
+		if Compare(nameptr.topic, topic) == 0 {
66 62
 			findOk = true
67 63
 			break
68 64
 		}
@@ -74,10 +70,9 @@ func (manager *sub_manager) addSubscription(msg MsgUnit) error {
74 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 76
 		if valptr == nil {
82 77
 			nameptr.list.addValueNode(value)
83 78
 			valptr = nameptr.list.tail
@@ -86,46 +81,47 @@ func (manager *sub_manager) addSubscription(msg MsgUnit) error {
86 81
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], valptr)
87 82
 		valptr.insertSub(operator[0], subnumber, true)
88 83
 
89
-		return nil // addSubscription ok
84
+		return nil // AddSubscription ok
90 85
 	} else {
91 86
 
92
-		// '&&' , '||'로 묶여 있는 복합식에 대하여
87
+		// For compound expressions bounded by '&&' and '||'
88
+		// (ex) { (234 < x) && (x <= 1293) } , { (234 < x) || ( x < 1293) }
93 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 95
 		if valptr1 == nil {
101
-			nameptr.list.addValueNode(value)
96
+			nameptr.list.addValueNode([]int64{value[0]})
102 97
 			valptr1 = nameptr.list.tail
103 98
 		}
104 99
 		if valptr2 == nil {
105
-			nameptr.list.addValueNode(value)
100
+			nameptr.list.addValueNode([]int64{value[1]})
106 101
 			valptr2 = nameptr.list.tail
107 102
 		}
108 103
 
109 104
 		manager.sub2node[subnumber] = append(manager.sub2node[subnumber], valptr1)
110 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 109
 			manager.israngesub[subnumber] = true
115 110
 			valptr1.insertSub(operator[0], subnumber, false)
116 111
 			valptr2.insertSub(operator[2], subnumber, false)
117 112
 
118 113
 		} else {
119
-			// '||'로 묶여 있다면 두 식 모두 single로 처리가능
114
+			// if they are enclosed in '||' -> Insert value to single_operator_list
120 115
 			valptr1.insertSub(operator[0], subnumber, true)
121 116
 			valptr2.insertSub(operator[2], subnumber, true)
122 117
 		}
118
+
123 119
 		return nil // addSubscription ok
124 120
 	}
125 121
 	return errors.New("Can't addSubscription")
126 122
 }
127 123
 
128
-//	* To delete subscription
124
+// To delete subscription
129 125
 func (manager *sub_manager) delete(from string) error {
130 126
 
131 127
 	ip := from
@@ -162,8 +158,9 @@ func (manager *sub_manager) delete(from string) error {
162 158
 					manager.emptylist = append(manager.emptylist, sub)
163 159
 				}
164 160
 
165
-				// node가 비어있으면 delete
166 161
 				isempty := node[j].isEmpty()
162
+
163
+				// Delete if Value Node is empty
167 164
 				if isempty && node[j] != nil {
168 165
 					prev_node := node[j].prev
169 166
 					next_node := node[j].next
@@ -205,17 +202,18 @@ func (manager *sub_manager) delete(from string) error {
205 202
 				}
206 203
 
207 204
 				isempty := node[j].isEmpty()
208
-				// node가 비어있으면 delete
205
+
206
+				// Delete if Value Node is empty
209 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 218
 	return nil
221 219
 }

Carregando…
Cancelar
Salvar