You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
4.9 KiB
199 lines
4.9 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"database/sql" |
|
"fmt" |
|
|
|
"go-common/app/admin/main/search/model" |
|
"go-common/library/ecode" |
|
) |
|
|
|
// BusinessAllV2 . |
|
func (s *Service) BusinessAllV2(c context.Context) (list []*model.GFBusiness, err error) { |
|
return s.dao.BusinessAllV2(c) |
|
} |
|
|
|
// BusinessInfoV2 . |
|
func (s *Service) BusinessInfoV2(c context.Context, name string) (info *model.GFBusiness, err error) { |
|
return s.dao.BusinessInfoV2(c, name) |
|
} |
|
|
|
// BusinessAdd . |
|
func (s *Service) BusinessAdd(c context.Context, pid int64, name, description string) (id int64, err error) { |
|
return s.dao.BusinessIns(c, pid, name, description) |
|
} |
|
|
|
// BusinessUpdate . |
|
func (s *Service) BusinessUpdate(c context.Context, name, filed, value string) (id int64, err error) { |
|
allowFields := []string{"data_conf", "index_conf", "business_conf", "description", "state"} |
|
var allow bool |
|
for _, v := range allowFields { |
|
if v == filed { |
|
allow = true |
|
} |
|
} |
|
if !allow { |
|
err = ecode.AccessDenied |
|
return |
|
} |
|
return s.dao.BusinessUpdate(c, name, filed, value) |
|
} |
|
|
|
// AssetDBTables . |
|
func (s *Service) AssetDBTables(c context.Context) (list []*model.GFAsset, err error) { |
|
return s.dao.AssetDBTables(c) |
|
} |
|
|
|
// AssetDBConnect . |
|
func (s *Service) AssetDBConnect(c context.Context, host, port, user, password string) (dbNames []string, err error) { |
|
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%s)/?charset=utf8mb4,utf8", user, password, host, port)) |
|
if err != nil { |
|
return |
|
} |
|
defer db.Close() |
|
rows, err := db.Query("show databases") |
|
if err != nil { |
|
return |
|
} |
|
defer rows.Close() |
|
dbNames = make([]string, 0) |
|
for rows.Next() { |
|
var name string |
|
if err = rows.Scan(&name); err != nil { |
|
return |
|
} |
|
dbNames = append(dbNames, name) |
|
} |
|
return dbNames, rows.Err() |
|
} |
|
|
|
// AssetDBAdd . |
|
func (s *Service) AssetDBAdd(c context.Context, name, description, host, port, user, password string) (id int64, err error) { |
|
dbnames, err := s.AssetDBConnect(c, host, port, user, password) |
|
if err != nil { |
|
return |
|
} |
|
var dbExist bool |
|
for _, v := range dbnames { |
|
if v == name { |
|
dbExist = true |
|
} |
|
} |
|
if !dbExist { |
|
err = ecode.AccessDenied |
|
return |
|
} |
|
dsn := fmt.Sprintf(model.DBDsnFormat, user, password, host, port, name) |
|
return s.dao.AssetDBIns(c, name, description, dsn) |
|
} |
|
|
|
// AssetTableAdd . |
|
func (s *Service) AssetTableAdd(c context.Context, db, regex, fields, description string) (id int64, err error) { |
|
name := db + "." + regex |
|
return s.dao.AssetTableIns(c, name, db, regex, fields, description) |
|
} |
|
|
|
// UpdateAssetTable . |
|
func (s *Service) UpdateAssetTable(c context.Context, name, fields string) (id int64, err error) { |
|
return s.dao.UpdateAssetTable(c, name, fields) |
|
} |
|
|
|
// AssetInfoV2 . |
|
func (s *Service) AssetInfoV2(c context.Context, name string) (info *model.GFAsset, err error) { |
|
return s.dao.Asset(c, name) |
|
} |
|
|
|
// AssetShowTables . |
|
func (s *Service) AssetShowTables(c context.Context, dbName string) (tables []string, err error) { |
|
asset, err := s.dao.Asset(c, dbName) |
|
if err != nil { |
|
return |
|
} |
|
db, err := sql.Open("mysql", asset.DSN) |
|
if err != nil { |
|
return |
|
} |
|
defer db.Close() |
|
rows, err := db.Query("show tables") |
|
if err != nil { |
|
return |
|
} |
|
defer rows.Close() |
|
tables = make([]string, 0) |
|
for rows.Next() { |
|
var name string |
|
if err = rows.Scan(&name); err != nil { |
|
return |
|
} |
|
tables = append(tables, name) |
|
} |
|
return tables, rows.Err() |
|
} |
|
|
|
// AssetTableFields . |
|
func (s *Service) AssetTableFields(c context.Context, dbName, regex string) (fs []*model.TableField, count int, err error) { |
|
asset, err := s.dao.Asset(c, dbName) |
|
if err != nil { |
|
return |
|
} |
|
db, err := sql.Open("mysql", asset.DSN) |
|
if err != nil { |
|
return |
|
} |
|
defer db.Close() |
|
regex = fmt.Sprintf("^%s$", regex) |
|
rows, err := db.Query("SELECT COLUMN_NAME,DATA_TYPE,count(1) FROM information_schema.COLUMNS WHERE table_name REGEXP ? GROUP BY COLUMN_NAME,DATA_TYPE", regex) |
|
if err != nil { |
|
return |
|
} |
|
defer rows.Close() |
|
fs = make([]*model.TableField, 0) |
|
for rows.Next() { |
|
f := new(model.TableField) |
|
if err = rows.Scan(&f.Name, &f.Type, &f.Count); err != nil { |
|
return nil, 0, err |
|
} |
|
fs = append(fs, f) |
|
} |
|
if err = rows.Err(); err != nil { |
|
return |
|
} |
|
if len(fs) == 0 { |
|
err = ecode.NothingFound |
|
return |
|
} |
|
for _, f := range fs { |
|
if fs[0].Count != f.Count { |
|
err = ecode.NothingFound |
|
return |
|
} |
|
count = f.Count |
|
} |
|
row := db.QueryRow("SELECT COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE table_name REGEXP ? AND CONSTRAINT_NAME='PRIMARY' GROUP BY CONSTRAINT_NAME LIMIT 1", regex) |
|
var primaryCo string |
|
err = row.Scan(&primaryCo) |
|
for k, v := range fs { |
|
if v.Name == primaryCo { |
|
fs[k].Primary = true |
|
} |
|
} |
|
return fs, count, err |
|
} |
|
|
|
// ClusterOwners . |
|
func (s *Service) ClusterOwners() map[string]string { |
|
clusters := s.c.Es |
|
res := make(map[string]string) |
|
res["default"] = "guanhuaxin,daizhichen,libingqi,zhapuyu" |
|
for name, es := range clusters { |
|
if es.Owner == "" { |
|
continue |
|
} |
|
if es.Cluster != "" { |
|
name = es.Cluster |
|
} |
|
res[name] = es.Owner |
|
} |
|
return res |
|
}
|
|
|