(name string)
| 735 | } |
| 736 | |
| 737 | func (db *DB) SavePoint(name string) *DB { |
| 738 | if savePointer, ok := db.Dialector.(SavePointerDialectorInterface); ok { |
| 739 | // close prepared statement, because SavePoint not support prepared statement. |
| 740 | // e.g. mysql8.0 doc: https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html |
| 741 | var ( |
| 742 | preparedStmtTx *PreparedStmtTX |
| 743 | isPreparedStmtTx bool |
| 744 | ) |
| 745 | // close prepared statement, because SavePoint not support prepared statement. |
| 746 | if preparedStmtTx, isPreparedStmtTx = db.Statement.ConnPool.(*PreparedStmtTX); isPreparedStmtTx { |
| 747 | db.Statement.ConnPool = preparedStmtTx.Tx |
| 748 | } |
| 749 | db.AddError(savePointer.SavePoint(db, name)) |
| 750 | // restore prepared statement |
| 751 | if isPreparedStmtTx { |
| 752 | db.Statement.ConnPool = preparedStmtTx |
| 753 | } |
| 754 | } else { |
| 755 | db.AddError(ErrUnsupportedDriver) |
| 756 | } |
| 757 | return db |
| 758 | } |
| 759 | |
| 760 | func (db *DB) RollbackTo(name string) *DB { |
| 761 | if savePointer, ok := db.Dialector.(SavePointerDialectorInterface); ok { |
no test coverage detected