ソースを参照

temporarily completed subscription.go

master
extra1563 4年前
コミット
3f066f1973
1個のファイルの変更141行の追加65行の削除
  1. 141
    65
      modules/subscription.go

+ 141
- 65
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 {
10
 	list NameList
9
 	list NameList
11
 
10
 
12
 	/* sub# 관리 */
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
 //	### To Insert sub#
20
 //	### To Insert sub#
21
 func (manager *sub_manager) add_subscription(msg MsgUnit) error {
21
 func (manager *sub_manager) add_subscription(msg MsgUnit) error {
22
 
22
 
23
-	name := msg.(*SubscriptionMsg).subscription
23
+	topic := msg.(*SubscriptionMsg).topic
24
 	value := msg.(*SubscriptionMsg).value
24
 	value := msg.(*SubscriptionMsg).value
25
+	operator := msg.(*SubscriptionMsg).operator
25
 	subnumber := 0
26
 	subnumber := 0
26
 
27
 
27
-	fmt.Println("name = ", name, " value = ", value) // for debugging
28
+	//fmt.Println("message = ", msg)
28
 
29
 
29
 	// * 1. 들어온 Msg -> sub#, sub# -> Msg로 매핑
30
 	// * 1. 들어온 Msg -> sub#, sub# -> Msg로 매핑
30
 	if len(manager.emptylist) == 0 {
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
 		subnumber = manager.count_sub
34
 		subnumber = manager.count_sub
34
 		manager.count_sub++
35
 		manager.count_sub++
35
 	} else {
36
 	} else {
36
 		subidx := manager.emptylist[len(manager.emptylist)-1]
37
 		subidx := manager.emptylist[len(manager.emptylist)-1]
37
 		manager.emptylist = manager.emptylist[:len(manager.emptylist)-1]
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
 		subnumber = subidx
41
 		subnumber = subidx
41
 	}
42
 	}
42
 
43
 
47
 	//namelist에서 name찾고, 없으면 추가
48
 	//namelist에서 name찾고, 없으면 추가
48
 	for nameptr != nil {
49
 	for nameptr != nil {
49
 		// *  compare함수 구현되기 전 임시로 끼워넣은 것 (이 부분은 secure.go 완성되면 다시 확인)
50
 		// *  compare함수 구현되기 전 임시로 끼워넣은 것 (이 부분은 secure.go 완성되면 다시 확인)
50
-		if compare(nameptr.name, name) == 1 {
51
+		if compare(nameptr.topic, topic) == 0 {
51
 			findOk = true
52
 			findOk = true
52
 			break
53
 			break
53
 		}
54
 		}
54
 		nameptr = nameptr.next
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
 		manager.list.tail.next = newNode
60
 		manager.list.tail.next = newNode
60
 		manager.list.tail = newNode
61
 		manager.list.tail = newNode
61
 		manager.list.size++
62
 		manager.list.size++
62
 		nameptr = manager.list.tail
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
 	// list[name]에 value추가
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
 		return nil // add_subscription ok
77
 		return nil // add_subscription ok
83
 	} else {
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
 		// find(namelist[name].list.val == value)인 노드
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
 		if logical_operator == "&&" { // '&&'로 묶여있다면
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
 		} else {
106
 		} else {
106
 			// '||'로 묶여 있다면 두 식 모두 single로 처리가능
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
 		return nil // add_subscription ok
111
 		return nil // add_subscription ok
119
 	}
112
 	}
120
 	return errors.New("Can't add_subscription")
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
 // * 암호화된 두 value 비교함수 (임시)
211
 // * 암호화된 두 value 비교함수 (임시)

読み込み中…
キャンセル
保存