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 @@
+
+
+
+
+