gennerator.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package orm
  2. import (
  3. "fmt"
  4. "gitea.ckfah.com/go-script/file"
  5. "gitea.ckfah.com/go-script/logger"
  6. "gitea.ckfah.com/go-script/orm/temp"
  7. "gitea.ckfah.com/go-script/utils"
  8. "github.com/go-xorm/xorm"
  9. "path/filepath"
  10. "text/template"
  11. )
  12. func (config *Config) initTemplate() error {
  13. {
  14. parse, err := template.New(modelTemplateName).Parse(temp.Model)
  15. if err != nil {
  16. return err
  17. }
  18. config.modelTemplate = parse
  19. }
  20. {
  21. parse, err := template.New(daoTemplateName).Parse(temp.Dao)
  22. if err != nil {
  23. return err
  24. }
  25. config.daoTemplate = parse
  26. }
  27. {
  28. parse, err := template.New(dtoTemplateName).Funcs(map[string]interface{}{
  29. "Upper": utils.Marshal,
  30. }).Parse(temp.Dto)
  31. if err != nil {
  32. return err
  33. }
  34. config.dtoTemplate = parse
  35. }
  36. return nil
  37. }
  38. func (config *Config) initDb() error {
  39. engine, err := xorm.NewEngine(string(config.DbType), FillDNS(config.DbUserName, config.DbPassword, config.DbHost, config.DbPort, config.DbName, config.DbCharset))
  40. if err != nil {
  41. return err
  42. }
  43. err = engine.Ping()
  44. if err != nil {
  45. return err
  46. }
  47. config.engine = engine
  48. if config.TableNames == nil || len(config.TableNames) == 0 {
  49. tableNames, err := NewMysqlMeta(config.DbName, engine).GetTables()
  50. if err != nil {
  51. return err
  52. }
  53. config.TableNames = tableNames
  54. }
  55. return nil
  56. }
  57. func (config *Config) Generator() error {
  58. dir, err := filepath.Abs(config.SaveFile)
  59. if err != nil {
  60. return err
  61. }
  62. config.SaveFile = dir
  63. logger.InfoF("save path: %s", dir)
  64. config.initPackage()
  65. err = config.initDb()
  66. if err != nil {
  67. return err
  68. }
  69. err = config.initTemplate()
  70. if err != nil {
  71. return err
  72. }
  73. var dtoMetas *DtoMetas
  74. if config.GeneratorDto {
  75. dtoMetas = NewDtoMeta(config.DtoPackageName)
  76. }
  77. for _, tableName := range config.TableNames {
  78. config.wg.Add(1)
  79. go func(config *Config, tableName string, dtoMetas *DtoMetas) {
  80. defer func() {
  81. if err := recover(); err != nil {
  82. logger.FatalF("generate err: %v", err)
  83. }
  84. config.wg.Done()
  85. }()
  86. switch config.DbType {
  87. case Mysql:
  88. func() {
  89. err := mysql(config, tableName, dtoMetas)
  90. if err != nil {
  91. logger.FatalF("generate err: %v", err)
  92. }
  93. }()
  94. default:
  95. logger.FatalF("not support %s db type", config.DbType)
  96. }
  97. }(config, tableName, dtoMetas)
  98. }
  99. config.wg.Wait()
  100. return nil
  101. }
  102. func (config *Config) initPackage() {
  103. if config.ModelPackageName == "" {
  104. config.ModelPackageName = defaultModelName
  105. }
  106. if config.DaoPackageName == "" {
  107. config.DaoPackageName = defaultDaoName
  108. }
  109. if config.DtoPackageName == "" {
  110. config.DtoPackageName = defaultDtoPackageName
  111. }
  112. }
  113. func mysql(config *Config, tableName string, dtoMetas *DtoMetas) error {
  114. if config.GeneratorModel {
  115. model := NewModelMeta(config.DbName, tableName, config.ModelPackageName, config.engine, config.Tags)
  116. modelBody, err := model.Run(config.modelTemplate)
  117. if err != nil {
  118. return err
  119. }
  120. saveFilePath := getSaveFileName(config.SaveFile, config.ModelPackageName, tableName)
  121. err = file.WriteFile(saveFilePath, modelBody)
  122. if err != nil {
  123. return err
  124. }
  125. logger.InfoF("save %s model success, path=%s", tableName, saveFilePath)
  126. if config.GeneratorDto && dtoMetas != nil {
  127. dtoMetas.Append(model)
  128. }
  129. }
  130. if config.GeneratorDao {
  131. dao := DaoMeta{
  132. TableName: tableName,
  133. DaoPackage: config.DaoPackageName,
  134. ModelPackage: config.ModelPackageName,
  135. }
  136. daoBody, err := dao.Run(config.daoTemplate)
  137. if err != nil {
  138. return err
  139. }
  140. saveFilePath := getSaveFileName(config.SaveFile, config.DaoPackageName, getDaoFileName(tableName))
  141. err = file.WriteFile(saveFilePath, daoBody)
  142. if err != nil {
  143. return err
  144. }
  145. logger.InfoF("save %s dao success, path= %s", tableName, saveFilePath)
  146. }
  147. if config.GeneratorDto {
  148. err := config.saveDtoFile(tableName, dtoMetas)
  149. if err != nil {
  150. return err
  151. }
  152. }
  153. return nil
  154. }
  155. /**
  156. dto file 坚持一个文件一个db
  157. */
  158. func (config *Config) saveDtoFile(tableName string, dtoMetas *DtoMetas) error {
  159. if (!config.GeneratorDto) || dtoMetas == nil {
  160. return nil
  161. }
  162. dtoFile := getSaveFileName(config.SaveFile, config.DtoPackageName, getDtoFileName(tableName))
  163. bytes, err := dtoMetas.Run(config.dtoTemplate)
  164. if err != nil {
  165. return err
  166. }
  167. err = file.WriteFile(dtoFile, bytes)
  168. if err != nil {
  169. return err
  170. }
  171. logger.InfoF("save %s dto success, path= %s", config.DbName, dtoFile)
  172. return nil
  173. }
  174. func getDaoFileName(tableName string) string {
  175. return fmt.Sprintf("%s_dao", tableName)
  176. }
  177. func getDtoFileName(dbName string) string {
  178. return fmt.Sprintf("%s_dto", dbName)
  179. }
  180. func getSaveFileName(dir, packageName, fileName string) string {
  181. return fmt.Sprintf("%s%s%s%s%s%s", dir, sep, packageName, sep, fileName, fileSuffix)
  182. }