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 }