You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.8 KiB
Go
90 lines
2.8 KiB
Go
package config
|
|
|
|
import (
|
|
"ariga.io/entcache"
|
|
"database/sql"
|
|
entsql "entgo.io/ent/dialect/sql"
|
|
"fmt"
|
|
"git.noahlan.cn/noahlan/ntool-biz/core/config"
|
|
"git.noahlan.cn/noahlan/ntool/nlog"
|
|
"github.com/go-redis/redis/v8"
|
|
_ "github.com/go-sql-driver/mysql"
|
|
_ "github.com/lib/pq"
|
|
"time"
|
|
)
|
|
|
|
type Database struct {
|
|
Host string `json:",env=DB_HOST"` // Host
|
|
Port int `json:",env=DB_PORT"` // Port
|
|
Username string `json:",optional,env=DB_USERNAME"` // 用户名
|
|
Password string `json:",optional,env=DB_PASSWORD"` // 密码
|
|
DBName string `json:",optional,env=DB_DBNAME"` // 数据库名
|
|
Timezone string `json:",optional,default=Local"` // 时区 Local本地 Asia/Shanghai上海
|
|
SSLMode string `json:",optional"` // Postgresql的SSL模式
|
|
Type string `json:",default=mysql,options=[mysql,postgres]"` // 数据库类型
|
|
MaxOpenConns *int `json:",optional,default=200"` // 最大打开连接数
|
|
Debug bool `json:",optional,default=false"` // 调试模式
|
|
CacheTime int `json:",optional,default=10"` // 缓存时间,单位秒
|
|
}
|
|
|
|
// NewCacheDriver returns an ent driver with cache.
|
|
func (c Database) NewCacheDriver(redisConf config.RedisConf) *entcache.Driver {
|
|
db, err := sql.Open(c.Type, c.GetDSN())
|
|
nlog.Must(err)
|
|
|
|
db.SetMaxOpenConns(*c.MaxOpenConns)
|
|
driver := entsql.OpenDB(c.Type, db)
|
|
|
|
rdb := redis.NewClient(&redis.Options{
|
|
Network: redisConf.Network,
|
|
Addr: redisConf.Addr,
|
|
Username: redisConf.Username,
|
|
Password: redisConf.Password,
|
|
DB: redisConf.DB,
|
|
})
|
|
|
|
cacheDrv := entcache.NewDriver(
|
|
driver,
|
|
entcache.TTL(time.Duration(c.CacheTime)*time.Second),
|
|
entcache.Levels(
|
|
entcache.NewLRU(256),
|
|
entcache.NewRedis(rdb),
|
|
),
|
|
)
|
|
|
|
return cacheDrv
|
|
}
|
|
|
|
// NewNoCacheDriver returns a ent driver without cache.
|
|
func (c Database) NewNoCacheDriver() *entsql.Driver {
|
|
db, err := sql.Open(c.Type, c.GetDSN())
|
|
nlog.Must(err)
|
|
|
|
db.SetMaxOpenConns(*c.MaxOpenConns)
|
|
driver := entsql.OpenDB(c.Type, db)
|
|
|
|
return driver
|
|
}
|
|
|
|
// MysqlDSN returns mysql DSN.
|
|
func (c Database) MysqlDSN() string {
|
|
return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?parseTime=True&loc=%s", c.Username, c.Password, c.Host, c.Port, c.DBName, c.Timezone)
|
|
}
|
|
|
|
// PostgresDSN returns Postgres DSN.
|
|
func (c Database) PostgresDSN() string {
|
|
return fmt.Sprintf("postgresql://%s:%s@%s:%d/%s?sslmode=%s", c.Username, c.Password, c.Host, c.Port, c.DBName, c.SSLMode)
|
|
}
|
|
|
|
// GetDSN returns DSN according to the database type.
|
|
func (c Database) GetDSN() string {
|
|
switch c.Type {
|
|
case "mysql":
|
|
return c.MysqlDSN()
|
|
case "postgres":
|
|
return c.PostgresDSN()
|
|
default:
|
|
return "mysql"
|
|
}
|
|
}
|