| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- package modules
-
- import (
- "errors"
- "fmt"
- )
-
- type sub_manager struct {
- // NameList의 노드들이 각각의 list를 갖음
- list NameList
-
- /* sub# 관리 */
- count_sub int // Subscription #
- emptylist []int // To administrate sub #
- num2sub map[int]MsgUnit // num2sub[sub#] = msg
- sub2num map[MsgUnit]int // delete시에 관리를 위해
- israngesub map[int]bool // delete시에 관리를 위해
- }
-
- // ### To Insert sub#
- func (manager *sub_manager) add_subscription(msg MsgUnit) error {
-
- name := msg.(*SubscriptionMsg).subscription
- value := msg.(*SubscriptionMsg).value
- subnumber := 0
-
- fmt.Println("name = ", name, " value = ", value) // for debugging
-
- // * 1. 들어온 Msg -> sub#, sub# -> Msg로 매핑
- if len(manager.emptylist) == 0 {
- manager.num2sub[manager.count_sub] = msg
- manager.sub2num[msg] = manager.count_sub
- subnumber = manager.count_sub
- manager.count_sub++
- } else {
- subidx := manager.emptylist[len(manager.emptylist)-1]
- manager.emptylist = manager.emptylist[:len(manager.emptylist)-1]
- manager.num2sub[subidx] = msg
- manager.sub2num[msg] = subidx
- subnumber = subidx
- }
-
- // * 2. Sub 추가
- nameptr := manager.list.head
- findOk := false
-
- //namelist에서 name찾고, 없으면 추가
- for nameptr != nil {
- // * compare함수 구현되기 전 임시로 끼워넣은 것 (이 부분은 secure.go 완성되면 다시 확인)
- if compare(nameptr.name, name) == 1 {
- findOk = true
- break
- }
- nameptr = nameptr.next
- }
-
- if findOk == false {
- newNode := &NameNode{name, nil, List{}}
- manager.list.tail.next = newNode
- manager.list.tail = newNode
- manager.list.size++
- nameptr = manager.list.tail
- }
-
- // * --- 가정 ---
- // * 데이터의 value형식은 아래의 두 개 꼴로만 들어온다고 가정
- // * (1). {enc(val), op} == 부등식
- // * -> (ex) {2, '<'} , { "baseball", == }
- // * (2). {부등식, '&&', 부등식} or {부등식, '||', 부등식}
- // * -> (ex1) {2, '<=', '&&', 3 , '>'} == {2 <= x < 3}
- // * (ex2) {12, '<', '||', 5 , '>'} == {12 < x || x < 5}
- // * -------------
-
- // list[name]에 value추가
- if len(value) == 2 { // 단일 식이라면 (single)
- valptr := nameptr.list.getPos(conv(value[0]))
- if valptr == nil{
- nameptr.list.add_ValueNode(value[0], value[1], subnumber, true)
- } else{
- valptr.insert_Sub(value[1], subnumber, true)
- }
- return nil // add_subscription ok
- } else {
- // rangesub check
- manager.israngesub[subnumber] = true
-
- // '&&' , '||'로 묶여 있는 복합식에 대하여
- logical_operator := value[2]
-
- // find(namelist[name].list.val == value)인 노드
- valptr1 := nameptr.list.getPos(conv(value[0]))
- valptr2 := nameptr.list.getPos(conv(value[3]))
-
- if logical_operator == "&&" { // '&&'로 묶여있다면
- if valptr1 != nil && valptr2 != nil { // val1, val2를 갖는 노드가 둘 다 존재
- valptr1.insert_Sub(value[1], subnumber, false)
- valptr2.insert_Sub(value[4], subnumber, false)
- }
- if valptr1 == nil {
- nameptr.list.add_ValueNode(value[0], value[1], subnumber, false)
- }
- if valptr2 == nil {
- nameptr.list.add_ValueNode(value[3], value[4], subnumber, false)
- }
- } else {
- // '||'로 묶여 있다면 두 식 모두 single로 처리가능
- if valptr1 != nil && valptr2 != nil { // val1, val2를 갖는 노드가 둘 다 존재
- valptr1.insert_Sub(value[1], subnumber, true)
- valptr2.insert_Sub(value[4], subnumber, true)
- }
- if valptr1 == nil {
- nameptr.list.add_ValueNode(value[0], value[1], subnumber, true)
- }
- if valptr2 == nil {
- nameptr.list.add_ValueNode(value[3], value[4], subnumber, true)
- }
- }
- return nil // add_subscription ok
- }
- return errors.New("Can't add_subscription")
- }
-
- // * ### To delete sub#
- func (manager *sub_manager) delete(subnumber int) error {
- s := errors.New("!23")
- return s
- }
-
- // * string형태로 암호화 되어있는 value -> int64[]로 변환(임시)
- func conv(val string) []int64 {
- ret := make([]int64, len(val))
- return ret
- }
-
- // * 암호화된 두 value 비교함수 (임시)
- func compare(v1 []int64, v2 []int64) int {
- return 1
- }
|