Files
2022-10-21 13:18:51 +08:00

49 lines
851 B
Go

package trypg
import (
"fmt"
"time"
"github.com/sirupsen/logrus"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
func Available(dsn []string) (successDsn string, err error) {
if len(dsn) == 0 {
err = fmt.Errorf("dsn is not valid")
return
}
var successChan = make(chan string)
for _, d := range dsn {
go func(d string) {
var db *gorm.DB
if db, err = gorm.Open(postgres.Open(d), &gorm.Config{}); err != nil {
return
}
var status string
if err = db.Raw("SHOW transaction_read_only").Scan(&status).Error; err != nil {
return
}
if status == "off" {
successChan <- d
}
}(d)
}
select {
case successDsn = <-successChan:
case <-time.After(time.Second * 15):
logrus.Debug("all of pg point is timeout")
}
if successDsn == "" {
err = fmt.Errorf("all of pg point is timeout")
return
}
return
}