v1.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package dpsapi
  2. import (
  3. "errors"
  4. "fmt"
  5. "git.sxidc.com/go-tools/api_binding/http_binding"
  6. "git.sxidc.com/go-tools/api_binding/http_binding/binding_context"
  7. "git.sxidc.com/go-tools/api_binding/http_binding/response"
  8. "git.sxidc.com/go-tools/api_binding/utils"
  9. "git.sxidc.com/service-supports/dps-sdk"
  10. "git.sxidc.com/service-supports/dps-sdk/client"
  11. )
  12. func ApiV1(binding *http_binding.Binding, dpsAddress string) {
  13. http_binding.PostBind(binding, &http_binding.SimpleBindItem[OperateParseRequest, map[string]any]{
  14. Path: "/dpsv1/database/operate/parse",
  15. ResponseFunc: response.SendMapResponse,
  16. BusinessFunc: func(c *binding_context.Context, inputModel OperateParseRequest) (map[string]any, error) {
  17. parsedClauses, err := parseSql(inputModel.SQL)
  18. if err != nil {
  19. return nil, err
  20. }
  21. for _, parsedClause := range parsedClauses {
  22. switch clause := parsedClause.(type) {
  23. case *insertClause:
  24. return map[string]any{
  25. "parsed": insertMap(clause),
  26. }, nil
  27. case *deleteClause:
  28. return map[string]any{
  29. "parsed": deleteMap(clause),
  30. }, nil
  31. case *updateClause:
  32. return map[string]any{
  33. "parsed": updateMap(clause),
  34. }, nil
  35. case *selectClause:
  36. return map[string]any{
  37. "parsed": selectMap(clause),
  38. }, nil
  39. default:
  40. return nil, errors.New("不支持的SQL语句")
  41. }
  42. }
  43. return nil, nil
  44. },
  45. })
  46. http_binding.PostBind(binding, &http_binding.SimpleBindItem[OperateRequest, any]{
  47. Path: "/dpsv1/database/operate",
  48. ResponseFunc: response.SendMsgResponse,
  49. BusinessFunc: func(c *binding_context.Context, inputModel OperateRequest) (any, error) {
  50. parsedClauses, err := parseSql(inputModel.SQL)
  51. if err != nil {
  52. return nil, err
  53. }
  54. dpsClient, err := dps.NewClient(dpsAddress, "v1", inputModel.DatabaseID)
  55. if err != nil {
  56. return nil, err
  57. }
  58. err = dpsClient.Transaction(func(tx client.Transaction) error {
  59. for _, parsedClause := range parsedClauses {
  60. switch clause := parsedClause.(type) {
  61. case *insertClause:
  62. return doInsert(inputModel, clause)
  63. case *deleteClause:
  64. return doDelete(inputModel, clause)
  65. case *updateClause:
  66. return doUpdate(inputModel, clause)
  67. case *selectClause:
  68. return doSelect(inputModel, clause)
  69. default:
  70. return errors.New("不支持的SQL语句")
  71. }
  72. }
  73. return nil
  74. })
  75. if err != nil {
  76. return nil, err
  77. }
  78. return nil, nil
  79. },
  80. })
  81. }
  82. func insertMap(clause *insertClause) map[string]any {
  83. return map[string]any{
  84. "table": clause.table,
  85. "key_columns": clause.keyColumns,
  86. "table_rows": clause.tableRows,
  87. }
  88. }
  89. func deleteMap(clause *deleteClause) map[string]any {
  90. return map[string]any{}
  91. }
  92. func updateMap(clause *updateClause) map[string]any {
  93. return map[string]any{}
  94. }
  95. func selectMap(clause *selectClause) map[string]any {
  96. return map[string]any{}
  97. }
  98. func doInsert(inputModel OperateRequest, clause *insertClause) error {
  99. version := inputModel.Version
  100. if utils.IsStringEmpty(version) {
  101. version = "v1"
  102. }
  103. fmt.Printf("%+#v\n", clause)
  104. return nil
  105. }
  106. func doDelete(inputModel OperateRequest, clause *deleteClause) error {
  107. version := inputModel.Version
  108. if utils.IsStringEmpty(version) {
  109. version = "v1"
  110. }
  111. return nil
  112. }
  113. func doUpdate(inputModel OperateRequest, clause *updateClause) error {
  114. version := inputModel.Version
  115. if utils.IsStringEmpty(version) {
  116. version = "v1"
  117. }
  118. return nil
  119. }
  120. func doSelect(inputModel OperateRequest, clause *selectClause) error {
  121. version := inputModel.Version
  122. if utils.IsStringEmpty(version) {
  123. version = "v1"
  124. }
  125. return nil
  126. }