Bläddra i källkod

temporarily completed subscription.go

master
extra1563 4 år sedan
förälder
incheckning
3f066f1973
1 ändrade filer med 141 tillägg och 65 borttagningar
  1. 141
    65
      modules/subscription.go

+ 141
- 65
modules/subscription.go Visa fil

@@ -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 비교함수 (임시)

Laddar…
Avbryt
Spara