datasource/hologres/hologres.go (74 lines of code) (raw):
package hologres
import (
"database/sql"
"database/sql/driver"
"fmt"
"time"
"github.com/lib/pq"
)
func init() {
sql.Register("hologres", &HologresDriver{})
}
type HologresDriver struct {
driver pq.Driver
}
func (d HologresDriver) Open(name string) (driver.Conn, error) {
conn, err := d.driver.Open(name)
if err != nil {
return nil, err
}
if stmt, err := conn.Prepare("set statement_timeout = 500"); err == nil {
stmt.Exec(nil)
stmt.Close()
}
return conn, err
}
type Hologres struct {
DSN string
DB *sql.DB
Name string
}
var hologresInstances = make(map[string]*Hologres)
func GetHologres(name string) (*Hologres, error) {
if _, ok := hologresInstances[name]; !ok {
return nil, fmt.Errorf("Hologres not found, name:%s", name)
}
return hologresInstances[name], nil
}
func (m *Hologres) Init() error {
db, err := sql.Open("hologres", m.DSN)
if err != nil {
return err
}
db.SetConnMaxLifetime(60 * time.Minute)
db.SetMaxIdleConns(50)
db.SetMaxOpenConns(100)
m.DB = db
err = m.DB.Ping()
//go m.loopDBStats()
return err
}
func RegisterHologres(name, dsn string) {
if _, ok := hologresInstances[name]; ok {
return
}
m := &Hologres{
DSN: dsn,
Name: name,
}
err := m.Init()
if err != nil {
fmt.Printf("event=RegisterHologres\tdsn=%s\tname=%s", dsn, name)
panic(err)
}
hologresInstances[name] = m
}
func RemoveHologres(name string) {
hologres, ok := hologresInstances[name]
if !ok {
return
}
if hologres.DB != nil {
hologres.DB.Close()
}
delete(hologresInstances, name)
}