func()

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
}