90 lines
2.3 KiB
Go
90 lines
2.3 KiB
Go
|
package database
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"gitea.com/taozitaozi/gredis"
|
||
|
"github.com/glebarez/sqlite"
|
||
|
"github.com/go-redis/redis/v8"
|
||
|
"github.com/loveuer/nfflow/internal/opt"
|
||
|
"github.com/loveuer/nfflow/internal/util"
|
||
|
"gorm.io/driver/mysql"
|
||
|
"gorm.io/driver/postgres"
|
||
|
"gorm.io/gorm"
|
||
|
)
|
||
|
|
||
|
func MustInitClient() {
|
||
|
var (
|
||
|
err error
|
||
|
)
|
||
|
|
||
|
// todo: 可以实现自己的 "Store" sql_db, like sqlite, postgresql
|
||
|
if DB, err = initSql(); err != nil {
|
||
|
panic(fmt.Errorf("database.MustInitClient: init sql err=%v", err))
|
||
|
}
|
||
|
|
||
|
// todo: 可以实现自己的 "Caches" 缓存, like redis
|
||
|
if Cache, err = initCacher(); err != nil {
|
||
|
panic(fmt.Errorf("database.MustInitCache: init cache err=%v", err))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func initSql() (Store, error) {
|
||
|
var (
|
||
|
err error
|
||
|
client *gorm.DB
|
||
|
)
|
||
|
|
||
|
switch opt.Cfg.Database.Type {
|
||
|
case "postgresql":
|
||
|
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=disable TimeZone=Asia/Shanghai",
|
||
|
opt.Cfg.Database.Host, opt.Cfg.Database.Username, opt.Cfg.Database.Password, opt.Cfg.Database.DB, opt.Cfg.Database.Port)
|
||
|
if client, err = gorm.Open(postgres.Open(dsn)); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
case "mysql":
|
||
|
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
|
||
|
opt.Cfg.Database.Username, opt.Cfg.Database.Password, opt.Cfg.Database.Host, opt.Cfg.Database.Port, opt.Cfg.Database.DB)
|
||
|
if client, err = gorm.Open(mysql.Open(dsn)); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
case "sqlite":
|
||
|
if client, err = gorm.Open(sqlite.Open(opt.Cfg.Database.Path)); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
default:
|
||
|
return nil, fmt.Errorf("unsupportted databsae type=%s", opt.Cfg.Database.Type)
|
||
|
}
|
||
|
|
||
|
return &_db{client: client}, nil
|
||
|
}
|
||
|
|
||
|
func initCacher() (Caches, error) {
|
||
|
var (
|
||
|
err error
|
||
|
)
|
||
|
|
||
|
switch opt.Cfg.Cache.Type {
|
||
|
case "redis":
|
||
|
var rc *redis.Client
|
||
|
rc = redis.NewClient(&redis.Options{
|
||
|
Addr: fmt.Sprintf("%s:%d", opt.Cfg.Cache.Host, opt.Cfg.Cache.Port),
|
||
|
Username: opt.Cfg.Cache.Username,
|
||
|
Password: opt.Cfg.Cache.Password,
|
||
|
})
|
||
|
|
||
|
if err = rc.Ping(util.Timeout(5)).Err(); err != nil {
|
||
|
return nil, fmt.Errorf("redis ping err=%v", err)
|
||
|
}
|
||
|
|
||
|
return &_redis{client: rc}, nil
|
||
|
case "memory":
|
||
|
var mc *gredis.Gredis
|
||
|
mc = gredis.NewGredis(-1)
|
||
|
|
||
|
return &_mem{client: mc}, nil
|
||
|
default:
|
||
|
return nil, fmt.Errorf("unsupportted cache type=%s", opt.Cfg.Cache.Type)
|
||
|
}
|
||
|
|
||
|
}
|