(ctx context.Context, session *Session)
| 839 | } |
| 840 | |
| 841 | func (s *DmlStatement) Execute(ctx context.Context, session *Session) (*Result, error) { |
| 842 | stmt := spanner.NewStatement(s.Dml) |
| 843 | |
| 844 | result := &Result{IsMutation: true} |
| 845 | |
| 846 | var rows []Row |
| 847 | var columnNames []string |
| 848 | var numRows int64 |
| 849 | var metadata *pb.ResultSetMetadata |
| 850 | var err error |
| 851 | if session.InReadWriteTransaction() { |
| 852 | rows, columnNames, numRows, metadata, err = session.RunUpdate(ctx, stmt, false) |
| 853 | if err != nil { |
| 854 | // Need to call rollback to free the acquired session in underlying google-cloud-go/spanner. |
| 855 | rollback := &RollbackStatement{} |
| 856 | rollback.Execute(ctx, session) |
| 857 | return nil, fmt.Errorf("transaction was aborted: %v", err) |
| 858 | } |
| 859 | } else { |
| 860 | // Start implicit transaction. |
| 861 | begin := BeginRwStatement{} |
| 862 | if _, err = begin.Execute(ctx, session); err != nil { |
| 863 | return nil, err |
| 864 | } |
| 865 | |
| 866 | rows, columnNames, numRows, metadata, err = session.RunUpdate(ctx, stmt, false) |
| 867 | if err != nil { |
| 868 | // once error has happened, escape from implicit transaction |
| 869 | rollback := &RollbackStatement{} |
| 870 | rollback.Execute(ctx, session) |
| 871 | return nil, err |
| 872 | } |
| 873 | |
| 874 | commit := CommitStatement{} |
| 875 | txnResult, err := commit.Execute(ctx, session) |
| 876 | if err != nil { |
| 877 | return nil, err |
| 878 | } |
| 879 | result.Timestamp = txnResult.Timestamp |
| 880 | result.CommitStats = txnResult.CommitStats |
| 881 | } |
| 882 | |
| 883 | result.ColumnTypes = metadata.GetRowType().GetFields() |
| 884 | result.Rows = rows |
| 885 | result.ColumnNames = columnNames |
| 886 | result.AffectedRows = int(numRows) |
| 887 | |
| 888 | return result, nil |
| 889 | } |
| 890 | |
| 891 | type PartitionedDmlStatement struct { |
| 892 | Dml string |
nothing calls this directly
no test coverage detected