yjp 1 жил өмнө
parent
commit
5cb9cb5eb7
5 өөрчлөгдсөн 104 нэмэгдсэн , 36 устгасан
  1. 1 1
      go.mod
  2. 2 2
      go.sum
  3. 6 3
      sql_parser.go
  4. 88 28
      v1.go
  5. 7 2
      v1_test.go

+ 1 - 1
go.mod

@@ -4,7 +4,7 @@ go 1.21.3
 
 require (
 	git.sxidc.com/go-tools/api_binding v1.3.22
-	git.sxidc.com/service-supports/dps-sdk v1.10.1
+	git.sxidc.com/service-supports/dps-sdk v1.10.2
 	github.com/auxten/postgresql-parser v1.0.1
 	github.com/go-resty/resty/v2 v2.11.0
 	github.com/satori/go.uuid v1.2.0

+ 2 - 2
go.sum

@@ -2,8 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 git.sxidc.com/go-tools/api_binding v1.3.22 h1:4LPdcClfqM2bmCSrCe6HceSmAwr3rGhfxjVWn/4rliY=
 git.sxidc.com/go-tools/api_binding v1.3.22/go.mod h1:JoPU2jtPwbsAEjAuiSedKxuwu3bK4rrkZxyQ3mkU0XI=
-git.sxidc.com/service-supports/dps-sdk v1.10.1 h1:Wk6Ruatn5GHgBYvaNzr27GQaLuAgHB2TD9tFTgz0lpE=
-git.sxidc.com/service-supports/dps-sdk v1.10.1/go.mod h1:bR7PtL4x4QKc8ZRbszn8hLBaK6G/uZl4ZbU7/TZcJ94=
+git.sxidc.com/service-supports/dps-sdk v1.10.2 h1:0eMoHk7cSAtvRUyavLDf7m7UXPiRtaERu5kzg6KS/VM=
+git.sxidc.com/service-supports/dps-sdk v1.10.2/go.mod h1:bR7PtL4x4QKc8ZRbszn8hLBaK6G/uZl4ZbU7/TZcJ94=
 git.sxidc.com/service-supports/fserr v0.3.2 h1:5/FCr8o2jd1kNsp5tH/ADjB9fr091JZXMMZ15ZvNZzs=
 git.sxidc.com/service-supports/fserr v0.3.2/go.mod h1:W54RoA71mfex+zARuH/iMnQPMnBXQ23qXXOkwUh2sVQ=
 git.sxidc.com/service-supports/fslog v0.5.9 h1:q2XIK2o/fk/qmByy4x5kKLC+k7kolT5LrXHcWRSffXQ=

+ 6 - 3
sql_parser.go

@@ -25,8 +25,8 @@ type clauseTableRowValue struct {
 }
 
 type insertClause struct {
-	table     string
-	tableRows map[string]clauseTableRowValue
+	table    string
+	tableRow map[string]clauseTableRowValue
 }
 
 type deleteClause struct {
@@ -35,6 +35,9 @@ type deleteClause struct {
 }
 
 type updateClause struct {
+	table       string
+	where       string
+	newTableRow map[string]clauseTableRowValue
 }
 
 type selectClause struct {
@@ -222,7 +225,7 @@ func insertWalk(sql string) (*insertClause, error) {
 				tableRows[column] = values[i]
 			}
 
-			clause.tableRows = tableRows
+			clause.tableRow = tableRows
 
 			return false
 		},

+ 88 - 28
v1.go

@@ -61,10 +61,10 @@ func ApiV1(binding *http_binding.Binding, dpsAddress string, operatorIDFunc Oper
 		},
 	})
 
-	http_binding.PostBind(binding, &http_binding.SimpleBindItem[OperateRequest, any]{
+	http_binding.PostBind(binding, &http_binding.SimpleBindItem[OperateRequest, map[string]any]{
 		Path:         "/dpsv1/database/operate",
-		ResponseFunc: response.SendMsgResponse,
-		BusinessFunc: func(c *binding_context.Context, inputModel OperateRequest) (any, error) {
+		ResponseFunc: response.SendMapResponse,
+		BusinessFunc: func(c *binding_context.Context, inputModel OperateRequest) (map[string]any, error) {
 			version := "v1"
 			if utils.IsStringNotEmpty(inputModel.Version) {
 				version = inputModel.Version
@@ -77,19 +77,21 @@ func ApiV1(binding *http_binding.Binding, dpsAddress string, operatorIDFunc Oper
 
 			operatorID, err := operatorIDFunc(c)
 			if err != nil {
-				return nil, err
+				return map[string]any{"table_rows": make([]map[string]any, 0)}, err
 			}
 
 			parsedClauses, err := parseSql(inputModel.SQL)
 			if err != nil {
-				return nil, err
+				return map[string]any{"table_rows": make([]map[string]any, 0)}, err
 			}
 
 			dpsClient, err := dps.NewClient(dpsAddress, "v1", inputModel.DatabaseID)
 			if err != nil {
-				return nil, err
+				return map[string]any{"table_rows": make([]map[string]any, 0)}, err
 			}
 
+			result := make([]map[string]any, 0)
+
 			err = dpsClient.Transaction(func(tx client.Transaction) error {
 				for _, parsedClause := range parsedClauses {
 					switch clause := parsedClause.(type) {
@@ -100,7 +102,13 @@ func ApiV1(binding *http_binding.Binding, dpsAddress string, operatorIDFunc Oper
 					case *updateClause:
 						return doUpdate(tx, version, keyColumns, clause, operatorID)
 					case *selectClause:
-						return doSelect(dpsClient, version, clause)
+						r, err := doSelect(dpsClient, version, clause)
+						if err != nil {
+							return err
+						}
+
+						result = r
+						return nil
 					default:
 						return errors.New("不支持的SQL语句")
 					}
@@ -109,17 +117,17 @@ func ApiV1(binding *http_binding.Binding, dpsAddress string, operatorIDFunc Oper
 				return nil
 			})
 			if err != nil {
-				return nil, err
+				return map[string]any{"table_rows": make([]map[string]any, 0)}, err
 			}
 
-			return nil, nil
+			return map[string]any{"table_rows": result}, nil
 		},
 	})
 }
 
 func insertMap(clause *insertClause) map[string]any {
 	tableRows := make(map[string]any)
-	for columnName, value := range clause.tableRows {
+	for columnName, value := range clause.tableRow {
 		tableRows[columnName] = value.value
 	}
 
@@ -145,22 +153,9 @@ func selectMap(clause *selectClause) map[string]any {
 }
 
 func doInsert(tx client.Transaction, version string, keyColumns []string, clause *insertClause, operatorID string) error {
-	tableRow := client.NewTableRow()
-	for columnName, value := range clause.tableRows {
-		switch value.kind {
-		case clauseTableRowValueKindTime:
-			tableRow.AddColumnValueTime(columnName, value.value.(time.Time))
-		case clauseTableRowValueKindBool:
-			tableRow.AddColumnValueBool(columnName, value.value.(bool))
-		case clauseTableRowValueKindString:
-			tableRow.AddColumnValueString(columnName, value.value.(string))
-		case clauseTableRowValueKindUint64:
-			tableRow.AddColumnValueUint64(columnName, value.value.(uint64))
-		case clauseTableRowValueKindFloat64:
-			tableRow.AddColumnValueFloat64(columnName, value.value.(float64))
-		default:
-			return errors.New("不支持的值类型")
-		}
+	tableRow, err := clauseTableRowsToDPSTableRow(clause.tableRow)
+	if err != nil {
+		return err
 	}
 
 	statement, err := tx.InsertTx(&client.InsertRequest{
@@ -195,9 +190,74 @@ func doDelete(tx client.Transaction, version string, keyColumns []string, clause
 }
 
 func doUpdate(tx client.Transaction, version string, keyColumns []string, clause *updateClause, operatorID string) error {
+	newTableRow, err := clauseTableRowsToDPSTableRow(clause.newTableRow)
+	if err != nil {
+		return err
+	}
+
+	statement, err := tx.UpdateWhereTx(&client.UpdateWhereRequest{
+		TablePrefixWithSchema: clause.table,
+		Version:               version,
+		KeyColumns:            keyColumns,
+		Where:                 client.NewClause().Common(clause.where),
+		NewTableRow:           newTableRow,
+		UserID:                operatorID,
+	})
+	if err != nil {
+		fmt.Println(statement)
+		return err
+	}
+
 	return nil
 }
 
-func doSelect(dpsClient client.Client, version string, clause *selectClause) error {
-	return nil
+func doSelect(dpsClient client.Client, version string, clause *selectClause) ([]map[string]any, error) {
+	statement, tableRows, err := dpsClient.CommonQueryOnly(&client.CommonQueryRequest{
+		TablePrefixWithSchema: "",
+		Table:                 "",
+		Version:               version,
+		Select:                nil,
+		Where:                 nil,
+		OrderBy:               nil,
+		Or:                    nil,
+		GroupBy:               nil,
+		Joins:                 nil,
+		Having:                nil,
+		PageNo:                0,
+		PageSize:              0,
+	})
+	if err != nil {
+		fmt.Println(statement)
+		return nil, err
+	}
+
+	results := make([]map[string]any, 0)
+	for _, tableRow := range tableRows {
+		results = append(results, tableRow.ToMap())
+	}
+
+	return results, nil
+}
+
+func clauseTableRowsToDPSTableRow(clauseTableRow map[string]clauseTableRowValue) (*client.TableRow, error) {
+	tableRow := client.NewTableRow()
+
+	for columnName, value := range clauseTableRow {
+		switch value.kind {
+		case clauseTableRowValueKindTime:
+			tableRow.AddColumnValueTime(columnName, value.value.(time.Time))
+		case clauseTableRowValueKindBool:
+			tableRow.AddColumnValueBool(columnName, value.value.(bool))
+		case clauseTableRowValueKindString:
+			tableRow.AddColumnValueString(columnName, value.value.(string))
+		case clauseTableRowValueKindUint64:
+			tableRow.AddColumnValueUint64(columnName, value.value.(uint64))
+		case clauseTableRowValueKindFloat64:
+			tableRow.AddColumnValueFloat64(columnName, value.value.(float64))
+		default:
+			return nil, errors.New("不支持的值类型")
+		}
+	}
+
+	return tableRow, nil
 }

+ 7 - 2
v1_test.go

@@ -124,8 +124,11 @@ func operateParse(t *testing.T, sql string) map[string]any {
 	return result.Parsed
 }
 
-func operate(t *testing.T, sql string, keyColumns []string) {
-	result := new(response.MsgResponse)
+func operate(t *testing.T, sql string, keyColumns []string) []map[string]any {
+	result := new(struct {
+		response.MsgResponse
+		TableRows []map[string]any `json:"table_rows"`
+	})
 
 	resp, err := resty.New().R().
 		SetBody(&OperateRequest{
@@ -147,4 +150,6 @@ func operate(t *testing.T, sql string, keyColumns []string) {
 	if !result.Success {
 		t.Fatal(result.Msg)
 	}
+
+	return result.TableRows
 }