Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package config
  2. import (
  3. "sync"
  4. "git.x2erp.com/qdy/go-base/config/subconfigs"
  5. "git.x2erp.com/qdy/go-base/logger"
  6. )
  7. // IConfig 主配置接口(更新支持多数据库)
  8. type IConfig interface {
  9. // 多数据库支持
  10. GetDatabase() *subconfigs.DatabaseConfig // 获取默认数据库(向后兼容)
  11. GetDatabases() *subconfigs.DatabasesConfig // 获取所有数据库配置
  12. GetDatabaseConfig(name string) *subconfigs.DatabaseConfig // 按名称获取数据库配置
  13. // 其他配置(保持不变)
  14. GetRedis() *subconfigs.RedisConfig
  15. GetDoris() *subconfigs.DorisConfig
  16. GetRabbitMQ() *subconfigs.RabbitMQConfig
  17. GetAuth() *subconfigs.AuthConfig
  18. GetService() *subconfigs.ServiceConfig
  19. GetHTTP() *subconfigs.HTTPConfig
  20. GetMicro() *subconfigs.MicroConfig
  21. GetLog() *subconfigs.LogConfig
  22. GetInitError() error
  23. // 配置检查(更新)
  24. IsDatabaseConfigured() bool
  25. IsDatabaseConfiguredByName(name string) bool
  26. IsDorisConfigured() bool
  27. IsRedisConfigured() bool
  28. SetServiceName(name string)
  29. SetServiceVersion(version string)
  30. SetEnv(name string)
  31. }
  32. // Config 主配置结构体 - 访问门面
  33. type Config struct {
  34. initError error // 初始化错误
  35. }
  36. // ========== 数据库相关方法(更新) ==========
  37. // GetDatabases 获取所有数据库配置
  38. func (c *Config) GetDatabases() *subconfigs.DatabasesConfig {
  39. if config := subconfigs.GetRegisteredConfig("databases"); config != nil {
  40. if dbs, ok := config.(*subconfigs.DatabasesConfig); ok {
  41. return dbs
  42. }
  43. }
  44. return nil
  45. }
  46. // GetDatabase 获取默认数据库配置(向后兼容)
  47. func (c *Config) GetDatabase() *subconfigs.DatabaseConfig {
  48. dbs := c.GetDatabases()
  49. if dbs == nil {
  50. logger.Errorf("获取默认数据库连接配置发生错误:配置为空!")
  51. return nil
  52. }
  53. return dbs.GetDefaultDatabase()
  54. }
  55. // GetDatabaseConfig 按名称获取数据库配置
  56. func (c *Config) GetDatabaseConfig(name string) *subconfigs.DatabaseConfig {
  57. dbs := c.GetDatabases()
  58. if dbs == nil {
  59. return nil
  60. }
  61. return dbs.GetDatabase(name)
  62. }
  63. // IsDatabaseConfigured 检查默认数据库是否配置
  64. func (c *Config) IsDatabaseConfigured() bool {
  65. dbs := c.GetDatabases()
  66. if dbs == nil {
  67. return false
  68. }
  69. return dbs.IsConfigured()
  70. }
  71. // IsDatabaseConfiguredByName 检查指定名称的数据库是否配置
  72. func (c *Config) IsDatabaseConfiguredByName(name string) bool {
  73. dbs := c.GetDatabases()
  74. if dbs == nil {
  75. return false
  76. }
  77. return dbs.IsConfigured()
  78. }
  79. // ========== 其他配置方法(保持不变) ==========
  80. func (c *Config) GetRedis() *subconfigs.RedisConfig {
  81. if config := subconfigs.GetRegisteredConfig("redis"); config != nil {
  82. return config.(*subconfigs.RedisConfig)
  83. }
  84. return nil
  85. }
  86. func (c *Config) GetDoris() *subconfigs.DorisConfig {
  87. if config := subconfigs.GetRegisteredConfig("doris"); config != nil {
  88. return config.(*subconfigs.DorisConfig)
  89. }
  90. return nil
  91. }
  92. func (c *Config) GetRabbitMQ() *subconfigs.RabbitMQConfig {
  93. if config := subconfigs.GetRegisteredConfig("rabbitmq"); config != nil {
  94. return config.(*subconfigs.RabbitMQConfig)
  95. }
  96. return nil
  97. }
  98. func (c *Config) GetAuth() *subconfigs.AuthConfig {
  99. if config := subconfigs.GetRegisteredConfig("auth"); config != nil {
  100. return config.(*subconfigs.AuthConfig)
  101. }
  102. return nil
  103. }
  104. func (c *Config) GetService() *subconfigs.ServiceConfig {
  105. if config := subconfigs.GetRegisteredConfig("service"); config != nil {
  106. return config.(*subconfigs.ServiceConfig)
  107. }
  108. return nil
  109. }
  110. func (c *Config) GetHTTP() *subconfigs.HTTPConfig {
  111. if config := subconfigs.GetRegisteredConfig("http"); config != nil {
  112. return config.(*subconfigs.HTTPConfig)
  113. }
  114. return nil
  115. }
  116. func (c *Config) GetMicro() *subconfigs.MicroConfig {
  117. if config := subconfigs.GetRegisteredConfig("micro"); config != nil {
  118. return config.(*subconfigs.MicroConfig)
  119. }
  120. return nil
  121. }
  122. func (c *Config) GetLog() *subconfigs.LogConfig {
  123. if config := subconfigs.GetRegisteredConfig("log"); config != nil {
  124. return config.(*subconfigs.LogConfig)
  125. }
  126. return nil
  127. }
  128. func (c *Config) GetInitError() error {
  129. return c.initError
  130. }
  131. // 实现 IConfig 接口的其他方法
  132. func (c *Config) IsDorisConfigured() bool {
  133. doris := c.GetDoris()
  134. return doris != nil && doris.IsConfigured()
  135. }
  136. func (c *Config) IsRedisConfigured() bool {
  137. redis := c.GetRedis()
  138. return redis != nil && redis.IsConfigured()
  139. }
  140. // 设置方法
  141. func (c *Config) SetEnv(name string) {
  142. if c.GetService().Env == "" {
  143. c.GetService().Env = name
  144. }
  145. }
  146. func (c *Config) SetServiceName(name string) {
  147. if c.GetService().ServiceName == "" {
  148. c.GetService().ServiceName = name
  149. }
  150. }
  151. func (c *Config) SetServiceVersion(version string) {
  152. c.GetService().ServiceVersion = version
  153. }
  154. // ========== 包级便捷函数(更新) ==========
  155. // GetDatabases 包级便捷函数 - 获取所有数据库配置
  156. func GetDatabases() *subconfigs.DatabasesConfig {
  157. if cfgInstance == nil {
  158. return nil
  159. }
  160. return cfgInstance.GetDatabases()
  161. }
  162. // GetDatabase 包级便捷函数 - 获取默认数据库配置(向后兼容)
  163. func GetDatabase() *subconfigs.DatabaseConfig {
  164. if cfgInstance == nil {
  165. return &subconfigs.DatabaseConfig{}
  166. }
  167. return cfgInstance.GetDatabase()
  168. }
  169. // GetDatabaseConfig 包级便捷函数 - 按名称获取数据库配置
  170. func GetDatabaseConfig(name string) *subconfigs.DatabaseConfig {
  171. if cfgInstance == nil {
  172. return nil
  173. }
  174. return cfgInstance.GetDatabaseConfig(name)
  175. }
  176. // GetRedis 包级便捷函数 - 获取Redis配置
  177. func GetRedis() *subconfigs.RedisConfig {
  178. if cfgInstance == nil {
  179. return &subconfigs.RedisConfig{}
  180. }
  181. return cfgInstance.GetRedis()
  182. }
  183. // GetHTTP 包级便捷函数 - 获取HTTP配置
  184. func GetHTTP() *subconfigs.HTTPConfig {
  185. if cfgInstance == nil {
  186. return &subconfigs.HTTPConfig{}
  187. }
  188. return cfgInstance.GetHTTP()
  189. }
  190. // GetLog 包级便捷函数 - 获取日志配置
  191. func GetLog() *subconfigs.LogConfig {
  192. if cfgInstance == nil {
  193. return &subconfigs.LogConfig{}
  194. }
  195. return cfgInstance.GetLog()
  196. }
  197. func GetMicro() *subconfigs.MicroConfig {
  198. if cfgInstance == nil {
  199. return &subconfigs.MicroConfig{}
  200. }
  201. return cfgInstance.GetMicro()
  202. }
  203. func GetAuth() *subconfigs.AuthConfig {
  204. if cfgInstance == nil {
  205. return &subconfigs.AuthConfig{}
  206. }
  207. return cfgInstance.GetAuth()
  208. }
  209. func GetService() *subconfigs.ServiceConfig {
  210. if cfgInstance == nil {
  211. return &subconfigs.ServiceConfig{}
  212. }
  213. return cfgInstance.GetService()
  214. }
  215. // ========== 单例管理 ==========
  216. var (
  217. cfgInstance *Config
  218. once sync.Once
  219. )
  220. // GetConfig 获取主配置(单例模式)
  221. func GetConfig() (IConfig, error) {
  222. once.Do(func() {
  223. cfgInstance = &Config{}
  224. cfgInstance.initError = LoadConfig() // 加载配置到注册表
  225. })
  226. return cfgInstance, cfgInstance.initError
  227. }
  228. // GetInitError 包级函数 - 兼容现有代码调用
  229. func GetInitError() error {
  230. return cfgInstance.GetInitError()
  231. }
  232. // GetConfigWithError 新方法 - 同时获取配置和错误
  233. func GetConfigWithError() (IConfig, error) {
  234. cfg, err := GetConfig()
  235. return cfg, err
  236. }