/*
=================================================================================
* License: GPL-2.0 license
* Author: 众产®  https://ciy.cn/code
* Version: 0.1.0
=================================================================================
多读库路由	NewCiyDBRoute
** 该路由库可能由HAProxy取代
=================================================================================
dbr, err = c.NewCiyDBRoute(dbn[]string, 最大连接数, 空闲连接数, 保活秒) //main初始化
dbr.Takeout() //取出一个负载较低的数据库连接池
=================================================================================
示例:
dbr, err = c.NewCiyDBRoute([]string{"user:pass@tcp(localhost:3306)/dbname"}) //main初始化一直开着，程序结束才关
db := dbr.Takeout() //取出一个数据库连接池

=================================================================================
*/
package zciyon

import (
	"fmt"
)

// 数据路由，包含多个数据库池路由，取出一个连接池用。
type CiyDBRoute struct {
	routes []*CiyMysql
}

// 多台读服务器dsn，要求内容一致的互为镜像
func NewCiyDBRoute(dsns []string, maxopenconn int, maxidelconn int, maxlifesec int) (*CiyDBRoute, error) {
	dbroute := &CiyDBRoute{}
	dbroute.routes = make([]*CiyMysql, 0)
	for idx, dsn := range dsns {
		dbr, err := NewCiyMysql(dsn, maxopenconn, maxidelconn, maxlifesec)
		if err != nil {
			return nil, fmt.Errorf("DB[%d]: %v", idx, err)
		}
		dbr.MonitorHealth(10)
		dbroute.routes = append(dbroute.routes, dbr)
	}
	if len(dbroute.routes) == 0 {
		return nil, fmt.Errorf("no dsn")
	}
	return dbroute, nil
}

// 取出一个相对健康的目标数据库连接池
func (thos *CiyDBRoute) Takeout() CiyMysql {
	minhealth := 100000
	dbidx := 0
	for idx, dbr := range thos.routes {
		if dbr.Health < minhealth {
			minhealth = dbr.Health
			dbidx = idx
		}
	}
	return *thos.routes[dbidx]
}
