@@ -74,8 +74,8 @@ public extension AWSDynamoDBCompositePrimaryKeyTable {
74
74
// ExecuteStatement API has a maximum limit on the number of decomposed read operations per request.
75
75
// Caller of this function needs to handle pagination on their side.
76
76
guard partitionKeys. count <= maximumKeysPerExecuteStatement else {
77
- throw DynamoDBTableError . validationError (
78
- reason : " Execute API has a maximum limit of \( maximumKeysPerExecuteStatement) partition keys per request. " )
77
+ throw DynamoDBTableError . validation ( partitionKey : nil , sortKey : nil ,
78
+ message : " Execute API has a maximum limit of \( maximumKeysPerExecuteStatement) partition keys per request. " )
79
79
}
80
80
81
81
let statement = self . getStatement ( partitionKeys: partitionKeys,
@@ -143,8 +143,8 @@ public extension AWSDynamoDBCompositePrimaryKeyTable {
143
143
// ExecuteStatement API has a maximum limit on the number of decomposed read operations per request.
144
144
// Caller of this function needs to handle pagination on their side.
145
145
guard partitionKeys. count <= maximumKeysPerExecuteStatement else {
146
- throw DynamoDBTableError . validationError (
147
- reason : " Execute API has a maximum limit of \( maximumKeysPerExecuteStatement) partition keys per request. " )
146
+ throw DynamoDBTableError . validation ( partitionKey : nil , sortKey : nil ,
147
+ message : " Execute API has a maximum limit of \( maximumKeysPerExecuteStatement) partition keys per request. " )
148
148
}
149
149
150
150
let statement = self . getStatement ( partitionKeys: partitionKeys,
@@ -256,3 +256,90 @@ public extension AWSDynamoDBCompositePrimaryKeyTable {
256
256
}
257
257
}
258
258
}
259
+
260
+ extension DynamoDBClientTypes . BatchStatementError {
261
+ func asDynamoDBTableError( partitionKey: String , sortKey: String , entryCount: Int ) -> DynamoDBTableError ? {
262
+ guard let code = self . code else {
263
+ return nil
264
+ }
265
+
266
+ // https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchStatementError.html
267
+ return switch code {
268
+ case . accessdenied:
269
+ DynamoDBTableError . accessDenied ( message: self . message)
270
+ case . conditionalcheckfailed:
271
+ DynamoDBTableError . conditionalCheckFailed ( partitionKey: partitionKey,
272
+ sortKey: sortKey,
273
+ message: self . message)
274
+ case . duplicateitem:
275
+ DynamoDBTableError . duplicateItem ( partitionKey: partitionKey, sortKey: sortKey,
276
+ message: self . message)
277
+ case . internalservererror:
278
+ DynamoDBTableError . internalServerError ( message: self . message)
279
+ case . itemcollectionsizelimitexceeded:
280
+ DynamoDBTableError . itemCollectionSizeLimitExceeded ( attemptedSize: entryCount,
281
+ maximumSize: AWSDynamoDBLimits . maximumUpdatesPerTransactionStatement)
282
+ case . provisionedthroughputexceeded:
283
+ DynamoDBTableError . provisionedThroughputExceeded ( message: self . message)
284
+ case . requestlimitexceeded:
285
+ DynamoDBTableError . requestLimitExceeded ( message: self . message)
286
+ case . resourcenotfound:
287
+ DynamoDBTableError . resourceNotFound ( partitionKey: partitionKey, sortKey: sortKey,
288
+ message: self . message)
289
+ case . throttlingerror:
290
+ DynamoDBTableError . throttling ( message: self . message)
291
+ case . transactionconflict:
292
+ DynamoDBTableError . transactionConflict ( message: self . message)
293
+ case . validationerror:
294
+ DynamoDBTableError . validation ( partitionKey: partitionKey, sortKey: sortKey,
295
+ message: self . message)
296
+ case let . sdkUnknown( message) :
297
+ DynamoDBTableError . unknown ( code: message, partitionKey: partitionKey,
298
+ sortKey: sortKey, message: self . message)
299
+ }
300
+ }
301
+ }
302
+
303
+ extension [ DynamoDBTableError ] {
304
+ func removeDuplicates( ) -> [ DynamoDBTableError ] {
305
+ var seenAccessDenied = false
306
+ var seenInternalServerError = false
307
+ var seenRequestLimitExceeded = false
308
+ var seenStatementLengthExceeded = false
309
+ var seenItemCollectionSizeLimitExceeded = false
310
+ var seenProvisionedThroughputExceeded = false
311
+
312
+ func canPassThrough( state: inout Bool ) -> Bool {
313
+ if state {
314
+ return false
315
+ } else {
316
+ state = true
317
+ return true
318
+ }
319
+ }
320
+
321
+ // iterate through all errors
322
+ return self . compactMap { error in
323
+ return switch error {
324
+ case . accessDenied:
325
+ canPassThrough ( state: & seenAccessDenied) ? error : nil
326
+ case . internalServerError:
327
+ canPassThrough ( state: & seenInternalServerError) ? error : nil
328
+ case . requestLimitExceeded:
329
+ canPassThrough ( state: & seenRequestLimitExceeded) ? error : nil
330
+ case . statementLengthExceeded:
331
+ canPassThrough ( state: & seenStatementLengthExceeded) ? error : nil
332
+ case . itemCollectionSizeLimitExceeded:
333
+ canPassThrough ( state: & seenItemCollectionSizeLimitExceeded) ? error : nil
334
+ case . provisionedThroughputExceeded:
335
+ canPassThrough ( state: & seenProvisionedThroughputExceeded) ? error : nil
336
+ case . conditionalCheckFailed, . duplicateItem, . concurrencyError, . validation, . throttling, . databaseError,
337
+ . unexpectedError, . unexpectedResponse, . resourceNotFound, . typeMismatch, . batchAPIExceededRetries,
338
+ . unexpectedType, . unableToUpdateError, . unrecognizedError, . multipleUnexpectedErrors, . transactionCanceled,
339
+ . transactionConflict, . batchFailures, . unknown:
340
+ // always pass through these errors
341
+ error
342
+ }
343
+ }
344
+ }
345
+ }
0 commit comments