mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-12 02:49:42 +08:00
- MySQL/Redis/Oracle/PostgreSQL 内置可用,其余数据源改为“安装启用”后可用 - 新建连接对未安装驱动做弹窗内拦截提示,并支持一键跳转驱动管理安装 - 驱动管理展示安装包真实大小(从 Release 资产元数据读取)并优化加载性能 - Release 工作流发布各平台驱动代理资产,主程序构建启用 -s -w 精简
87 lines
2.1 KiB
Go
87 lines
2.1 KiB
Go
package db
|
|
|
|
import (
|
|
"GoNavi-Wails/internal/connection"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type Database interface {
|
|
Connect(config connection.ConnectionConfig) error
|
|
Close() error
|
|
Ping() error
|
|
Query(query string) ([]map[string]interface{}, []string, error)
|
|
Exec(query string) (int64, error)
|
|
GetDatabases() ([]string, error)
|
|
GetTables(dbName string) ([]string, error)
|
|
GetCreateStatement(dbName, tableName string) (string, error)
|
|
GetColumns(dbName, tableName string) ([]connection.ColumnDefinition, error)
|
|
GetAllColumns(dbName string) ([]connection.ColumnDefinitionWithTable, error)
|
|
GetIndexes(dbName, tableName string) ([]connection.IndexDefinition, error)
|
|
GetForeignKeys(dbName, tableName string) ([]connection.ForeignKeyDefinition, error)
|
|
GetTriggers(dbName, tableName string) ([]connection.TriggerDefinition, error)
|
|
}
|
|
|
|
type BatchApplier interface {
|
|
ApplyChanges(tableName string, changes connection.ChangeSet) error
|
|
}
|
|
|
|
type databaseFactory func() Database
|
|
|
|
var databaseFactories = map[string]databaseFactory{
|
|
"mysql": func() Database {
|
|
return &MySQLDB{}
|
|
},
|
|
"postgres": func() Database {
|
|
return &PostgresDB{}
|
|
},
|
|
"oracle": func() Database {
|
|
return &OracleDB{}
|
|
},
|
|
"custom": func() Database {
|
|
return &CustomDB{}
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
registerOptionalDatabaseFactories()
|
|
}
|
|
|
|
func registerDatabaseFactory(factory databaseFactory, dbTypes ...string) {
|
|
if factory == nil || len(dbTypes) == 0 {
|
|
return
|
|
}
|
|
for _, dbType := range dbTypes {
|
|
normalized := normalizeDatabaseType(dbType)
|
|
if normalized == "" {
|
|
continue
|
|
}
|
|
databaseFactories[normalized] = factory
|
|
}
|
|
}
|
|
|
|
func normalizeDatabaseType(dbType string) string {
|
|
normalized := strings.ToLower(strings.TrimSpace(dbType))
|
|
switch normalized {
|
|
case "doris":
|
|
return "diros"
|
|
case "postgresql":
|
|
return "postgres"
|
|
default:
|
|
return normalized
|
|
}
|
|
}
|
|
|
|
// Factory
|
|
func NewDatabase(dbType string) (Database, error) {
|
|
normalized := normalizeDatabaseType(dbType)
|
|
if normalized == "" {
|
|
normalized = "mysql"
|
|
}
|
|
factory, ok := databaseFactories[normalized]
|
|
if !ok {
|
|
return nil, fmt.Errorf("unsupported database type: %s", dbType)
|
|
}
|
|
return factory(), nil
|
|
}
|