Explorar el Código

阶段性工作

Jollia Dai hace 2 meses
padre
commit
2f1d944894
Se han modificado 4 ficheros con 107 adiciones y 44 borrados
  1. 1 2
      .gitignore
  2. 5 0
      conf/db.yaml
  3. 12 14
      services/config.go
  4. 89 28
      services/gen_service.go

+ 1 - 2
.gitignore

@@ -6,8 +6,7 @@
 
 /db2code.exe
 /db2code
-
-/*.log
+/log/
 
 # Output File
 /out/

+ 5 - 0
conf/db.yaml

@@ -0,0 +1,5 @@
+host: 158.8.12.102
+port: 3308
+user: root
+pwd: ticket@2025
+schema: ticket-cloud-0212

+ 12 - 14
services/config.go

@@ -1,8 +1,8 @@
 package services
 
 import (
-	"errors"
 	"flag"
+	"github.com/pkg/errors"
 )
 
 type DbConfig struct {
@@ -13,23 +13,19 @@ type DbConfig struct {
 	Pwd    string `json:"pwd,omitempty" yaml:"pwd,omitempty"`
 }
 
-const (
-	defCfgFilePath = "conf/db.yaml"
-)
-
 var (
-	dbConfigInstance *DbConfig
-	cfgFilePath      string
+	dbConfigFlag    *DbConfig
+	cfgFilePathFlag string
 )
 
 func init() {
-	dbConfigInstance = &DbConfig{}
-	flag.StringVar(&dbConfigInstance.Host, "h", "", "database host")
-	flag.IntVar(&dbConfigInstance.Port, "p", 0, "database port")
-	flag.StringVar(&dbConfigInstance.Schema, "s", "", "database schema")
-	flag.StringVar(&dbConfigInstance.User, "u", "", "database user")
-	flag.StringVar(&dbConfigInstance.Pwd, "P", "", "database password")
-	flag.StringVar(&cfgFilePath, "c", "", "database config file path")
+	dbConfigFlag = &DbConfig{}
+	flag.StringVar(&dbConfigFlag.Host, "h", "", "database host")
+	flag.IntVar(&dbConfigFlag.Port, "p", 0, "database port")
+	flag.StringVar(&dbConfigFlag.Schema, "s", "", "database schema")
+	flag.StringVar(&dbConfigFlag.User, "u", "", "database user")
+	flag.StringVar(&dbConfigFlag.Pwd, "P", "", "database password")
+	flag.StringVar(&cfgFilePathFlag, "c", "", "database config file path")
 }
 
 func (cfg *DbConfig) IsZero() bool {
@@ -67,6 +63,8 @@ func (cfg *DbConfig) FixDefaultValues() error {
 
 	if cfg.Port == 0 {
 		cfg.Port = 3306
+	} else if cfg.Port < 1 || cfg.Port > 65535 {
+		return errors.Errorf("invalid database port %d", cfg.Port)
 	}
 
 	if cfg.User == "" {

+ 89 - 28
services/gen_service.go

@@ -8,9 +8,14 @@ import (
 	"gorm.io/gen"
 	"gorm.io/gorm"
 	"gorm.io/gorm/logger"
+	"jollia.cn/jolib/jokode"
 	"strings"
 )
 
+const (
+	defCfgFilePath = "conf/db.yaml"
+)
+
 type GenService struct {
 	dbInstance *gorm.DB
 }
@@ -20,13 +25,96 @@ func (s *GenService) Init() error {
 		flag.Parse()
 	}
 
-	if dbConfigInstance.IsZero() {
+	var (
+		dbCfg       *DbConfig
+		cfgFilePath string
+		force       bool
+	)
+
+	if cfgFilePathFlag != "" {
+		cfgFilePath = cfgFilePathFlag
+		force = true
+	} else {
+		cfgFilePath = defCfgFilePath
+		force = false
+	}
 
+	if cfg, err := loadConfigFromFile(cfgFilePath, force); err != nil {
+		return errors.Wrapf(err, "try load db config from file '%s' fail", cfgFilePath)
+	} else if cfg == nil {
+		return errors.New("load db config returns nil")
+	} else {
+		dbCfg = cfg
+	}
+
+	if !dbConfigFlag.IsZero() {
+		if dbConfigFlag.Host != "" {
+			dbCfg.Host = dbConfigFlag.Host
+		}
+
+		if dbConfigFlag.Port != 0 {
+			dbCfg.Port = dbConfigFlag.Port
+		}
+
+		if dbConfigFlag.Schema != "" {
+			dbCfg.Schema = dbConfigFlag.Schema
+		}
+
+		if dbConfigFlag.User != "" {
+			dbCfg.User = dbConfigFlag.User
+		}
+
+		if dbConfigFlag.Pwd != "" {
+			dbCfg.Pwd = dbConfigFlag.Pwd
+		}
+	}
+
+	if err := s.initDatabase(dbCfg); err != nil {
+		return errors.Wrap(err, "try init database fail")
 	}
 
 	return nil
 }
 
+func (s *GenService) initDatabase(dbCfg *DbConfig) error {
+	if dbCfg == nil {
+		return errors.New("can not init database with nil db config")
+	}
+
+	if err := dbCfg.FixDefaultValues(); err != nil {
+		return errors.Wrap(err, "try fix default values of database config fail")
+	}
+
+	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
+		dbCfg.User,
+		dbCfg.Pwd,
+		dbCfg.Host,
+		dbCfg.Port,
+		dbCfg.Schema)
+
+	if db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
+		Logger: logger.Default.LogMode(logger.Info),
+	}); err != nil {
+		return errors.Wrapf(err, "try open database with dsn '%s' fail", dsn)
+	} else {
+		s.dbInstance = db
+	}
+
+	return nil
+}
+
+func loadConfigFromFile(filePath string, force bool) (*DbConfig, error) {
+	cfg := &DbConfig{}
+
+	if err := jokode.LoadConfigFromFile(cfg, filePath); err != nil {
+		if force {
+			return nil, errors.Wrapf(err, "try load config from file '%s' fail", filePath)
+		}
+	}
+
+	return cfg, nil
+}
+
 func (s *GenService) Start() error {
 	if s.dbInstance == nil {
 		return errors.New("try start gen service with nil database instance")
@@ -76,30 +164,3 @@ func (s *GenService) GetName() string {
 func (s *GenService) GetInitOrder() int {
 	return 0
 }
-
-func (s *GenService) initDatabase(dbCfg *DbConfig) error {
-	if dbCfg == nil {
-		return errors.New("can not init database with nil db config")
-	}
-
-	if err := dbCfg.FixDefaultValues(); err != nil {
-		return errors.Wrap(err, "try fix default values of database config fail")
-	}
-
-	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
-		dbCfg.User,
-		dbCfg.Pwd,
-		dbCfg.Host,
-		dbCfg.Port,
-		dbCfg.Schema)
-
-	if db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
-		Logger: logger.Default.LogMode(logger.Info),
-	}); err != nil {
-		return errors.Wrapf(err, "try open database with dsn '%s' fail", dsn)
-	} else {
-		s.dbInstance = db
-	}
-
-	return nil
-}