v1.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. "time"
  12. )
  13. func ApiV1(binding *http_binding.Binding, dpsAddress string, operatorIDFunc OperatorIDFunc) {
  14. if binding == nil {
  15. panic("没有传递http_binding")
  16. }
  17. if utils.IsStringEmpty(dpsAddress) {
  18. panic("没有指定dps地址")
  19. }
  20. if operatorIDFunc == nil {
  21. panic("没有传递获取operatorID的回调函数")
  22. }
  23. http_binding.PostBind(binding, &http_binding.SimpleBindItem[OperateParseRequest, map[string]any]{
  24. Path: "/dpsv1/database/operate/parse",
  25. ResponseFunc: response.SendMapResponse,
  26. BusinessFunc: func(c *binding_context.Context, inputModel OperateParseRequest) (map[string]any, error) {
  27. parsedClauses, err := parseSql(inputModel.SQL)
  28. if err != nil {
  29. return nil, err
  30. }
  31. for _, parsedClause := range parsedClauses {
  32. switch clause := parsedClause.(type) {
  33. case *insertClause:
  34. return map[string]any{
  35. "parsed": insertMap(clause),
  36. }, nil
  37. case *deleteClause:
  38. return map[string]any{
  39. "parsed": deleteMap(clause),
  40. }, nil
  41. case *updateClause:
  42. return map[string]any{
  43. "parsed": updateMap(clause),
  44. }, nil
  45. case *selectClause:
  46. return map[string]any{
  47. "parsed": selectMap(clause),
  48. }, nil
  49. default:
  50. return nil, errors.New("不支持的SQL语句")
  51. }
  52. }
  53. return nil, nil
  54. },
  55. })
  56. http_binding.PostBind(binding, &http_binding.SimpleBindItem[OperateRequest, any]{
  57. Path: "/dpsv1/database/operate",
  58. ResponseFunc: response.SendMsgResponse,
  59. BusinessFunc: func(c *binding_context.Context, inputModel OperateRequest) (any, error) {
  60. operatorID, err := operatorIDFunc(c)
  61. if err != nil {
  62. return nil, err
  63. }
  64. parsedClauses, err := parseSql(inputModel.SQL)
  65. if err != nil {
  66. return nil, err
  67. }
  68. dpsClient, err := dps.NewClient(dpsAddress, "v1", inputModel.DatabaseID)
  69. if err != nil {
  70. return nil, err
  71. }
  72. err = dpsClient.Transaction(func(tx client.Transaction) error {
  73. for _, parsedClause := range parsedClauses {
  74. switch clause := parsedClause.(type) {
  75. case *insertClause:
  76. return doInsert(tx, inputModel, clause, operatorID)
  77. case *deleteClause:
  78. return doDelete(tx, inputModel, clause, operatorID)
  79. case *updateClause:
  80. return doUpdate(tx, inputModel, clause, operatorID)
  81. case *selectClause:
  82. return doSelect(dpsClient, inputModel, clause)
  83. default:
  84. return errors.New("不支持的SQL语句")
  85. }
  86. }
  87. return nil
  88. })
  89. if err != nil {
  90. return nil, err
  91. }
  92. return nil, nil
  93. },
  94. })
  95. }
  96. func insertMap(clause *insertClause) map[string]any {
  97. tableRows := make(map[string]any)
  98. for columnName, value := range clause.tableRows {
  99. tableRows[columnName] = value.value
  100. }
  101. return map[string]any{
  102. "table": clause.table,
  103. "key_columns": clause.keyColumns,
  104. "table_rows": tableRows,
  105. }
  106. }
  107. func deleteMap(clause *deleteClause) map[string]any {
  108. return map[string]any{}
  109. }
  110. func updateMap(clause *updateClause) map[string]any {
  111. return map[string]any{}
  112. }
  113. func selectMap(clause *selectClause) map[string]any {
  114. return map[string]any{}
  115. }
  116. func doInsert(tx client.Transaction, inputModel OperateRequest, clause *insertClause, operatorID string) error {
  117. version := inputModel.Version
  118. if utils.IsStringEmpty(version) {
  119. version = "v1"
  120. }
  121. tableRow := client.NewTableRow()
  122. for columnName, value := range clause.tableRows {
  123. switch value.kind {
  124. case clauseTableRowValueKindTime:
  125. tableRow.AddColumnValueTime(columnName, value.value.(time.Time))
  126. case clauseTableRowValueKindBool:
  127. tableRow.AddColumnValueBool(columnName, value.value.(bool))
  128. case clauseTableRowValueKindString:
  129. tableRow.AddColumnValueString(columnName, value.value.(string))
  130. case clauseTableRowValueKindUint64:
  131. tableRow.AddColumnValueUint64(columnName, value.value.(uint64))
  132. case clauseTableRowValueKindFloat64:
  133. tableRow.AddColumnValueFloat64(columnName, value.value.(float64))
  134. default:
  135. return errors.New("不支持的值类型")
  136. }
  137. }
  138. statement, err := tx.InsertTx(&client.InsertRequest{
  139. TablePrefixWithSchema: clause.table,
  140. Version: inputModel.Version,
  141. KeyColumns: clause.keyColumns,
  142. TableRow: tableRow,
  143. UserID: operatorID,
  144. })
  145. if err != nil {
  146. fmt.Println(statement)
  147. return err
  148. }
  149. return nil
  150. }
  151. func doDelete(tx client.Transaction, inputModel OperateRequest, clause *deleteClause, operatorID string) error {
  152. version := inputModel.Version
  153. if utils.IsStringEmpty(version) {
  154. version = "v1"
  155. }
  156. return nil
  157. }
  158. func doUpdate(tx client.Transaction, inputModel OperateRequest, clause *updateClause, operatorID string) error {
  159. version := inputModel.Version
  160. if utils.IsStringEmpty(version) {
  161. version = "v1"
  162. }
  163. return nil
  164. }
  165. func doSelect(dpsClient client.Client, inputModel OperateRequest, clause *selectClause) error {
  166. version := inputModel.Version
  167. if utils.IsStringEmpty(version) {
  168. version = "v1"
  169. }
  170. return nil
  171. }