@@ -380,12 +380,21 @@ run_transaction([{add, Key, Value} | Rest], {ToAdd, ToRem}, Log, TransactId,
380380 % % only keep a reference so we don't have the value multiple time.
381381 {ok , Pos , Size } = cbt_file :append_term_crc32 (Fd , Value ),
382382 Value1 = {Key , {Pos , Size }, TransactId , Ts },
383- run_transaction (Rest , {[{Key , Value1 } | ToAdd ], ToRem },
383+ % % make sure to replace duplicates
384+ ToAdd2 = lists :keystore (Key , 1 , ToAdd , {Key , Value1 }),
385+ run_transaction (Rest , {ToAdd2 , ToRem },
384386 [{add , Value1 } | Log ], TransactId , Ts , Db );
385- run_transaction ([{remove , Key } | Rest ], {ToAdd , ToRem }, Log , TransactId , Ts , Db ) ->
386- % % remove a key
387- run_transaction (Rest , {ToAdd , [Key | ToRem ]}, [{remove , Key } | Log ],
388- TransactId , Ts , Db );
387+ run_transaction ([{remove , Key } | Rest ], {ToAdd , ToRem }, Log , TransactId , Ts ,
388+ Db ) ->
389+ case lists :member (Key , ToRem ) of
390+ true ->
391+ % % duplicate, continue
392+ run_transaction (Rest , {ToAdd , ToRem }, Log , TransactId , Ts , Db );
393+ false ->
394+ % % remove a key
395+ run_transaction (Rest , {ToAdd , [Key | ToRem ]}, [{remove , Key } | Log ],
396+ TransactId , Ts , Db )
397+ end ;
389398run_transaction ([{fn , Func } | Rest ], AddRemove , Log , TransactId , Ts , Db ) ->
390399 % % execute a transaction function
391400 case cowdb_util :apply (Func , [Db ]) of
0 commit comments