2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 11:27:17 +08:00

feat: 优化数据库信息获取

This commit is contained in:
耗子
2024-11-25 03:18:36 +08:00
parent 0df2a9107d
commit 33cb41cf42
9 changed files with 54 additions and 34 deletions

View File

@@ -3,7 +3,6 @@ package db
import (
"database/sql"
"fmt"
"slices"
"strings"
_ "github.com/go-sql-driver/mysql"
@@ -134,7 +133,7 @@ func (m *MySQL) UserPrivileges(user, host string) (map[string][]string, error) {
for rows.Next() {
var grant string
if err = rows.Scan(&grant); err != nil {
return nil, fmt.Errorf("failed to scan grant: %w", err)
return nil, err
}
if !strings.HasPrefix(grant, "GRANT ") {
continue
@@ -199,24 +198,35 @@ func (m *MySQL) Users() ([]types.MySQLUser, error) {
return users, nil
}
func (m *MySQL) Databases() ([]string, error) {
rows, err := m.Query("SHOW DATABASES")
func (m *MySQL) Databases() ([]types.MySQLDatabase, error) {
query := `
SELECT
SCHEMA_NAME,
DEFAULT_CHARACTER_SET_NAME,
DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys')
`
rows, err := m.Query(query)
if err != nil {
return nil, err
}
defer rows.Close()
var databases []string
var databases []types.MySQLDatabase
for rows.Next() {
var database string
if err := rows.Scan(&database); err != nil {
continue
var db types.MySQLDatabase
if err = rows.Scan(&db.Name, &db.CharSet, &db.Collation); err != nil {
return nil, err
}
if slices.Contains([]string{"information_schema", "performance_schema", "mysql", "sys"}, database) {
continue
}
databases = append(databases, database)
databases = append(databases, db)
}
if err = rows.Err(); err != nil {
return nil, err
}
return databases, nil
}

View File

@@ -3,6 +3,7 @@ package db
import (
"database/sql"
"fmt"
"slices"
"strings"
_ "github.com/lib/pq"
@@ -128,7 +129,7 @@ func (r *Postgres) UserPrivileges(user string) (map[string][]string, error) {
rows, err := r.Query(query, user)
if err != nil {
return nil, fmt.Errorf("failed to query database privileges: %w", err)
return nil, err
}
defer rows.Close()
@@ -136,8 +137,8 @@ func (r *Postgres) UserPrivileges(user string) (map[string][]string, error) {
for rows.Next() {
var db, privilegeStr string
if err := rows.Scan(&db, &privilegeStr); err != nil {
return nil, fmt.Errorf("failed to scan row: %w", err)
if err = rows.Scan(&db, &privilegeStr); err != nil {
return nil, err
}
privileges[db] = strings.Split(privilegeStr, ",")
@@ -236,6 +237,9 @@ func (r *Postgres) Databases() ([]types.PostgresDatabase, error) {
if err := rows.Scan(&db.Name, &db.Owner, &db.Encoding); err != nil {
return nil, err
}
if slices.Contains([]string{"template0", "template1", "postgres"}, db.Name) {
continue
}
databases = append(databases, db)
}

View File

@@ -5,3 +5,9 @@ type MySQLUser struct {
Host string `json:"host"`
Grants []string `json:"grants"`
}
type MySQLDatabase struct {
Name string `json:"name"`
CharSet string `json:"char_set"`
Collation string `json:"collation"`
}