fork github.com/doug-martin
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
package engine
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
|
||||
"github.com/lib/pq"
|
||||
|
||||
_ "github.com/denisenkom/go-mssqldb"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
|
||||
_ "git.fsdpf.net/go/db/v2/dialect/mysql"
|
||||
_ "git.fsdpf.net/go/db/v2/dialect/postgres"
|
||||
_ "git.fsdpf.net/go/db/v2/dialect/sqlite3"
|
||||
_ "git.fsdpf.net/go/db/v2/dialect/sqlserver"
|
||||
|
||||
"git.fsdpf.net/go/db/v2"
|
||||
"git.fsdpf.net/go/db/v2/internal/errors"
|
||||
)
|
||||
|
||||
type Engine struct {
|
||||
configs map[string]DBConfig
|
||||
dbs map[string]*sql.DB
|
||||
}
|
||||
|
||||
var _engine *Engine
|
||||
|
||||
func init() {
|
||||
_engine = &Engine{
|
||||
configs: make(map[string]DBConfig),
|
||||
dbs: make(map[string]*sql.DB),
|
||||
}
|
||||
}
|
||||
|
||||
func (e Engine) Connection(name string) *db.Database {
|
||||
cfg, ok := e.configs[name]
|
||||
|
||||
if !ok {
|
||||
panic(errors.New(fmt.Sprintf("Database connection %s not configured.", name)))
|
||||
}
|
||||
|
||||
_db, ok := e.dbs[name]
|
||||
|
||||
if !ok {
|
||||
_db = e.MakeConnection(cfg)
|
||||
e.dbs[name] = _db
|
||||
}
|
||||
|
||||
return db.New(cfg.Driver, _db)
|
||||
}
|
||||
|
||||
func (e Engine) MakeConnection(cfg DBConfig) *sql.DB {
|
||||
dsn := cfg.ToDSN()
|
||||
|
||||
switch cfg.Driver {
|
||||
case "mysql":
|
||||
case "sqlite3":
|
||||
case "sqlserver":
|
||||
case "postgres":
|
||||
if url, err := pq.ParseURL(dsn); err == nil {
|
||||
dsn = url
|
||||
} else {
|
||||
panic(err)
|
||||
}
|
||||
default:
|
||||
panic(fmt.Sprintf("Unsupported driver: %s", cfg.Driver))
|
||||
}
|
||||
|
||||
db, err := sql.Open(cfg.Driver, dsn)
|
||||
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if err := db.Ping(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return db
|
||||
}
|
||||
|
||||
func Open(cfgs map[string]DBConfig) *Engine {
|
||||
for n, cfg := range cfgs {
|
||||
_engine.configs[n] = cfg
|
||||
}
|
||||
|
||||
return _engine
|
||||
}
|
||||
Reference in New Issue
Block a user