Module: Aws::Record::Transactions
- Extended by:
- ClientConfiguration
- Defined in:
- lib/aws-record/record/transactions.rb
Class Method Summary collapse
-
.transact_find(opts) ⇒ OpenStruct
Provides a way to run a transactional find across multiple DynamoDB items, including transactions which get items across multiple actual or virtual tables.
-
.transact_write(opts) ⇒ Object
Provides a way to pass in aws-record items into transactional writes, as well as adding the ability to run ‘save’ commands in a transaction while allowing aws-record to determine if a :put or :update operation is most appropriate.
Methods included from ClientConfiguration
configure_client, dynamodb_client
Class Method Details
.transact_find(opts) ⇒ OpenStruct
Provides a way to run a transactional find across multiple DynamoDB items, including transactions which get items across multiple actual or virtual tables.
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/aws-record/record/transactions.rb', line 46 def transact_find(opts) opts = opts.dup client = opts.delete(:client) || dynamodb_client transact_items = opts.delete(:transact_items) # add nil check? model_classes = [] client_transact_items = transact_items.map do |tfind_opts| model_class = tfind_opts.delete(:model_class) model_classes << model_class tfind_opts end request_opts = opts request_opts[:transact_items] = client_transact_items client_resp = client.transact_get_items( request_opts ) responses = client_resp.responses index = -1 ret = OpenStruct.new ret.consumed_capacity = client_resp.consumed_capacity ret.missing_items = [] ret.responses = client_resp.responses.map do |item| index += 1 if item.nil? || item.item.nil? missing_data = { model_class: model_classes[index], key: transact_items[index][:get][:key] } ret.missing_items << missing_data nil else # need to translate the item keys raw_item = item.item model_class = model_classes[index] new_item_opts = {} raw_item.each do |db_name, value| name = model_class.attributes.db_to_attribute_name(db_name) new_item_opts[name] = value end item = model_class.new(new_item_opts) item.clean! item end end ret end |
.transact_write(opts) ⇒ Object
Provides a way to pass in aws-record items into transactional writes, as well as adding the ability to run ‘save’ commands in a transaction while allowing aws-record to determine if a :put or :update operation is most appropriate. #transact_write
supports 5 different transact item modes:
-
save: Behaves much like the
#save
operation on the item itself. If the keys are dirty, and thus it appears to be a new item, will create a :put operation with a conditional check on the item’s existance. Note that you cannot bring your own conditional expression in this case. If you wish to force put or add your own conditional checks, use the :put operation. -
put: Does a force put for the given item key and model.
-
update: Does an upsert for the given item.
-
delete: Deletes the given item.
-
check: Takes the result of
#transact_check_expression
, performing the specified check as a part of the transaction.
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
# File 'lib/aws-record/record/transactions.rb', line 169 def transact_write(opts) opts = opts.dup client = opts.delete(:client) || dynamodb_client dirty_items = [] delete_items = [] # fetch abstraction records transact_items = _transform_transact_write_items( opts.delete(:transact_items), dirty_items, delete_items ) opts[:transact_items] = transact_items resp = client.transact_write_items(opts) # mark all items clean/destroyed as needed if we didn't raise an exception dirty_items.each { |i| i.clean! } delete_items.each { |i| i.instance_variable_get("@data").destroyed = true } resp end |