|
16 | 16 |
|
17 | 17 | package com.google.cloud.spanner; |
18 | 18 |
|
| 19 | +import static com.google.cloud.spanner.SpannerExceptionFactory.newSpannerBatchUpdateException; |
19 | 20 | import static com.google.cloud.spanner.SpannerExceptionFactory.newSpannerException; |
20 | 21 | import static com.google.cloud.spanner.SpannerExceptionFactory.newSpannerExceptionForCancellation; |
21 | 22 | import static com.google.common.base.Preconditions.checkArgument; |
|
69 | 70 | import com.google.spanner.v1.BeginTransactionRequest; |
70 | 71 | import com.google.spanner.v1.CommitRequest; |
71 | 72 | import com.google.spanner.v1.CommitResponse; |
| 73 | +import com.google.spanner.v1.ExecuteBatchDmlRequest; |
72 | 74 | import com.google.spanner.v1.ExecuteSqlRequest; |
73 | 75 | import com.google.spanner.v1.ExecuteSqlRequest.QueryMode; |
74 | 76 | import com.google.spanner.v1.PartialResultSet; |
@@ -1080,6 +1082,36 @@ ExecuteSqlRequest.Builder getExecuteSqlRequestBuilder( |
1080 | 1082 | return builder; |
1081 | 1083 | } |
1082 | 1084 |
|
| 1085 | + ExecuteBatchDmlRequest.Builder getExecuteBatchDmlRequestBuilder( |
| 1086 | + Iterable<Statement> statements) { |
| 1087 | + ExecuteBatchDmlRequest.Builder builder = |
| 1088 | + ExecuteBatchDmlRequest.newBuilder().setSession(session.name); |
| 1089 | + int idx = 0; |
| 1090 | + for (Statement stmt : statements) { |
| 1091 | + builder.addStatementsBuilder(); |
| 1092 | + builder.getStatementsBuilder(idx).setSql(stmt.getSql()); |
| 1093 | + Map<String, Value> stmtParameters = stmt.getParameters(); |
| 1094 | + if (!stmtParameters.isEmpty()) { |
| 1095 | + com.google.protobuf.Struct.Builder paramsBuilder = |
| 1096 | + builder.getStatementsBuilder(idx).getParamsBuilder(); |
| 1097 | + for (Map.Entry<String, Value> param : stmtParameters.entrySet()) { |
| 1098 | + paramsBuilder.putFields(param.getKey(), param.getValue().toProto()); |
| 1099 | + builder |
| 1100 | + .getStatementsBuilder(idx) |
| 1101 | + .putParamTypes(param.getKey(), param.getValue().getType().toProto()); |
| 1102 | + } |
| 1103 | + } |
| 1104 | + idx++; |
| 1105 | + } |
| 1106 | + |
| 1107 | + TransactionSelector selector = getTransactionSelector(); |
| 1108 | + if (selector != null) { |
| 1109 | + builder.setTransaction(selector); |
| 1110 | + } |
| 1111 | + builder.setSeqno(getSeqNo()); |
| 1112 | + return builder; |
| 1113 | + } |
| 1114 | + |
1083 | 1115 | ResultSet executeQueryInternalWithOptions( |
1084 | 1116 | Statement statement, |
1085 | 1117 | com.google.spanner.v1.ExecuteSqlRequest.QueryMode queryMode, |
@@ -1660,6 +1692,32 @@ public com.google.spanner.v1.ResultSet call() throws Exception { |
1660 | 1692 | // For standard DML, using the exact row count. |
1661 | 1693 | return resultSet.getStats().getRowCountExact(); |
1662 | 1694 | } |
| 1695 | + |
| 1696 | + @Override |
| 1697 | + public long[] batchUpdate(Iterable<Statement> statements) { |
| 1698 | + beforeReadOrQuery(); |
| 1699 | + final ExecuteBatchDmlRequest.Builder builder = getExecuteBatchDmlRequestBuilder(statements); |
| 1700 | + com.google.spanner.v1.ExecuteBatchDmlResponse response = |
| 1701 | + runWithRetries( |
| 1702 | + new Callable<com.google.spanner.v1.ExecuteBatchDmlResponse>() { |
| 1703 | + @Override |
| 1704 | + public com.google.spanner.v1.ExecuteBatchDmlResponse call() throws Exception { |
| 1705 | + return rpc.executeBatchDml(builder.build(), session.options); |
| 1706 | + } |
| 1707 | + }); |
| 1708 | + long[] results = new long[response.getResultSetsCount()]; |
| 1709 | + for (int i = 0; i < response.getResultSetsCount(); ++i) { |
| 1710 | + results[i] = response.getResultSets(i).getStats().getRowCountExact(); |
| 1711 | + } |
| 1712 | + |
| 1713 | + if (response.getStatus().getCode() != 0) { |
| 1714 | + throw newSpannerBatchUpdateException( |
| 1715 | + ErrorCode.fromRpcStatus(response.getStatus()), |
| 1716 | + response.getStatus().getMessage(), |
| 1717 | + results); |
| 1718 | + } |
| 1719 | + return results; |
| 1720 | + } |
1663 | 1721 | } |
1664 | 1722 |
|
1665 | 1723 | /** |
|
0 commit comments