diff --git a/internal/biz/database.go b/internal/biz/database.go index f5e97052..b2f9a861 100644 --- a/internal/biz/database.go +++ b/internal/biz/database.go @@ -6,16 +6,10 @@ import ( type DatabaseStatus string -const ( - DatabaseStatusValid DatabaseStatus = "valid" - DatabaseStatusInvalid DatabaseStatus = "invalid" -) - type Database struct { - Name string `json:"name"` - ServerID uint `json:"server_id"` - Status DatabaseStatus `json:"status"` - Remark string `json:"remark"` + Name string `json:"name"` + Server string `json:"server"` + Encoding string `json:"encoding"` } type DatabaseRepo interface { diff --git a/internal/data/database.go b/internal/data/database.go index d5b1bca9..9f7858fe 100644 --- a/internal/data/database.go +++ b/internal/data/database.go @@ -2,6 +2,7 @@ package data import ( "fmt" + "slices" "github.com/samber/do/v2" @@ -30,11 +31,11 @@ func (r databaseRepo) List(page, limit uint) ([]*biz.Database, int64, error) { mysql, err := db.NewMySQL(server.Username, server.Password, fmt.Sprintf("%s:%d", server.Host, server.Port)) if err == nil { if databases, err := mysql.Databases(); err == nil { - for _, name := range databases { + for item := range slices.Values(databases) { database = append(database, &biz.Database{ - Name: name, - ServerID: server.ID, - Status: biz.DatabaseStatusValid, + Name: item.Name, + Server: server.Name, + Encoding: item.CharSet, }) } } @@ -43,11 +44,11 @@ func (r databaseRepo) List(page, limit uint) ([]*biz.Database, int64, error) { postgres, err := db.NewPostgres(server.Username, server.Password, server.Host, server.Port) if err == nil { if databases, err := postgres.Databases(); err == nil { - for _, item := range databases { + for item := range slices.Values(databases) { database = append(database, &biz.Database{ Name: item.Name, - ServerID: server.ID, - Status: biz.DatabaseStatusValid, + Server: server.Name, + Encoding: item.Encoding, }) } } diff --git a/pkg/db/mysql.go b/pkg/db/mysql.go index d9d9f62e..f8be3c44 100644 --- a/pkg/db/mysql.go +++ b/pkg/db/mysql.go @@ -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 } diff --git a/pkg/db/postgres.go b/pkg/db/postgres.go index a2314616..1ac1a1dc 100644 --- a/pkg/db/postgres.go +++ b/pkg/db/postgres.go @@ -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) } diff --git a/pkg/types/mysql.go b/pkg/types/mysql.go index 4f38c08f..2e2d7f8b 100644 --- a/pkg/types/mysql.go +++ b/pkg/types/mysql.go @@ -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"` +} diff --git a/web/src/views/database/DatabaseListView.vue b/web/src/views/database/DatabaseList.vue similarity index 98% rename from web/src/views/database/DatabaseListView.vue rename to web/src/views/database/DatabaseList.vue index 28d05549..96441da2 100644 --- a/web/src/views/database/DatabaseListView.vue +++ b/web/src/views/database/DatabaseList.vue @@ -120,7 +120,7 @@ const columns: any = [ ] const { loading, data, page, total, pageSize, pageCount, refresh } = usePagination( - (page, pageSize) => database.serverList(page, pageSize), + (page, pageSize) => database.list(page, pageSize), { initialData: { total: 0, list: [] }, total: (res: any) => res.total, diff --git a/web/src/views/database/IndexView.vue b/web/src/views/database/IndexView.vue index 54f5b6f7..b0785d10 100644 --- a/web/src/views/database/IndexView.vue +++ b/web/src/views/database/IndexView.vue @@ -5,8 +5,8 @@ defineOptions({ import CreateDatabaseModal from '@/views/database/CreateDatabaseModal.vue' import CreateDatabaseServerModal from '@/views/database/CreateServerModal.vue' -import DatabaseListView from '@/views/database/DatabaseListView.vue' -import ServerListView from '@/views/database/ServerListView.vue' +import DatabaseListView from '@/views/database/DatabaseList.vue' +import ServerListView from '@/views/database/ServerList.vue' import { NButton } from 'naive-ui' const currentTab = ref('database') diff --git a/web/src/views/database/ServerListView.vue b/web/src/views/database/ServerList.vue similarity index 100% rename from web/src/views/database/ServerListView.vue rename to web/src/views/database/ServerList.vue diff --git a/web/src/views/database/UserList.vue b/web/src/views/database/UserList.vue new file mode 100644 index 00000000..c05ed820 --- /dev/null +++ b/web/src/views/database/UserList.vue @@ -0,0 +1,5 @@ + + + + +