datamapper-dm-core 0.9.11 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.autotest +17 -14
- data/.gitignore +3 -1
- data/FAQ +6 -5
- data/History.txt +5 -39
- data/Manifest.txt +67 -76
- data/QUICKLINKS +1 -1
- data/README.txt +21 -15
- data/Rakefile +16 -15
- data/SPECS +2 -29
- data/TODO +1 -1
- data/dm-core.gemspec +11 -15
- data/lib/dm-core/adapters/abstract_adapter.rb +182 -185
- data/lib/dm-core/adapters/data_objects_adapter.rb +482 -534
- data/lib/dm-core/adapters/in_memory_adapter.rb +90 -69
- data/lib/dm-core/adapters/mysql_adapter.rb +22 -115
- data/lib/dm-core/adapters/oracle_adapter.rb +249 -0
- data/lib/dm-core/adapters/postgres_adapter.rb +7 -173
- data/lib/dm-core/adapters/sqlite3_adapter.rb +4 -97
- data/lib/dm-core/adapters/yaml_adapter.rb +116 -0
- data/lib/dm-core/adapters.rb +135 -16
- data/lib/dm-core/associations/many_to_many.rb +372 -90
- data/lib/dm-core/associations/many_to_one.rb +220 -73
- data/lib/dm-core/associations/one_to_many.rb +319 -255
- data/lib/dm-core/associations/one_to_one.rb +66 -53
- data/lib/dm-core/associations/relationship.rb +560 -158
- data/lib/dm-core/collection.rb +1104 -381
- data/lib/dm-core/core_ext/kernel.rb +12 -0
- data/lib/dm-core/core_ext/symbol.rb +10 -0
- data/lib/dm-core/identity_map.rb +4 -34
- data/lib/dm-core/migrations.rb +1283 -0
- data/lib/dm-core/model/descendant_set.rb +81 -0
- data/lib/dm-core/model/hook.rb +45 -0
- data/lib/dm-core/model/is.rb +32 -0
- data/lib/dm-core/model/property.rb +248 -0
- data/lib/dm-core/model/relationship.rb +335 -0
- data/lib/dm-core/model/scope.rb +90 -0
- data/lib/dm-core/model.rb +570 -369
- data/lib/dm-core/property.rb +753 -280
- data/lib/dm-core/property_set.rb +141 -98
- data/lib/dm-core/query/conditions/comparison.rb +814 -0
- data/lib/dm-core/query/conditions/operation.rb +247 -0
- data/lib/dm-core/query/direction.rb +43 -0
- data/lib/dm-core/query/operator.rb +42 -0
- data/lib/dm-core/query/path.rb +102 -0
- data/lib/dm-core/query/sort.rb +45 -0
- data/lib/dm-core/query.rb +974 -492
- data/lib/dm-core/repository.rb +147 -107
- data/lib/dm-core/resource.rb +644 -429
- data/lib/dm-core/spec/adapter_shared_spec.rb +294 -0
- data/lib/dm-core/spec/data_objects_adapter_shared_spec.rb +106 -0
- data/lib/dm-core/support/chainable.rb +20 -0
- data/lib/dm-core/support/deprecate.rb +12 -0
- data/lib/dm-core/support/equalizer.rb +23 -0
- data/lib/dm-core/support/logger.rb +13 -0
- data/lib/dm-core/{naming_conventions.rb → support/naming_conventions.rb} +6 -6
- data/lib/dm-core/transaction.rb +333 -92
- data/lib/dm-core/type.rb +98 -60
- data/lib/dm-core/types/boolean.rb +1 -1
- data/lib/dm-core/types/discriminator.rb +34 -20
- data/lib/dm-core/types/object.rb +7 -4
- data/lib/dm-core/types/paranoid_boolean.rb +11 -9
- data/lib/dm-core/types/paranoid_datetime.rb +11 -9
- data/lib/dm-core/types/serial.rb +3 -3
- data/lib/dm-core/types/text.rb +3 -4
- data/lib/dm-core/version.rb +1 -1
- data/lib/dm-core.rb +106 -110
- data/script/performance.rb +102 -109
- data/script/profile.rb +169 -38
- data/spec/lib/adapter_helpers.rb +105 -0
- data/spec/lib/collection_helpers.rb +18 -0
- data/spec/lib/counter_adapter.rb +34 -0
- data/spec/lib/pending_helpers.rb +27 -0
- data/spec/lib/rspec_immediate_feedback_formatter.rb +53 -0
- data/spec/public/associations/many_to_many_spec.rb +193 -0
- data/spec/public/associations/many_to_one_spec.rb +73 -0
- data/spec/public/associations/one_to_many_spec.rb +77 -0
- data/spec/public/associations/one_to_one_spec.rb +156 -0
- data/spec/public/collection_spec.rb +65 -0
- data/spec/public/model/relationship_spec.rb +924 -0
- data/spec/public/model_spec.rb +159 -0
- data/spec/public/property_spec.rb +829 -0
- data/spec/public/resource_spec.rb +71 -0
- data/spec/public/sel_spec.rb +44 -0
- data/spec/public/setup_spec.rb +145 -0
- data/spec/public/shared/association_collection_shared_spec.rb +317 -0
- data/spec/public/shared/collection_shared_spec.rb +1723 -0
- data/spec/public/shared/finder_shared_spec.rb +1619 -0
- data/spec/public/shared/resource_shared_spec.rb +924 -0
- data/spec/public/shared/sel_shared_spec.rb +112 -0
- data/spec/public/transaction_spec.rb +129 -0
- data/spec/public/types/discriminator_spec.rb +130 -0
- data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
- data/spec/semipublic/adapters/in_memory_adapter_spec.rb +12 -0
- data/spec/semipublic/adapters/mysql_adapter_spec.rb +17 -0
- data/spec/semipublic/adapters/oracle_adapter_spec.rb +194 -0
- data/spec/semipublic/adapters/postgres_adapter_spec.rb +17 -0
- data/spec/semipublic/adapters/sqlite3_adapter_spec.rb +17 -0
- data/spec/semipublic/adapters/yaml_adapter_spec.rb +12 -0
- data/spec/semipublic/associations/many_to_one_spec.rb +53 -0
- data/spec/semipublic/associations/relationship_spec.rb +194 -0
- data/spec/semipublic/associations_spec.rb +177 -0
- data/spec/semipublic/collection_spec.rb +142 -0
- data/spec/semipublic/property_spec.rb +61 -0
- data/spec/semipublic/query/conditions_spec.rb +528 -0
- data/spec/semipublic/query/path_spec.rb +443 -0
- data/spec/semipublic/query_spec.rb +2626 -0
- data/spec/semipublic/resource_spec.rb +47 -0
- data/spec/semipublic/shared/resource_shared_spec.rb +126 -0
- data/spec/spec.opts +3 -1
- data/spec/spec_helper.rb +80 -57
- data/tasks/ci.rb +19 -31
- data/tasks/dm.rb +43 -48
- data/tasks/doc.rb +8 -11
- data/tasks/gemspec.rb +5 -5
- data/tasks/hoe.rb +15 -16
- data/tasks/install.rb +8 -10
- metadata +72 -93
- data/lib/dm-core/associations/relationship_chain.rb +0 -81
- data/lib/dm-core/associations.rb +0 -207
- data/lib/dm-core/auto_migrations.rb +0 -105
- data/lib/dm-core/dependency_queue.rb +0 -32
- data/lib/dm-core/hook.rb +0 -11
- data/lib/dm-core/is.rb +0 -16
- data/lib/dm-core/logger.rb +0 -232
- data/lib/dm-core/migrations/destructive_migrations.rb +0 -17
- data/lib/dm-core/migrator.rb +0 -29
- data/lib/dm-core/scope.rb +0 -58
- data/lib/dm-core/support/array.rb +0 -13
- data/lib/dm-core/support/assertions.rb +0 -8
- data/lib/dm-core/support/errors.rb +0 -23
- data/lib/dm-core/support/kernel.rb +0 -11
- data/lib/dm-core/support/symbol.rb +0 -41
- data/lib/dm-core/support.rb +0 -7
- data/lib/dm-core/type_map.rb +0 -80
- data/lib/dm-core/types.rb +0 -19
- data/script/all +0 -4
- data/spec/integration/association_spec.rb +0 -1382
- data/spec/integration/association_through_spec.rb +0 -203
- data/spec/integration/associations/many_to_many_spec.rb +0 -449
- data/spec/integration/associations/many_to_one_spec.rb +0 -163
- data/spec/integration/associations/one_to_many_spec.rb +0 -188
- data/spec/integration/auto_migrations_spec.rb +0 -413
- data/spec/integration/collection_spec.rb +0 -1073
- data/spec/integration/data_objects_adapter_spec.rb +0 -32
- data/spec/integration/dependency_queue_spec.rb +0 -46
- data/spec/integration/model_spec.rb +0 -197
- data/spec/integration/mysql_adapter_spec.rb +0 -85
- data/spec/integration/postgres_adapter_spec.rb +0 -731
- data/spec/integration/property_spec.rb +0 -253
- data/spec/integration/query_spec.rb +0 -514
- data/spec/integration/repository_spec.rb +0 -61
- data/spec/integration/resource_spec.rb +0 -513
- data/spec/integration/sqlite3_adapter_spec.rb +0 -352
- data/spec/integration/sti_spec.rb +0 -273
- data/spec/integration/strategic_eager_loading_spec.rb +0 -156
- data/spec/integration/transaction_spec.rb +0 -75
- data/spec/integration/type_spec.rb +0 -275
- data/spec/lib/logging_helper.rb +0 -18
- data/spec/lib/mock_adapter.rb +0 -27
- data/spec/lib/model_loader.rb +0 -100
- data/spec/lib/publicize_methods.rb +0 -28
- data/spec/models/content.rb +0 -16
- data/spec/models/vehicles.rb +0 -34
- data/spec/models/zoo.rb +0 -48
- data/spec/unit/adapters/abstract_adapter_spec.rb +0 -133
- data/spec/unit/adapters/adapter_shared_spec.rb +0 -15
- data/spec/unit/adapters/data_objects_adapter_spec.rb +0 -632
- data/spec/unit/adapters/in_memory_adapter_spec.rb +0 -98
- data/spec/unit/adapters/postgres_adapter_spec.rb +0 -133
- data/spec/unit/associations/many_to_many_spec.rb +0 -32
- data/spec/unit/associations/many_to_one_spec.rb +0 -159
- data/spec/unit/associations/one_to_many_spec.rb +0 -393
- data/spec/unit/associations/one_to_one_spec.rb +0 -7
- data/spec/unit/associations/relationship_spec.rb +0 -71
- data/spec/unit/associations_spec.rb +0 -242
- data/spec/unit/auto_migrations_spec.rb +0 -111
- data/spec/unit/collection_spec.rb +0 -182
- data/spec/unit/data_mapper_spec.rb +0 -35
- data/spec/unit/identity_map_spec.rb +0 -126
- data/spec/unit/is_spec.rb +0 -80
- data/spec/unit/migrator_spec.rb +0 -33
- data/spec/unit/model_spec.rb +0 -321
- data/spec/unit/naming_conventions_spec.rb +0 -36
- data/spec/unit/property_set_spec.rb +0 -90
- data/spec/unit/property_spec.rb +0 -753
- data/spec/unit/query_spec.rb +0 -571
- data/spec/unit/repository_spec.rb +0 -93
- data/spec/unit/resource_spec.rb +0 -649
- data/spec/unit/scope_spec.rb +0 -142
- data/spec/unit/transaction_spec.rb +0 -493
- data/spec/unit/type_map_spec.rb +0 -114
- data/spec/unit/type_spec.rb +0 -119
|
@@ -1,209 +1,206 @@
|
|
|
1
1
|
module DataMapper
|
|
2
2
|
module Adapters
|
|
3
|
+
# Specific adapters extend this class and implement
|
|
4
|
+
# methods for creating, reading, updating and deleting records.
|
|
5
|
+
#
|
|
6
|
+
# Adapters may only implement method for reading or (less common case)
|
|
7
|
+
# writing. Read only adapter may be useful when one needs to work
|
|
8
|
+
# with legacy data that should not be changed or web services that
|
|
9
|
+
# only provide read access to data (from Wordnet and Medline to
|
|
10
|
+
# Atom and RSS syndication feeds)
|
|
11
|
+
#
|
|
12
|
+
# Note that in case of adapters to relational databases it makes
|
|
13
|
+
# sense to inherit from DataObjectsAdapter class.
|
|
3
14
|
class AbstractAdapter
|
|
4
|
-
include Assertions
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
15
|
+
include Extlib::Assertions
|
|
16
|
+
extend Extlib::Assertions
|
|
17
|
+
extend Equalizer
|
|
18
|
+
|
|
19
|
+
equalize :name, :options, :resource_naming_convention, :field_naming_convention
|
|
20
|
+
|
|
21
|
+
# Adapter name
|
|
22
|
+
#
|
|
23
|
+
# @example
|
|
24
|
+
# adapter.name # => :default
|
|
25
|
+
#
|
|
26
|
+
# Note that when you use
|
|
27
|
+
#
|
|
28
|
+
# DataMapper.setup(:default, 'postgres://postgres@localhost/dm_core_test')
|
|
29
|
+
#
|
|
30
|
+
# then adapter name is currently be set to is :default
|
|
31
|
+
#
|
|
32
|
+
# @return [Symbol]
|
|
33
|
+
# the adapter name
|
|
34
|
+
#
|
|
35
|
+
# @api semipublic
|
|
36
|
+
attr_reader :name
|
|
37
|
+
|
|
38
|
+
# Options with which adapter was set up
|
|
39
|
+
#
|
|
40
|
+
# @example
|
|
41
|
+
# adapter.options # => { :adapter => 'yaml', :path => '/tmp' }
|
|
42
|
+
#
|
|
43
|
+
# @return [Hash]
|
|
44
|
+
# adapter configuration options
|
|
45
|
+
#
|
|
46
|
+
# @api semipublic
|
|
47
|
+
attr_reader :options
|
|
48
|
+
|
|
49
|
+
# A callable object returning a naming convention for model storage
|
|
50
|
+
#
|
|
51
|
+
# @example
|
|
52
|
+
# adapter.resource_naming_convention # => Proc for model storage name
|
|
53
|
+
#
|
|
54
|
+
# @return [#call]
|
|
55
|
+
# object to return the naming convention for each model
|
|
56
|
+
#
|
|
57
|
+
# @api semipublic
|
|
58
|
+
attr_accessor :resource_naming_convention
|
|
59
|
+
|
|
60
|
+
# A callable object returning a naming convention for property fields
|
|
61
|
+
#
|
|
62
|
+
# @example
|
|
63
|
+
# adapter.field_naming_convention # => Proc for field name
|
|
64
|
+
#
|
|
65
|
+
# @return [#call]
|
|
66
|
+
# object to return the naming convention for each field
|
|
67
|
+
#
|
|
68
|
+
# @api semipublic
|
|
69
|
+
attr_accessor :field_naming_convention
|
|
70
|
+
|
|
71
|
+
# Persists one or many new resources
|
|
72
|
+
#
|
|
73
|
+
# @example
|
|
74
|
+
# adapter.create(collection) # => 1
|
|
75
|
+
#
|
|
76
|
+
# Adapters provide specific implementation of this method
|
|
77
|
+
#
|
|
78
|
+
# @param [Enumerable<Resource>] resources
|
|
79
|
+
# The list of resources (model instances) to create
|
|
80
|
+
#
|
|
81
|
+
# @return [Integer]
|
|
82
|
+
# The number of records that were actually saved into the data-store
|
|
83
|
+
#
|
|
84
|
+
# @api semipublic
|
|
9
85
|
def create(resources)
|
|
10
|
-
raise NotImplementedError
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def read_many(query)
|
|
14
|
-
raise NotImplementedError
|
|
86
|
+
raise NotImplementedError, "#{self.class}#create not implemented"
|
|
15
87
|
end
|
|
16
88
|
|
|
17
|
-
|
|
18
|
-
|
|
89
|
+
# Reads one or many resources from a datastore
|
|
90
|
+
#
|
|
91
|
+
# @example
|
|
92
|
+
# adapter.read(query) # => [ { 'name' => 'Dan Kubb' } ]
|
|
93
|
+
#
|
|
94
|
+
# Adapters provide specific implementation of this method
|
|
95
|
+
#
|
|
96
|
+
# @param [Query] query
|
|
97
|
+
# the query to match resources in the datastore
|
|
98
|
+
#
|
|
99
|
+
# @return [Enumerable<Hash>]
|
|
100
|
+
# an array of hashes to become resources
|
|
101
|
+
#
|
|
102
|
+
# @api semipublic
|
|
103
|
+
def read(query)
|
|
104
|
+
raise NotImplementedError, "#{self.class}#read not implemented"
|
|
19
105
|
end
|
|
20
106
|
|
|
21
|
-
|
|
22
|
-
|
|
107
|
+
# Updates one or many existing resources
|
|
108
|
+
#
|
|
109
|
+
# @example
|
|
110
|
+
# adapter.update(attributes, collection) # => 1
|
|
111
|
+
#
|
|
112
|
+
# Adapters provide specific implementation of this method
|
|
113
|
+
#
|
|
114
|
+
# @param [Hash(Property => Object)] attributes
|
|
115
|
+
# hash of attribute values to set, keyed by Property
|
|
116
|
+
# @param [Collection] collection
|
|
117
|
+
# collection of records to be updated
|
|
118
|
+
#
|
|
119
|
+
# @return [Integer]
|
|
120
|
+
# the number of records updated
|
|
121
|
+
#
|
|
122
|
+
# @api semipublic
|
|
123
|
+
def update(attributes, collection)
|
|
124
|
+
raise NotImplementedError, "#{self.class}#update not implemented"
|
|
23
125
|
end
|
|
24
126
|
|
|
25
|
-
|
|
26
|
-
|
|
127
|
+
# Deletes one or many existing resources
|
|
128
|
+
#
|
|
129
|
+
# @example
|
|
130
|
+
# adapter.delete(collection) # => 1
|
|
131
|
+
#
|
|
132
|
+
# Adapters provide specific implementation of this method
|
|
133
|
+
#
|
|
134
|
+
# @param [Collection] collection
|
|
135
|
+
# collection of records to be deleted
|
|
136
|
+
#
|
|
137
|
+
# @return [Integer]
|
|
138
|
+
# the number of records deleted
|
|
139
|
+
#
|
|
140
|
+
# @api semipublic
|
|
141
|
+
def delete(collection)
|
|
142
|
+
raise NotImplementedError, "#{self.class}#delete not implemented"
|
|
27
143
|
end
|
|
28
144
|
|
|
29
145
|
protected
|
|
30
146
|
|
|
31
|
-
|
|
32
|
-
|
|
147
|
+
# Set the serial value of the Resource
|
|
148
|
+
#
|
|
149
|
+
# @param [Resource] resource
|
|
150
|
+
# the resource to set the serial property in
|
|
151
|
+
# @param [Integer] id
|
|
152
|
+
# the identifier to set in the resource
|
|
153
|
+
#
|
|
154
|
+
# @return [undefined]
|
|
155
|
+
#
|
|
156
|
+
# @api semipublic
|
|
157
|
+
def initialize_serial(resource, next_id)
|
|
158
|
+
return unless serial = resource.model.serial(name)
|
|
159
|
+
return unless serial.get!(resource).nil?
|
|
160
|
+
serial.set!(resource, next_id)
|
|
161
|
+
|
|
162
|
+
# TODO: replace above with this, once
|
|
163
|
+
# specs can handle random, non-sequential ids
|
|
164
|
+
#serial.set!(resource, rand(2**32))
|
|
33
165
|
end
|
|
34
166
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
#
|
|
38
|
-
#
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
167
|
+
# Translate the attributes into a Hash with the field as the key
|
|
168
|
+
#
|
|
169
|
+
# @example
|
|
170
|
+
# attributes = { User.properties[:name] => 'Dan Kubb' }
|
|
171
|
+
# adapter.attributes_as_fields(attributes) # => { 'name' => 'Dan Kubb' }
|
|
172
|
+
#
|
|
173
|
+
# @param [Hash] attributes
|
|
174
|
+
# the attributes with the Property as the key
|
|
175
|
+
#
|
|
176
|
+
# @return [Hash]
|
|
177
|
+
# the attributes with the Property#field as the key
|
|
178
|
+
#
|
|
179
|
+
# @api semipublic
|
|
180
|
+
def attributes_as_fields(attributes)
|
|
181
|
+
attributes.map { |property, value| [ property.field, value ] }.to_hash
|
|
182
|
+
end
|
|
42
183
|
|
|
43
|
-
|
|
44
|
-
@uri = normalize_uri(uri_or_options)
|
|
184
|
+
private
|
|
45
185
|
|
|
186
|
+
# Initialize an AbstractAdapter instance
|
|
187
|
+
#
|
|
188
|
+
# @param [Symbol] name
|
|
189
|
+
# the adapter repository name
|
|
190
|
+
# @param [Hash] options
|
|
191
|
+
# the adapter configuration options
|
|
192
|
+
#
|
|
193
|
+
# @return [undefined]
|
|
194
|
+
#
|
|
195
|
+
# @api semipublic
|
|
196
|
+
def initialize(name, options)
|
|
197
|
+
@name = name
|
|
198
|
+
@options = options.dup.freeze
|
|
46
199
|
@resource_naming_convention = NamingConventions::Resource::UnderscoredAndPluralized
|
|
47
200
|
@field_naming_convention = NamingConventions::Field::Underscored
|
|
48
|
-
|
|
49
|
-
@transactions = {}
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# TODO: move to dm-more/dm-migrations
|
|
53
|
-
module Migration
|
|
54
|
-
#
|
|
55
|
-
# Returns whether the storage_name exists.
|
|
56
|
-
#
|
|
57
|
-
# @param storage_name<String> a String defining the name of a storage,
|
|
58
|
-
# for example a table name.
|
|
59
|
-
#
|
|
60
|
-
# @return <Boolean> true if the storage exists
|
|
61
|
-
#
|
|
62
|
-
# TODO: move to dm-more/dm-migrations (if possible)
|
|
63
|
-
def storage_exists?(storage_name)
|
|
64
|
-
raise NotImplementedError
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
#
|
|
68
|
-
# Returns whether the field exists.
|
|
69
|
-
#
|
|
70
|
-
# @param storage_name<String> a String defining the name of a storage, for example a table name.
|
|
71
|
-
# @param field_name<String> a String defining the name of a field, for example a column name.
|
|
72
|
-
#
|
|
73
|
-
# @return <Boolean> true if the field exists.
|
|
74
|
-
#
|
|
75
|
-
# TODO: move to dm-more/dm-migrations (if possible)
|
|
76
|
-
def field_exists?(storage_name, field_name)
|
|
77
|
-
raise NotImplementedError
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
# TODO: move to dm-more/dm-migrations
|
|
81
|
-
def upgrade_model_storage(repository, model)
|
|
82
|
-
raise NotImplementedError
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
# TODO: move to dm-more/dm-migrations
|
|
86
|
-
def create_model_storage(repository, model)
|
|
87
|
-
raise NotImplementedError
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
# TODO: move to dm-more/dm-migrations
|
|
91
|
-
def destroy_model_storage(repository, model)
|
|
92
|
-
raise NotImplementedError
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# TODO: move to dm-more/dm-migrations
|
|
96
|
-
def alter_model_storage(repository, *args)
|
|
97
|
-
raise NotImplementedError
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
# TODO: move to dm-more/dm-migrations
|
|
101
|
-
def create_property_storage(repository, property)
|
|
102
|
-
raise NotImplementedError
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# TODO: move to dm-more/dm-migrations
|
|
106
|
-
def destroy_property_storage(repository, property)
|
|
107
|
-
raise NotImplementedError
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
# TODO: move to dm-more/dm-migrations
|
|
111
|
-
def alter_property_storage(repository, *args)
|
|
112
|
-
raise NotImplementedError
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
module ClassMethods
|
|
116
|
-
# Default TypeMap for all adapters.
|
|
117
|
-
#
|
|
118
|
-
# @return <DataMapper::TypeMap> default TypeMap
|
|
119
|
-
#
|
|
120
|
-
# TODO: move to dm-more/dm-migrations
|
|
121
|
-
def type_map
|
|
122
|
-
@type_map ||= TypeMap.new
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
include Migration
|
|
128
|
-
extend Migration::ClassMethods
|
|
129
|
-
|
|
130
|
-
# TODO: move to dm-more/dm-transaction
|
|
131
|
-
module Transaction
|
|
132
|
-
#
|
|
133
|
-
# Pushes the given Transaction onto the per thread Transaction stack so
|
|
134
|
-
# that everything done by this Adapter is done within the context of said
|
|
135
|
-
# Transaction.
|
|
136
|
-
#
|
|
137
|
-
# @param transaction<DataMapper::Transaction> a Transaction to be the
|
|
138
|
-
# 'current' transaction until popped.
|
|
139
|
-
#
|
|
140
|
-
# TODO: move to dm-more/dm-transaction
|
|
141
|
-
def push_transaction(transaction)
|
|
142
|
-
transactions(Thread.current) << transaction
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
#
|
|
146
|
-
# Pop the 'current' Transaction from the per thread Transaction stack so
|
|
147
|
-
# that everything done by this Adapter is no longer necessarily within the
|
|
148
|
-
# context of said Transaction.
|
|
149
|
-
#
|
|
150
|
-
# @return <DataMapper::Transaction> the former 'current' transaction.
|
|
151
|
-
#
|
|
152
|
-
# TODO: move to dm-more/dm-transaction
|
|
153
|
-
def pop_transaction
|
|
154
|
-
transactions(Thread.current).pop
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
#
|
|
158
|
-
# Retrieve the current transaction for this Adapter.
|
|
159
|
-
#
|
|
160
|
-
# Everything done by this Adapter is done within the context of this
|
|
161
|
-
# Transaction.
|
|
162
|
-
#
|
|
163
|
-
# @return <DataMapper::Transaction> the 'current' transaction for this Adapter.
|
|
164
|
-
#
|
|
165
|
-
# TODO: move to dm-more/dm-transaction
|
|
166
|
-
def current_transaction
|
|
167
|
-
transactions(Thread.current).last
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
#
|
|
171
|
-
# Returns whether we are within a Transaction.
|
|
172
|
-
#
|
|
173
|
-
# @return <Boolean> whether we are within a Transaction.
|
|
174
|
-
#
|
|
175
|
-
# TODO: move to dm-more/dm-transaction
|
|
176
|
-
def within_transaction?
|
|
177
|
-
!current_transaction.nil?
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
#
|
|
181
|
-
# Produces a fresh transaction primitive for this Adapter
|
|
182
|
-
#
|
|
183
|
-
# Used by DataMapper::Transaction to perform its various tasks.
|
|
184
|
-
#
|
|
185
|
-
# @return <Object> a new Object that responds to :close, :begin, :commit,
|
|
186
|
-
# :rollback, :rollback_prepared and :prepare
|
|
187
|
-
#
|
|
188
|
-
# TODO: move to dm-more/dm-transaction (if possible)
|
|
189
|
-
def transaction_primitive
|
|
190
|
-
raise NotImplementedError
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
private
|
|
194
|
-
def transactions(thread)
|
|
195
|
-
unless @transactions[thread]
|
|
196
|
-
@transactions.delete_if do |key, value|
|
|
197
|
-
!key.respond_to?(:alive?) || !key.alive?
|
|
198
|
-
end
|
|
199
|
-
@transactions[thread] = []
|
|
200
|
-
end
|
|
201
|
-
@transactions[thread]
|
|
202
|
-
end
|
|
203
|
-
|
|
204
201
|
end
|
|
205
|
-
|
|
206
|
-
include Transaction
|
|
207
202
|
end # class AbstractAdapter
|
|
203
|
+
|
|
204
|
+
const_added(:AbstractAdapter)
|
|
208
205
|
end # module Adapters
|
|
209
206
|
end # module DataMapper
|