Files
opsxdb/apps/server/internal/db/open.go
T
logan f8740d27f7 feat: OpsxDB 桌面数据库客户端首版入库
含工作台/连库多引擎字段与 SSH·SSL、结果编辑、Redis 键浏览、
Tauri 桌面与 docs/落地页;排除本地构建产物与 sidecar 二进制。
2026-09-19 22:43:45 +08:00

86 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package db
import (
"database/sql"
"fmt"
"strings"
"time"
)
func driverKey(d string) string {
return strings.ToLower(strings.TrimSpace(d))
}
func isMySQLFamily(d string) bool {
switch driverKey(d) {
case "mysql", "mariadb", "tidb", "oceanbase", "polardb", "tdsql":
return true
default:
return false
}
}
func isPostgresFamily(d string) bool {
switch driverKey(d) {
case "postgresql", "postgres", "gaussdb", "opengauss", "kingbase":
return true
default:
return false
}
}
// Open 按驱动打开 *sql.DB
func Open(c ConnReq) (*sql.DB, error) {
var (
db *sql.DB
err error
)
switch {
case isMySQLFamily(c.Driver):
db, err = openMySQL(c)
case isPostgresFamily(c.Driver):
db, err = openPostgres(c)
case driverKey(c.Driver) == "sqlserver" || driverKey(c.Driver) == "mssql":
db, err = openMSSQL(c)
case driverKey(c.Driver) == "oracle":
db, err = openOracle(c)
case driverKey(c.Driver) == "sqlite":
db, err = openSQLite(c)
default:
return nil, fmt.Errorf("驱动「%s」尚未实现(当前支持: mysql/mariadb/tidb、postgresql、sqlserver、oracle、sqlite、redis)", c.Driver)
}
if err != nil {
return nil, err
}
db.SetConnMaxLifetime(2 * time.Minute)
db.SetMaxOpenConns(5)
db.SetMaxIdleConns(2)
return db, nil
}
func TestConnection(c ConnReq) error {
dial, tun, err := ApplySSHTunnel(c)
if err != nil {
return err
}
if tun != nil {
defer tun.Close()
}
if err := testDial(dial); err != nil {
return fmt.Errorf("数据库: %w", err)
}
return nil
}
func testDial(c ConnReq) error {
if isRedis(c.Driver) {
return testRedis(c)
}
db, err := Open(c)
if err != nil {
return err
}
defer db.Close()
return db.Ping()
}