in pitr/cli/internal/pkg/shardingsphere-proxy.go [150:198]
func (ss *shardingSphereProxy) ExportStorageNodes() ([]*model.StorageNode, error) {
query, err := ss.db.Query(`EXPORT STORAGE NODES;`)
if err != nil {
return nil, xerr.NewCliErr(fmt.Sprintf("export storage nodes failure,err=%s", err))
}
var (
id string
createTime string
data string
)
if query.Next() {
if err = query.Scan(&id, &createTime, &data); err != nil {
return nil, xerr.NewCliErr(fmt.Sprintf("query scan failure,err=%s", err))
}
if err = query.Close(); err != nil {
return nil, xerr.NewCliErr(fmt.Sprintf("query close failure,err=%s", err))
}
}
if query.Err() != nil {
return nil, xerr.NewCliErr(fmt.Sprintf("query err failure,err=%s", err))
}
out := &model.StorageNodesInfo{}
if err = json.Unmarshal([]byte(data), &out); err != nil {
return nil, fmt.Errorf("json unmarshal return err=%s", err)
}
// get all storage nodes and filter duplicate nodes
var storageNodes []*model.StorageNode
var tmpNodesMap = make(map[string]struct{})
for _, v := range out.StorageNodes {
for _, vv := range v {
// filter duplicate nodes
if _, ok := tmpNodesMap[fmt.Sprintf("%s:%d", vv.IP, vv.Port)]; ok {
continue
}
tmpNodesMap[fmt.Sprintf("%s:%d", vv.IP, vv.Port)] = struct{}{}
storageNodes = append(storageNodes, vv)
}
}
return storageNodes, nil
}