diff --git a/generator/client/golang/templates/queryx.gotmpl b/generator/client/golang/templates/queryx.gotmpl index ddd1d0f2..bd7fe8c1 100644 --- a/generator/client/golang/templates/queryx.gotmpl +++ b/generator/client/golang/templates/queryx.gotmpl @@ -107,6 +107,21 @@ func (tx *Tx) Rollback() error { return tx.tx.Rollback() } +func (tx *Tx) SavePoint (sp string) error { + _, err := tx.tx.Exec(fmt.Sprintf("SAVEPOINT %s", sp)) + return err +} + +func (tx *Tx) ReleasePoint (rp string) error { + _, err := tx.tx.Exec(fmt.Sprintf("RELEASE SAVEPOINT %s",rp)) + return err +} + +func (tx *Tx) RollbackTo(rt string) error { + _, err := tx.tx.Exec(fmt.Sprintf("ROLLBACK TO %s", rt)) + return err +} + {{- range $m := $.client.Models }} func (tx *Tx) Query{{ $m.Name }}() *{{ $m.Name }}Query { diff --git a/internal/integration/client_test.go b/internal/integration/client_test.go index 2e3474e6..1a7da1be 100644 --- a/internal/integration/client_test.go +++ b/internal/integration/client_test.go @@ -429,6 +429,31 @@ func TestTransaction(t *testing.T) { require.Equal(t, "tag1-updated", tag1.Name.Val) } +func TestSavePoint(t *testing.T) { + tx, _ := c.Tx() + var tagPoint = "sp_point" + + tx.QueryTag().Create(tx.ChangeTag().SetName("tagPoint1")) + + err := tx.SavePoint(tagPoint) + require.NoError(t, err) + + tx.QueryTag().Create(tx.ChangeTag().SetName("tagPoint2")) + err = tx.RollbackTo(tagPoint) + require.NoError(t, err) + + exists, err := tx.QueryTag().Where(tx.TagName.EQ("tagPoint1")).Exists() + require.NoError(t, err) + require.Equal(t, true, exists) + exists, err = tx.QueryTag().Where(tx.TagName.EQ("tagPoint2")).Exists() + require.NoError(t, err) + require.Equal(t, false, exists) + + err = tx.ReleasePoint(tagPoint) + require.NoError(t, err) + tx.Commit() +} + func TestChangeJSON(t *testing.T) { s := `{"name":"user name","isAdmin":false}`