暫無描述
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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "strings"
  8. "time"
  9. "git.x2erp.com/qdy/go-base/types"
  10. "git.x2erp.com/qdy/go-db/factory"
  11. "git.x2erp.com/qdy/go-service-vbdx/auth"
  12. "git.x2erp.com/qdy/go-service-vbdx/routes"
  13. "github.com/gin-gonic/gin"
  14. )
  15. // 单例实例
  16. var (
  17. dbFactory *factory.DBFactory
  18. db *sql.DB
  19. )
  20. // initDB 初始化数据库连接(单例)
  21. func initDB() error {
  22. var err error
  23. // 创建数据库工厂(单例)
  24. if dbFactory == nil {
  25. dbFactory, err = factory.NewDBFactory()
  26. if err != nil {
  27. return fmt.Errorf("failed to create DB factory: %v", err)
  28. }
  29. }
  30. // 创建数据库连接(单例)
  31. if db == nil {
  32. db, err = dbFactory.CreateDB()
  33. if err != nil {
  34. return fmt.Errorf("failed to create database connection: %v", err)
  35. }
  36. }
  37. // 测试连接
  38. config := dbFactory.GetConfig()
  39. if err := factory.TestConnection(db, config.GetDatabase().Type); err != nil {
  40. return fmt.Errorf("database connection test failed: %v", err)
  41. }
  42. return nil
  43. }
  44. func main() {
  45. // 1. 初始化数据库(单例)
  46. if err := initDB(); err != nil {
  47. log.Fatalf("Database initialization failed: %v", err)
  48. }
  49. // 2. 显示基础信息
  50. drivers := dbFactory.GetAvailableDrivers()
  51. config := dbFactory.GetConfig()
  52. log.Printf("Service Port: %d", config.GetService().Port)
  53. log.Printf("Service IdleTimeout: %d", config.GetService().IdleTimeout)
  54. log.Printf("Service ReadTimeout: %d", config.GetService().ReadTimeout)
  55. log.Printf("Service WriteTimeout: %d", config.GetService().WriteTimeout)
  56. log.Printf("Service TrustedProxies: %s", config.GetService().TrustedProxies)
  57. log.Printf("Available database drivers: %v", drivers)
  58. log.Printf("Using database type: %s", config.GetDatabase().Type)
  59. log.Printf("Database host: %s:%d", config.GetDatabase().Host, config.GetDatabase().Port)
  60. log.Printf("Database name: %s", config.GetDatabase().Database)
  61. log.Println("Database connection test passed!")
  62. // 3. 启动Gin HTTP服务
  63. startHTTPServer()
  64. }
  65. // 启动HTTP服务器
  66. func startHTTPServer() {
  67. //建立路由
  68. router := gin.Default()
  69. config := dbFactory.GetConfig()
  70. serviceConfig := config.GetService()
  71. // 核心路由
  72. router.GET("/api/health", routes.HealthHandler(db, config.GetDatabase().Type))
  73. router.POST("/api/init/table", auth.AuthMiddleware(), routes.ExecuteDDLHandler(db))
  74. //router.POST("/api/query/csv", auth.AuthMiddleware(), withQueryRequest(routes.QueryHandlerCSV(db)))
  75. router.GET("/api/info", routes.InfoHandler(dbFactory))
  76. // 日志输出配置信息
  77. log.Printf("Service Port: %d", serviceConfig.Port)
  78. log.Printf("Service IdleTimeout: %d", serviceConfig.IdleTimeout)
  79. log.Printf("Service ReadTimeout: %d", serviceConfig.ReadTimeout)
  80. log.Printf("Service WriteTimeout: %d", serviceConfig.WriteTimeout)
  81. log.Printf("Service TrustedProxies: %s", serviceConfig.TrustedProxies)
  82. // 设置可信代理
  83. setupTrustedProxies(router, serviceConfig.TrustedProxies)
  84. // 启动服务
  85. log.Println("POST /api/query - Execute SQL query to JSON")
  86. log.Println("POST /api/query/csv - Execute SQL query to CSV")
  87. log.Println("GET /api/health - Health check")
  88. log.Println("GET /api/info - Database info")
  89. // 创建HTTP服务器配置
  90. server := &http.Server{
  91. Addr: fmt.Sprintf(":%d", serviceConfig.Port),
  92. Handler: router,
  93. IdleTimeout: time.Duration(serviceConfig.IdleTimeout) * time.Second,
  94. ReadTimeout: time.Duration(serviceConfig.ReadTimeout) * time.Second,
  95. WriteTimeout: time.Duration(serviceConfig.WriteTimeout) * time.Second,
  96. }
  97. log.Printf("Starting HTTP server on port %d", serviceConfig.Port)
  98. if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  99. log.Fatalf("Failed to start server: %v", err)
  100. }
  101. }
  102. // 参数绑定包装器
  103. func withQueryRequest(handler func(c *gin.Context, req types.QueryRequest)) gin.HandlerFunc {
  104. return func(c *gin.Context) {
  105. var req types.QueryRequest
  106. if err := c.ShouldBindJSON(&req); err != nil {
  107. c.JSON(400, &types.QueryResult{
  108. Success: false,
  109. Error: "Invalid request: " + err.Error(),
  110. Data: nil,
  111. })
  112. return
  113. }
  114. handler(c, req)
  115. }
  116. }
  117. // 设置可信代理
  118. func setupTrustedProxies(router *gin.Engine, trustedProxiesStr string) {
  119. if trustedProxiesStr == "" {
  120. setupTrustedProxiesRouter(router, nil)
  121. return
  122. }
  123. // 按逗号分割字符串,并去除空格
  124. proxies := strings.Split(trustedProxiesStr, ",")
  125. trimmedProxies := make([]string, 0, len(proxies))
  126. for _, proxy := range proxies {
  127. trimmed := strings.TrimSpace(proxy)
  128. if trimmed != "" {
  129. trimmedProxies = append(trimmedProxies, trimmed)
  130. }
  131. }
  132. if len(trimmedProxies) > 0 {
  133. setupTrustedProxiesRouter(router, trimmedProxies)
  134. } else {
  135. setupTrustedProxiesRouter(router, nil)
  136. }
  137. }
  138. func setupTrustedProxiesRouter(router *gin.Engine, trimmedProxies []string) {
  139. err := router.SetTrustedProxies(trimmedProxies)
  140. if err != nil {
  141. log.Printf("Warning: Failed to set trusted proxies: %v", err)
  142. } else {
  143. log.Printf("Trusted proxies set: %v", trimmedProxies)
  144. }
  145. }