connection_pool_handler.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package handler
  2. import (
  3. "context"
  4. "errors"
  5. "net/http"
  6. "strings"
  7. "dbview/service/internal/common/response"
  8. "dbview/service/internal/modules/connection_pool/api"
  9. "dbview/service/internal/modules/connection_pool/service"
  10. "github.com/gin-gonic/gin"
  11. )
  12. // RegisterConnection 注册新的数据库连接
  13. func RegisterConnection(c *gin.Context) {
  14. var req api.RegisterConnectionRequest
  15. if err := c.ShouldBindJSON(&req); err != nil {
  16. c.JSON(http.StatusBadRequest, response.ParamErrorWithDetail("请求参数错误", err))
  17. return
  18. }
  19. connID := buildConnectionID(req.ConnID, c.ClientIP())
  20. req.ConnID = connID
  21. stat, err := service.RegisterConnection(&req)
  22. if err != nil {
  23. c.JSON(http.StatusInternalServerError, response.ErrorWithDetail("注册连接失败", err))
  24. return
  25. }
  26. c.JSON(http.StatusOK, response.SuccessWithMsg("注册连接成功", stat))
  27. }
  28. func buildConnectionID(baseID, clientIP string) string {
  29. if clientIP == "" {
  30. return baseID
  31. }
  32. replacer := strings.NewReplacer("::", "-", ":", "-", ".", "-", "%", "-", "[", "", "]", "")
  33. sanitized := replacer.Replace(clientIP)
  34. if baseID == "" {
  35. return sanitized
  36. }
  37. return baseID + "@" + sanitized
  38. }
  39. // GetConnectionStats 返回连接池状态
  40. func GetConnectionStats(c *gin.Context) {
  41. stats, err := service.GetConnectionStats()
  42. if err != nil {
  43. c.JSON(http.StatusInternalServerError, response.ErrorWithDetail("获取连接池状态失败", err))
  44. return
  45. }
  46. c.JSON(http.StatusOK, response.Success(api.ConnectionStatsResponse{Connections: stats}))
  47. }
  48. // CloseConnection 关闭指定连接
  49. func CloseConnection(c *gin.Context) {
  50. var req api.CloseConnectionRequest
  51. if err := c.ShouldBindJSON(&req); err != nil {
  52. c.JSON(http.StatusBadRequest, response.ParamErrorWithDetail("请求参数错误", err))
  53. return
  54. }
  55. connID := buildConnectionID(req.ConnID, c.ClientIP())
  56. if err := service.CloseConnection(connID); err != nil {
  57. if errors.Is(err, response.ErrConnNotExist) {
  58. c.JSON(http.StatusNotFound, response.NotFoundWithDetail("连接不存在", err))
  59. return
  60. }
  61. c.JSON(http.StatusInternalServerError, response.ErrorWithDetail("关闭连接失败", err))
  62. return
  63. }
  64. c.JSON(http.StatusOK, response.SuccessWithMsg("连接已关闭", nil))
  65. }
  66. // CloseAllConnections 关闭所有连接
  67. func CloseAllConnections(c *gin.Context) {
  68. if err := service.CloseAllConnections(); err != nil {
  69. c.JSON(http.StatusInternalServerError, response.ErrorWithDetail("关闭所有连接失败", err))
  70. return
  71. }
  72. c.JSON(http.StatusOK, response.SuccessWithMsg("所有连接已关闭", nil))
  73. }
  74. // PingConnection 检查连接是否可用
  75. func PingConnection(c *gin.Context) {
  76. var req api.PingConnectionRequest
  77. if err := c.ShouldBindJSON(&req); err != nil {
  78. c.JSON(http.StatusBadRequest, response.ParamErrorWithDetail("请求参数错误", err))
  79. return
  80. }
  81. ctx := c.Request.Context()
  82. if ctx == nil {
  83. ctx = context.Background()
  84. }
  85. connID := buildConnectionID(req.ConnID, c.ClientIP())
  86. if err := service.PingConnection(ctx, connID); err != nil {
  87. if errors.Is(err, response.ErrConnNotExist) {
  88. c.JSON(http.StatusNotFound, response.NotFoundWithDetail("连接不存在", err))
  89. return
  90. }
  91. c.JSON(http.StatusInternalServerError, response.ErrorWithDetail("连接检测失败", err))
  92. return
  93. }
  94. c.JSON(http.StatusOK, response.SuccessWithMsg("连接可用", nil))
  95. }