mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-05-12 09:49:39 +08:00
- 新增 SphinxDB 驱动注册并复用 MySQL 协议连接 - 前端新增 sphinx 连接类型与默认端口 9306 - 函数/视图/触发器改为多语句回退查询与版本探测提示 - 后端对不支持能力返回稳定降级结果
104 lines
2.8 KiB
Go
104 lines
2.8 KiB
Go
package db
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"GoNavi-Wails/internal/connection"
|
|
)
|
|
|
|
const sphinxDefaultDatabaseName = "default"
|
|
|
|
// SphinxDB 复用 MySQL 协议实现,并在数据库列表不可用时提供兜底。
|
|
type SphinxDB struct {
|
|
MySQLDB
|
|
fallbackDatabase string
|
|
}
|
|
|
|
func isSphinxUnsupportedFeatureError(err error) bool {
|
|
if err == nil {
|
|
return false
|
|
}
|
|
text := strings.ToLower(strings.TrimSpace(err.Error()))
|
|
if text == "" {
|
|
return false
|
|
}
|
|
keywords := []string{
|
|
"not supported",
|
|
"unsupported",
|
|
"syntax error",
|
|
"unknown table",
|
|
"unknown column",
|
|
"doesn't exist",
|
|
}
|
|
for _, keyword := range keywords {
|
|
if strings.Contains(text, keyword) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (s *SphinxDB) Connect(config connection.ConnectionConfig) error {
|
|
runConfig := applyMySQLURI(config)
|
|
s.fallbackDatabase = strings.TrimSpace(runConfig.Database)
|
|
return s.MySQLDB.Connect(config)
|
|
}
|
|
|
|
func (s *SphinxDB) resolveDatabaseName(dbName string) string {
|
|
name := strings.TrimSpace(dbName)
|
|
if name == "" {
|
|
return s.fallbackDatabase
|
|
}
|
|
if strings.EqualFold(name, sphinxDefaultDatabaseName) && s.fallbackDatabase == "" {
|
|
return ""
|
|
}
|
|
return name
|
|
}
|
|
|
|
func (s *SphinxDB) GetDatabases() ([]string, error) {
|
|
dbs, err := s.MySQLDB.GetDatabases()
|
|
if err == nil && len(dbs) > 0 {
|
|
return dbs, nil
|
|
}
|
|
if s.fallbackDatabase != "" {
|
|
return []string{s.fallbackDatabase}, nil
|
|
}
|
|
return []string{sphinxDefaultDatabaseName}, nil
|
|
}
|
|
|
|
func (s *SphinxDB) GetTables(dbName string) ([]string, error) {
|
|
return s.MySQLDB.GetTables(s.resolveDatabaseName(dbName))
|
|
}
|
|
|
|
func (s *SphinxDB) GetCreateStatement(dbName, tableName string) (string, error) {
|
|
return s.MySQLDB.GetCreateStatement(s.resolveDatabaseName(dbName), tableName)
|
|
}
|
|
|
|
func (s *SphinxDB) GetColumns(dbName, tableName string) ([]connection.ColumnDefinition, error) {
|
|
return s.MySQLDB.GetColumns(s.resolveDatabaseName(dbName), tableName)
|
|
}
|
|
|
|
func (s *SphinxDB) GetAllColumns(dbName string) ([]connection.ColumnDefinitionWithTable, error) {
|
|
return s.MySQLDB.GetAllColumns(s.resolveDatabaseName(dbName))
|
|
}
|
|
|
|
func (s *SphinxDB) GetIndexes(dbName, tableName string) ([]connection.IndexDefinition, error) {
|
|
return s.MySQLDB.GetIndexes(s.resolveDatabaseName(dbName), tableName)
|
|
}
|
|
|
|
func (s *SphinxDB) GetForeignKeys(dbName, tableName string) ([]connection.ForeignKeyDefinition, error) {
|
|
fks, err := s.MySQLDB.GetForeignKeys(s.resolveDatabaseName(dbName), tableName)
|
|
if err != nil && isSphinxUnsupportedFeatureError(err) {
|
|
return []connection.ForeignKeyDefinition{}, nil
|
|
}
|
|
return fks, err
|
|
}
|
|
|
|
func (s *SphinxDB) GetTriggers(dbName, tableName string) ([]connection.TriggerDefinition, error) {
|
|
triggers, err := s.MySQLDB.GetTriggers(s.resolveDatabaseName(dbName), tableName)
|
|
if err != nil && isSphinxUnsupportedFeatureError(err) {
|
|
return []connection.TriggerDefinition{}, nil
|
|
}
|
|
return triggers, err
|
|
}
|