chenshijun
2019-09-06 a6f8f26249cc3c2f1fbb66c58a18b969b31534c1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package androidSync
 
import (
    sdb "basic.com/Android/syncdb.git"
    "basic.com/valib/logger.git"
    "encoding/json"
    "github.com/hashicorp/memberlist"
    "os"
    "time"
)
 
const (
    syncClusterKeyPrefix = "bjbasic123"
)
const (
    defaultSqliteDBPath = "./testdb.db"
 
    dBNameCluster      = "cluster"
    dBNameClusterNode  = "cluster_node"
    dBNameTables       = "dbTables"
    dBNameTablePersons = "dbtablepersons"
)
 
var syncTables = []string{dBNameCluster, dBNameClusterNode, dBNameTables, dBNameTablePersons}
var agent *sdb.Agent
var members *memberlist.Memberlist
var sqliteDBPath string = defaultSqliteDBPath
 
func init(){
    var logFile = "./logger/androidSync.log"
    var logSaveDays = 15    // 日志初始化
    logger.Config(logFile, logger.DebugLevel)
    logger.SetSaveDays(logSaveDays)
    err := sdb.InitDbConn(sqliteDBPath)
    if err != nil{
        logger.Error("sdb.InitDbConn ERROR: sqliteDBPath:", sqliteDBPath)
        os.Exit(-1)
    }
}
 
/*
    设置数据库路径
 */
func setDBPath(path string){
    sqliteDBPath = path
}
 
/*
    获取数据库路径
*/
func getDBPath() string {
    return sqliteDBPath
}
 
func clearSearchResult(ml *memberlist.Memberlist) {
    time.Sleep(10 * time.Second)
    sdb.CloseSearchNode(ml)
}
 
/*
    创建查询集群的临时节点,需要传入集群密码,6字节,数字或字母
    每个一秒调用一次GetSearchNodes,拿到搜索到的节点信息数据
    最后调用CloseSearchNode,关闭临时创建的搜索节点
    pwd = password must six bytes
*/
func CreateSearchNodeByPwd(pwd string) bool{
 
    pwdFull := syncClusterKeyPrefix + pwd
    var err error
    members, err = sdb.CreateSearchNode(pwdFull)
    if err != nil {
        logger.Error("sdb.CreateSearchNode:", err)
        return false
    }
 
    go clearSearchResult(members)
 
    return true
}
 
/*
    创建查询集群的临时节点,需要传入集群密码,16字节
    key = password
*/
func createSearchNode(key string) bool {
    var err error
    members, err = sdb.CreateSearchNode(key)
    if err != nil {
        logger.Error("sdb.CreateSearchNode:", err)
        return false
    }
 
    return true
}
 
/*
    阻塞方式创建搜索集群的节点,会直接返回搜索到的节点
    map[string]NodeInfo
    nodes[NodeInfo.NodeID] = NodeInfo
 */
func createSearchNodeWhitClose(key string, delay int) []byte {
    nodes := sdb.CreateSearchNodeWhitClose(key, time.Duration(delay))
    strNodes, err := json.Marshal(nodes)
    if err != nil {
        logger.Error("json.Marshal:", err)
        return nil
    }
    return strNodes
}
 
/*
    关闭临时创建的节点
*/
func CloseSearchNode() bool {
    err := sdb.CloseSearchNode(members)
    if err != nil {
        logger.Error("sdb.CloseSearchNode:", err)
        return false
    }
    return true
}
 
/*
    获取搜索到的节点信息
json vector
[
{Node1},
{Node2},
...
{Noden}
]
type NodeInfo struct {
    ClusterID   string `json:"clusterID"`
    NodeID      string `json:"nodeID"`
    NodeAddress string `json:"nodeAddress"`
    IsAlive     int    `json:"isAlive"`  //StatusNone:0, StatusAlive:1, StatusLeaving:2, StatusLeft:3, StatusFailed:4
}
*/
func GetSearchNodes() []byte {
    nodes := sdb.GetSearchNodes()
    strNodes, err := json.Marshal(nodes)
    if err != nil {
        logger.Error("json.Marshal:", err)
        return nil
    }
    return strNodes
}