| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- package service
- import (
- "bufio"
- "bytes"
- "context"
- "github.com/gogf/gf/v2/container/gvar"
- "github.com/gogf/gf/v2/database/gdb"
- "github.com/gogf/gf/v2/database/gredis"
- "github.com/gogf/gf/v2/frame/g"
- "github.com/tiger1103/gfast/v3/api/v1/system"
- "github.com/tiger1103/gfast/v3/library/libUtils"
- "gopkg.in/yaml.v2"
- "io"
- "os"
- "strings"
- "time"
- )
- type ISysInit interface {
- // 生成配置文件
- CreateConfigFile(ctx context.Context, req *system.DbInitCreateDbReq) (err error)
- // 生成数据库
- CreateDataBase(ctx context.Context, dbName string) (err error)
- // 加载配置文件
- LoadConfigFile() (err error)
- // 是否已生成配置文件
- IsCreateConfigFile() bool
- }
- func SysInit() ISysInit {
- return &sysInit{}
- }
- type sysInit struct{}
- var SysInitConfig map[string]*gvar.Var
- func init() {
- ctx := context.TODO()
- c, err := g.Cfg("initialize").Get(ctx, "initialize")
- if err != nil {
- g.Log().Panic(ctx, err)
- }
- SysInitConfig = make(map[string]*gvar.Var)
- SysInitConfig = c.MapStrVar()
- }
- // 是否已经生成配置文件
- func (s *sysInit) IsCreateConfigFile() bool {
- return libUtils.FileIsExisted(SysInitConfig["configPath"].String())
- }
- // 加载配置文件
- func (s *sysInit) LoadConfigFile() (err error) {
- var (
- ctx = context.TODO()
- )
- fileName, _ := libUtils.ParseFilePath(SysInitConfig["configPath"].String())
- // 加载数据库配置
- c1, err := g.Cfg(fileName).Get(ctx, "database.default")
- if err != nil {
- return
- }
- dbConfig := c1.MapStrVar()
- gdb.SetConfig(gdb.Config{
- "default": gdb.ConfigGroup{
- gdb.ConfigNode{
- Host: dbConfig["host"].String(),
- Port: dbConfig["port"].String(),
- User: dbConfig["user"].String(),
- Pass: dbConfig["pass"].String(),
- Name: dbConfig["name"].String(),
- Type: dbConfig["type"].String(),
- Role: dbConfig["role"].String(),
- Debug: dbConfig["debug"].Bool(),
- Charset: dbConfig["charset"].String(),
- DryRun: dbConfig["dryRun"].Bool(),
- MaxIdleConnCount: dbConfig["maxIdle"].Int(),
- MaxOpenConnCount: dbConfig["maxOpen"].Int(),
- MaxConnLifeTime: dbConfig["maxLifetime"].Duration() * time.Second,
- },
- },
- })
- // 加载redis配置
- c2, err := g.Cfg(fileName).Get(ctx, "redis.default")
- if err != nil {
- return
- }
- redisConfig := c2.Map()
- err = gredis.SetConfigByMap(redisConfig)
- if err != nil {
- return
- }
- return
- }
- // 创建配置文件
- func (s *sysInit) CreateConfigFile(ctx context.Context, req *system.DbInitCreateDbReq) (err error) {
- yamlConfig := req.ToDbInitConfig()
- b, err := yaml.Marshal(yamlConfig)
- if err != nil {
- return
- }
- err = libUtils.WriteToFile(SysInitConfig["configPath"].String(), string(b))
- return
- }
- // 读取sql文件
- func (s *sysInit) ReadSqlFile(path string) (sqlArr []string, err error) {
- inputFile, inputError := os.Open(path)
- if inputError != nil {
- return nil, inputError
- }
- defer inputFile.Close()
- inputReader := bufio.NewReader(inputFile)
- var (
- flag bool = true
- buffer bytes.Buffer
- )
- for {
- inputString, readerError := inputReader.ReadString('\n')
- inputString = strings.TrimSpace(inputString)
- if strings.HasPrefix(inputString, "--") {
- flag = false
- }
- if strings.HasPrefix(inputString, "/*") {
- flag = false
- }
- if flag && inputString != "" {
- if strings.HasSuffix(inputString, ";") {
- if buffer.Len() == 0 {
- sqlArr = append(sqlArr, inputString)
- } else {
- buffer.WriteString(inputString)
- sqlArr = append(sqlArr, buffer.String())
- buffer.Reset()
- }
- } else {
- buffer.WriteString(inputString + " ")
- }
- }
- if !flag && strings.HasPrefix(inputString, "*/") {
- flag = true
- }
- if !flag && strings.HasPrefix(inputString, "--") {
- flag = true
- }
- if readerError == io.EOF {
- break
- }
- }
- return
- }
- // 创建数据库表
- func (s *sysInit) CreateDataBase(ctx context.Context, dbName string) (err error) {
- sqlArr, err := s.ReadSqlFile(SysInitConfig["sqlFilePath"].String())
- if err != nil {
- return
- }
- if len(sqlArr) == 0 {
- return
- }
- // newSqlArr := SqlArr(sqlArr).Split(10)
- db := g.DB()
- for _, item := range sqlArr {
- _, err = db.Exec(ctx, item)
- if err != nil {
- return
- }
- }
- return
- }
- type SqlArr []string
- func (arr SqlArr) Split(num int) (result SqlArr) {
- if len(arr) == 0 {
- return
- }
- var (
- buffer bytes.Buffer
- i int
- )
- for _, item := range arr {
- buffer.WriteString(item)
- i++
- if i == num {
- result = append(result, buffer.String())
- buffer.Reset()
- i = 0
- }
- }
- if buffer.Len() > 0 {
- result = append(result, buffer.String())
- }
- return
- }
|