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
|
}
|