@@ -22,7 +22,6 @@ use cipherstash_client::{
2222 encryption:: { Encryption , EncryptionError } ,
2323 vitur:: { errors:: LoadConfigError , DatasetConfigWithIndexRootKey , Vitur } ,
2424} ;
25- use itertools:: Itertools ;
2625use log:: info;
2726use std:: collections:: HashSet ;
2827use thiserror:: Error ;
@@ -39,6 +38,8 @@ pub struct EncryptedTable {
3938pub enum PutError {
4039 #[ error( "AwsError: {0}" ) ]
4140 Aws ( String ) ,
41+ #[ error( "AwsBuildError: {0}" ) ]
42+ AwsBuildError ( #[ from] aws_sdk_dynamodb:: error:: BuildError ) ,
4243 #[ error( "Write Conversion Error: {0}" ) ]
4344 WriteConversion ( #[ from] WriteConversionError ) ,
4445 #[ error( "SealError: {0}" ) ]
@@ -65,6 +66,8 @@ pub enum GetError {
6566pub enum DeleteError {
6667 #[ error( "Encryption Error: {0}" ) ]
6768 Encryption ( #[ from] EncryptionError ) ,
69+ #[ error( "AwsBuildError: {0}" ) ]
70+ AwsBuildError ( #[ from] aws_sdk_dynamodb:: error:: BuildError ) ,
6871 #[ error( "AwsError: {0}" ) ]
6972 Aws ( String ) ,
7073}
@@ -166,29 +169,32 @@ impl EncryptedTable {
166169 ) -> Result < ( ) , DeleteError > {
167170 let PrimaryKeyParts { pk, sk } = self . get_primary_key_parts :: < E > ( k) ?;
168171
169- let sk_to_delete = all_index_keys :: < E > ( & sk)
172+ let transact_items = all_index_keys :: < E > ( & sk)
170173 . into_iter ( )
171- . map ( |x| hmac ( "sk" , & x, Some ( pk. as_str ( ) ) , & self . cipher ) )
174+ . map ( |x| Ok :: < _ , DeleteError > ( hmac ( "sk" , & x, Some ( pk. as_str ( ) ) , & self . cipher ) ? ) )
172175 . chain ( [ Ok ( sk) ] )
176+ . map ( |sk| {
177+ sk. and_then ( |sk| {
178+ Ok :: < _ , DeleteError > (
179+ TransactWriteItem :: builder ( )
180+ . delete (
181+ Delete :: builder ( )
182+ . table_name ( & self . table_name )
183+ . key ( "pk" , AttributeValue :: S ( pk. clone ( ) ) )
184+ . key ( "sk" , AttributeValue :: S ( sk) )
185+ . build ( ) ?,
186+ )
187+ . build ( ) ,
188+ )
189+ } )
190+ } )
173191 . collect :: < Result < Vec < _ > , _ > > ( ) ?;
174192
175- let transact_items = sk_to_delete. into_iter ( ) . map ( |sk| {
176- TransactWriteItem :: builder ( )
177- . delete (
178- Delete :: builder ( )
179- . table_name ( & self . table_name )
180- . key ( "pk" , AttributeValue :: S ( pk. clone ( ) ) )
181- . key ( "sk" , AttributeValue :: S ( sk) )
182- . build ( ) ,
183- )
184- . build ( )
185- } ) ;
186-
187193 // Dynamo has a limit of 100 items per transaction
188194 for items in transact_items. chunks ( 100 ) . into_iter ( ) {
189195 self . db
190196 . transact_write_items ( )
191- . set_transact_items ( Some ( items. collect ( ) ) )
197+ . set_transact_items ( Some ( items. to_vec ( ) ) )
192198 . send ( )
193199 . await
194200 . map_err ( |e| DeleteError :: Aws ( format ! ( "{e:?}" ) ) ) ?;
@@ -219,7 +225,7 @@ impl EncryptedTable {
219225 Put :: builder ( )
220226 . table_name ( & self . table_name )
221227 . set_item ( Some ( entry. try_into ( ) ?) )
222- . build ( ) ,
228+ . build ( ) ? ,
223229 )
224230 . build ( ) ,
225231 ) ;
@@ -239,7 +245,7 @@ impl EncryptedTable {
239245 . table_name ( & self . table_name )
240246 . key ( "pk" , AttributeValue :: S ( pk. clone ( ) ) )
241247 . key ( "sk" , AttributeValue :: S ( index_sk) )
242- . build ( ) ,
248+ . build ( ) ? ,
243249 )
244250 . build ( ) ,
245251 ) ;
0 commit comments