class DataMapper::Adapters::InMemoryAdapter
This is probably the simplest functional adapter possible. It simply stores and queries from a hash containing the model classes as keys, and an array of hashes. It is not persistent whatsoever; when the Ruby process finishes, everything that was stored it lost. However, it doesn't require any other external libraries, such as data_objects, so it is ideal for writing specs against. It also serves as an excellent example for budding adapter developers, so it is critical that it remains well documented and up to date.
Public Class Methods
Make a new instance of the adapter. The @records ivar is the 'data-store' for this adapter. It is not shared amongst multiple incarnations of this adapter, eg DataMapper.setup(:default, :adapter => :in_memory); DataMapper.setup(:alternate, :adapter => :in_memory) do not share the data-store between them.
@param [String, Symbol] name
The name of the Repository using this adapter.
@param [String, Hash] uri_or_options
The connection uri string, or a hash of options to set up the adapter
@api semipublic
# File lib/dm-core/adapters/in_memory_adapter.rb, line 97 def initialize(name, options = {}) super @records = {} end
Public Instance Methods
Used by DataMapper to put records into a data-store: “INSERT” in SQL-speak. It takes an array of the resources (model instances) to be saved. Resources each have a key that can be used to quickly look them up later without searching, if the adapter supports it.
@param [Enumerable(Resource)] resources
The set of resources (model instances)
@api semipublic
# File lib/dm-core/adapters/in_memory_adapter.rb, line 21 def create(resources) records = records_for(resources.first.model) resources.each do |resource| initialize_serial(resource, records.size.succ) records << attributes_as_fields(resource.attributes(nil)) end end
Destroys all the records matching the given query. “DELETE” in SQL.
@param [DataMapper::Collection] resources
The collection of resources to delete.
@return [Integer]
The number of records that were deleted.
@api semipublic
# File lib/dm-core/adapters/in_memory_adapter.rb, line 70 def delete(collection) records = records_for(collection.model) records_to_delete = collection.query.filter_records(records.dup) records.replace(records - records_to_delete) records_to_delete.size end
Looks up one record or a collection of records from the data-store: “SELECT” in SQL.
@param [Query] query
The query to be used to seach for the resources
@return [Array]
An Array of Hashes containing the key-value pairs for each record
@api semipublic
# File lib/dm-core/adapters/in_memory_adapter.rb, line 41 def read(query) query.filter_records(records_for(query.model).dup) end
TODO consider proper automigrate functionality
# File lib/dm-core/adapters/in_memory_adapter.rb, line 78 def reset @records = {} end
Used by DataMapper to update the attributes on existing records in a data-store: “UPDATE” in SQL-speak. It takes a hash of the attributes to update with, as well as a collection object that specifies which resources should be updated.
@param [Hash] attributes
A set of key-value pairs of the attributes to update the resources with.
@param [DataMapper::Collection] resources
The collection of resources to update.
@api semipublic
# File lib/dm-core/adapters/in_memory_adapter.rb, line 56 def update(attributes, collection) attributes = attributes_as_fields(attributes) read(collection.query).each { |record| record.update(attributes) }.size end
Private Instance Methods
All the records we're storing. This method will look them up by model name
@api private
# File lib/dm-core/adapters/in_memory_adapter.rb, line 105 def records_for(model) @records[model.storage_name(name)] ||= [] end