fork github.com/doug-martin

This commit is contained in:
2025-03-22 23:02:05 +08:00
commit f14642a736
131 changed files with 34555 additions and 0 deletions
+89
View File
@@ -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
}