125 lines
3.5 KiB
Go
125 lines
3.5 KiB
Go
package system
|
||
|
||
import (
|
||
"context"
|
||
|
||
"kra/internal/biz/system"
|
||
"kra/internal/conf"
|
||
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
type autoCodeRepo struct {
|
||
db *gorm.DB
|
||
dbName string
|
||
conf *conf.Bootstrap
|
||
}
|
||
|
||
// NewAutoCodeRepo 创建自动代码仓储
|
||
func NewAutoCodeRepo(db *gorm.DB, conf *conf.Bootstrap) system.AutoCodeRepo {
|
||
// 获取默认数据库名
|
||
dbName := ""
|
||
if conf.Mysql != nil && conf.Mysql.DbName != "" {
|
||
dbName = conf.Mysql.DbName
|
||
} else if conf.Pgsql != nil && conf.Pgsql.DbName != "" {
|
||
dbName = conf.Pgsql.DbName
|
||
} else if conf.Sqlite != nil && conf.Sqlite.DbName != "" {
|
||
dbName = conf.Sqlite.DbName
|
||
}
|
||
return &autoCodeRepo{
|
||
db: db,
|
||
dbName: dbName,
|
||
conf: conf,
|
||
}
|
||
}
|
||
|
||
// GetDB 获取所有数据库
|
||
func (r *autoCodeRepo) GetDB(ctx context.Context, businessDB string) ([]system.Db, error) {
|
||
var entities []system.Db
|
||
sql := "SELECT SCHEMA_NAME AS `database` FROM INFORMATION_SCHEMA.SCHEMATA;"
|
||
err := r.db.WithContext(ctx).Raw(sql).Scan(&entities).Error
|
||
return entities, err
|
||
}
|
||
|
||
// GetTables 获取指定数据库的所有表
|
||
func (r *autoCodeRepo) GetTables(ctx context.Context, businessDB, dbName string) ([]system.Table, error) {
|
||
var entities []system.Table
|
||
sql := `SELECT table_name AS table_name FROM information_schema.tables WHERE table_schema = ?`
|
||
err := r.db.WithContext(ctx).Raw(sql, dbName).Scan(&entities).Error
|
||
return entities, err
|
||
}
|
||
|
||
// GetColumn 获取指定表的所有列
|
||
func (r *autoCodeRepo) GetColumn(ctx context.Context, businessDB, tableName, dbName string) ([]system.Column, error) {
|
||
var entities []system.Column
|
||
sql := `
|
||
SELECT
|
||
c.COLUMN_NAME column_name,
|
||
c.DATA_TYPE data_type,
|
||
CASE c.DATA_TYPE
|
||
WHEN 'longtext' THEN c.CHARACTER_MAXIMUM_LENGTH
|
||
WHEN 'varchar' THEN c.CHARACTER_MAXIMUM_LENGTH
|
||
WHEN 'double' THEN CONCAT_WS(',', c.NUMERIC_PRECISION, c.NUMERIC_SCALE)
|
||
WHEN 'decimal' THEN CONCAT_WS(',', c.NUMERIC_PRECISION, c.NUMERIC_SCALE)
|
||
WHEN 'int' THEN c.NUMERIC_PRECISION
|
||
WHEN 'bigint' THEN c.NUMERIC_PRECISION
|
||
ELSE ''
|
||
END AS data_type_long,
|
||
c.COLUMN_COMMENT column_comment,
|
||
CASE WHEN kcu.COLUMN_NAME IS NOT NULL THEN 1 ELSE 0 END AS primary_key,
|
||
c.ORDINAL_POSITION
|
||
FROM
|
||
INFORMATION_SCHEMA.COLUMNS c
|
||
LEFT JOIN
|
||
INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
|
||
ON
|
||
c.TABLE_SCHEMA = kcu.TABLE_SCHEMA
|
||
AND c.TABLE_NAME = kcu.TABLE_NAME
|
||
AND c.COLUMN_NAME = kcu.COLUMN_NAME
|
||
AND kcu.CONSTRAINT_NAME = 'PRIMARY'
|
||
WHERE
|
||
c.TABLE_NAME = ?
|
||
AND c.TABLE_SCHEMA = ?
|
||
ORDER BY
|
||
c.ORDINAL_POSITION;`
|
||
err := r.db.WithContext(ctx).Raw(sql, tableName, dbName).Scan(&entities).Error
|
||
return entities, err
|
||
}
|
||
|
||
// GetDBList 获取配置的数据库列表
|
||
func (r *autoCodeRepo) GetDBList() []system.DBInfo {
|
||
// 目前KRA只支持单数据库配置,返回主数据库信息
|
||
var dbList []system.DBInfo
|
||
if r.conf.Mysql != nil && r.conf.Mysql.DbName != "" {
|
||
dbList = append(dbList, system.DBInfo{
|
||
AliasName: "",
|
||
DBName: r.conf.Mysql.DbName,
|
||
Disable: false,
|
||
DBType: "mysql",
|
||
})
|
||
}
|
||
if r.conf.Pgsql != nil && r.conf.Pgsql.DbName != "" {
|
||
dbList = append(dbList, system.DBInfo{
|
||
AliasName: "",
|
||
DBName: r.conf.Pgsql.DbName,
|
||
Disable: false,
|
||
DBType: "pgsql",
|
||
})
|
||
}
|
||
if r.conf.Sqlite != nil && r.conf.Sqlite.DbName != "" {
|
||
dbList = append(dbList, system.DBInfo{
|
||
AliasName: "",
|
||
DBName: r.conf.Sqlite.DbName,
|
||
Disable: false,
|
||
DBType: "sqlite",
|
||
})
|
||
}
|
||
return dbList
|
||
}
|
||
|
||
// GetActiveDBName 获取当前活动的数据库名
|
||
func (r *autoCodeRepo) GetActiveDBName(businessDB string) string {
|
||
// 目前KRA只支持单数据库,直接返回配置的数据库名
|
||
return r.dbName
|
||
}
|