datamapper 0.3.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. data/History.txt +0 -0
  2. data/Manifest.txt +5 -0
  3. data/README.txt +11 -0
  4. data/Rakefile +70 -0
  5. data/lib/datamapper.rb +8 -0
  6. metadata +152 -319
  7. data/CHANGELOG +0 -145
  8. data/FAQ +0 -96
  9. data/MIT-LICENSE +0 -22
  10. data/QUICKLINKS +0 -12
  11. data/README +0 -105
  12. data/environment.rb +0 -62
  13. data/example.rb +0 -156
  14. data/lib/data_mapper.rb +0 -88
  15. data/lib/data_mapper/adapters/abstract_adapter.rb +0 -43
  16. data/lib/data_mapper/adapters/data_object_adapter.rb +0 -480
  17. data/lib/data_mapper/adapters/mysql_adapter.rb +0 -72
  18. data/lib/data_mapper/adapters/postgresql_adapter.rb +0 -258
  19. data/lib/data_mapper/adapters/sql/coersion.rb +0 -134
  20. data/lib/data_mapper/adapters/sql/commands/load_command.rb +0 -545
  21. data/lib/data_mapper/adapters/sql/mappings/associations_set.rb +0 -34
  22. data/lib/data_mapper/adapters/sql/mappings/column.rb +0 -279
  23. data/lib/data_mapper/adapters/sql/mappings/conditions.rb +0 -172
  24. data/lib/data_mapper/adapters/sql/mappings/schema.rb +0 -60
  25. data/lib/data_mapper/adapters/sql/mappings/table.rb +0 -459
  26. data/lib/data_mapper/adapters/sql/quoting.rb +0 -24
  27. data/lib/data_mapper/adapters/sqlite3_adapter.rb +0 -159
  28. data/lib/data_mapper/associations.rb +0 -106
  29. data/lib/data_mapper/associations/belongs_to_association.rb +0 -160
  30. data/lib/data_mapper/associations/has_and_belongs_to_many_association.rb +0 -437
  31. data/lib/data_mapper/associations/has_many_association.rb +0 -283
  32. data/lib/data_mapper/associations/has_n_association.rb +0 -143
  33. data/lib/data_mapper/associations/reference.rb +0 -47
  34. data/lib/data_mapper/attributes.rb +0 -73
  35. data/lib/data_mapper/auto_migrations.rb +0 -36
  36. data/lib/data_mapper/base.rb +0 -17
  37. data/lib/data_mapper/callbacks.rb +0 -107
  38. data/lib/data_mapper/context.rb +0 -112
  39. data/lib/data_mapper/database.rb +0 -234
  40. data/lib/data_mapper/dependency_queue.rb +0 -28
  41. data/lib/data_mapper/embedded_value.rb +0 -145
  42. data/lib/data_mapper/identity_map.rb +0 -47
  43. data/lib/data_mapper/is/tree.rb +0 -121
  44. data/lib/data_mapper/migration.rb +0 -155
  45. data/lib/data_mapper/persistence.rb +0 -852
  46. data/lib/data_mapper/property.rb +0 -310
  47. data/lib/data_mapper/query.rb +0 -164
  48. data/lib/data_mapper/support/blank.rb +0 -35
  49. data/lib/data_mapper/support/connection_pool.rb +0 -117
  50. data/lib/data_mapper/support/enumerable.rb +0 -35
  51. data/lib/data_mapper/support/errors.rb +0 -16
  52. data/lib/data_mapper/support/inflector.rb +0 -265
  53. data/lib/data_mapper/support/object.rb +0 -54
  54. data/lib/data_mapper/support/serialization.rb +0 -96
  55. data/lib/data_mapper/support/silence.rb +0 -10
  56. data/lib/data_mapper/support/string.rb +0 -72
  57. data/lib/data_mapper/support/struct.rb +0 -7
  58. data/lib/data_mapper/support/symbol.rb +0 -82
  59. data/lib/data_mapper/support/typed_set.rb +0 -65
  60. data/lib/data_mapper/types/base.rb +0 -44
  61. data/lib/data_mapper/types/string.rb +0 -34
  62. data/lib/data_mapper/validatable_extensions/errors.rb +0 -12
  63. data/lib/data_mapper/validatable_extensions/macros.rb +0 -7
  64. data/lib/data_mapper/validatable_extensions/validatable_instance_methods.rb +0 -62
  65. data/lib/data_mapper/validatable_extensions/validation_base.rb +0 -18
  66. data/lib/data_mapper/validatable_extensions/validations/formats/email.rb +0 -43
  67. data/lib/data_mapper/validatable_extensions/validations/validates_acceptance_of.rb +0 -7
  68. data/lib/data_mapper/validatable_extensions/validations/validates_confirmation_of.rb +0 -7
  69. data/lib/data_mapper/validatable_extensions/validations/validates_each.rb +0 -7
  70. data/lib/data_mapper/validatable_extensions/validations/validates_format_of.rb +0 -28
  71. data/lib/data_mapper/validatable_extensions/validations/validates_length_of.rb +0 -15
  72. data/lib/data_mapper/validatable_extensions/validations/validates_numericality_of.rb +0 -7
  73. data/lib/data_mapper/validatable_extensions/validations/validates_presence_of.rb +0 -7
  74. data/lib/data_mapper/validatable_extensions/validations/validates_true_for.rb +0 -7
  75. data/lib/data_mapper/validatable_extensions/validations/validates_uniqueness_of.rb +0 -40
  76. data/lib/data_mapper/validations.rb +0 -20
  77. data/lib/data_mapper/validations/number_validator.rb +0 -40
  78. data/lib/data_mapper/validations/string_validator.rb +0 -20
  79. data/lib/data_mapper/validations/validator.rb +0 -13
  80. data/performance.rb +0 -307
  81. data/plugins/can_has_sphinx/LICENSE +0 -23
  82. data/plugins/can_has_sphinx/README +0 -4
  83. data/plugins/can_has_sphinx/REVISION +0 -1
  84. data/plugins/can_has_sphinx/Rakefile +0 -22
  85. data/plugins/can_has_sphinx/init.rb +0 -1
  86. data/plugins/can_has_sphinx/install.rb +0 -1
  87. data/plugins/can_has_sphinx/lib/acts_as_sphinx.rb +0 -123
  88. data/plugins/can_has_sphinx/lib/sphinx.rb +0 -460
  89. data/plugins/can_has_sphinx/scripts/sphinx.sh +0 -47
  90. data/plugins/can_has_sphinx/tasks/acts_as_sphinx_tasks.rake +0 -41
  91. data/profile_data_mapper.rb +0 -40
  92. data/rakefile.rb +0 -159
  93. data/spec/acts_as_tree_spec.rb +0 -67
  94. data/spec/adapters/data_object_adapter_spec.rb +0 -31
  95. data/spec/associations/belongs_to_association_spec.rb +0 -98
  96. data/spec/associations/has_and_belongs_to_many_association_spec.rb +0 -377
  97. data/spec/associations/has_many_association_spec.rb +0 -337
  98. data/spec/attributes_spec.rb +0 -52
  99. data/spec/auto_migrations_spec.rb +0 -101
  100. data/spec/callbacks_spec.rb +0 -186
  101. data/spec/can_has_sphinx.rb +0 -5
  102. data/spec/coersion_spec.rb +0 -41
  103. data/spec/column_spec.rb +0 -114
  104. data/spec/count_command_spec.rb +0 -45
  105. data/spec/database_spec.rb +0 -18
  106. data/spec/dataobjects_spec.rb +0 -27
  107. data/spec/delete_command_spec.rb +0 -11
  108. data/spec/dependency_spec.rb +0 -29
  109. data/spec/embedded_value_spec.rb +0 -161
  110. data/spec/fixtures/animals.yaml +0 -33
  111. data/spec/fixtures/animals_exhibits.yaml +0 -2
  112. data/spec/fixtures/careers.yaml +0 -5
  113. data/spec/fixtures/comments.yaml +0 -1
  114. data/spec/fixtures/exhibits.yaml +0 -90
  115. data/spec/fixtures/fruit.yaml +0 -6
  116. data/spec/fixtures/people.yaml +0 -37
  117. data/spec/fixtures/posts.yaml +0 -3
  118. data/spec/fixtures/projects.yaml +0 -13
  119. data/spec/fixtures/sections.yaml +0 -5
  120. data/spec/fixtures/serializers.yaml +0 -6
  121. data/spec/fixtures/tasks.yaml +0 -6
  122. data/spec/fixtures/tasks_tasks.yaml +0 -2
  123. data/spec/fixtures/tomatoes.yaml +0 -1
  124. data/spec/fixtures/users.yaml +0 -1
  125. data/spec/fixtures/zoos.yaml +0 -24
  126. data/spec/is_a_tree_spec.rb +0 -149
  127. data/spec/legacy_spec.rb +0 -16
  128. data/spec/load_command_spec.rb +0 -322
  129. data/spec/magic_columns_spec.rb +0 -26
  130. data/spec/migration_spec.rb +0 -267
  131. data/spec/mock_adapter.rb +0 -20
  132. data/spec/models/animal.rb +0 -12
  133. data/spec/models/candidate.rb +0 -8
  134. data/spec/models/career.rb +0 -7
  135. data/spec/models/chain.rb +0 -8
  136. data/spec/models/comment.rb +0 -6
  137. data/spec/models/exhibit.rb +0 -14
  138. data/spec/models/fence.rb +0 -7
  139. data/spec/models/fruit.rb +0 -8
  140. data/spec/models/job.rb +0 -8
  141. data/spec/models/person.rb +0 -30
  142. data/spec/models/post.rb +0 -14
  143. data/spec/models/project.rb +0 -41
  144. data/spec/models/sales_person.rb +0 -5
  145. data/spec/models/section.rb +0 -8
  146. data/spec/models/serializer.rb +0 -5
  147. data/spec/models/task.rb +0 -9
  148. data/spec/models/tomato.rb +0 -27
  149. data/spec/models/user.rb +0 -12
  150. data/spec/models/zoo.rb +0 -13
  151. data/spec/natural_key_spec.rb +0 -36
  152. data/spec/paranoia_spec.rb +0 -38
  153. data/spec/persistence_spec.rb +0 -479
  154. data/spec/postgres_spec.rb +0 -96
  155. data/spec/property_spec.rb +0 -151
  156. data/spec/query_spec.rb +0 -77
  157. data/spec/save_command_spec.rb +0 -94
  158. data/spec/schema_spec.rb +0 -8
  159. data/spec/serialize_spec.rb +0 -19
  160. data/spec/single_table_inheritance_spec.rb +0 -43
  161. data/spec/spec_helper.rb +0 -45
  162. data/spec/support/blank_spec.rb +0 -8
  163. data/spec/support/inflector_spec.rb +0 -41
  164. data/spec/support/object_spec.rb +0 -9
  165. data/spec/support/serialization_spec.rb +0 -61
  166. data/spec/support/silence_spec.rb +0 -15
  167. data/spec/support/string_spec.rb +0 -7
  168. data/spec/support/struct_spec.rb +0 -12
  169. data/spec/support/typed_set_spec.rb +0 -66
  170. data/spec/symbolic_operators_spec.rb +0 -27
  171. data/spec/table_spec.rb +0 -79
  172. data/spec/types/string.rb +0 -81
  173. data/spec/validates_confirmation_of_spec.rb +0 -55
  174. data/spec/validates_format_of_spec.rb +0 -78
  175. data/spec/validates_length_of_spec.rb +0 -117
  176. data/spec/validates_uniqueness_of_spec.rb +0 -92
  177. data/spec/validations/number_validator.rb +0 -59
  178. data/spec/validations/string_validator.rb +0 -14
  179. data/spec/validations_spec.rb +0 -141
  180. data/tasks/fixtures.rb +0 -53
@@ -1,234 +0,0 @@
1
- require 'logger'
2
- require 'data_mapper/context'
3
- require 'data_mapper/adapters/abstract_adapter'
4
-
5
- # Delegates to DataMapper::database.
6
- # Will not overwrite if a method of the same name is pre-defined.
7
- def database(name = :default, &block)
8
- DataMapper::database(name, &block)
9
- end unless methods.include?(:database)
10
-
11
- module DataMapper
12
-
13
- # ===Block Syntax:
14
- # Pushes the named database onto the context-stack,
15
- # yields a new session, and pops the context-stack.
16
- #
17
- # results = DataMapper.database(:second_database) do |current_context|
18
- # ...
19
- # end
20
- #
21
- # ===Non-Block Syntax:
22
- # Returns the current session, or if there is none,
23
- # a new Session.
24
- #
25
- # current_database = DataMapper.database
26
- def self.database(name = :default) # :yields: current_context
27
- unless block_given?
28
- Database.context.last || Context.new(Database[name].adapter)
29
- else
30
- begin
31
- Database.context.push(Context.new(Database[name].adapter))
32
- return yield(Database.context.last)
33
- ensure
34
- Database.context.pop
35
- end
36
- end
37
- end
38
-
39
- class DatabaseError < StandardError
40
- attr_accessor :options
41
- end
42
-
43
- # The Database class allows us to setup a default database for use throughout our applications
44
- # or allows us to setup a collection of databases to use.
45
- #
46
- # === Example
47
- # ==== To setup a default database
48
- # DataMapper::Database.setup({
49
- # :adapter => 'mysql'
50
- # :host => 'localhost'
51
- # :username => 'root'
52
- # :password => 'R00tPaswooooord'
53
- # :database => 'selecta_development'
54
- # })
55
- #
56
- # ==== To setup a named database
57
- # DataMapper::Database.setup(:second_database, {
58
- # :adapter => 'postgresql'
59
- # :host => 'localhost'
60
- # :username => 'second_user'
61
- # :password => 'second_password'
62
- # :database => 'second_database'
63
- # })
64
- #
65
- #
66
- # ==== Working with multiple databases (see #DataMapper::database)
67
- # DataMapper.database(:second_database) do
68
- # ...
69
- # end
70
- #
71
- # DataMapper.database(:default) do
72
- # ...
73
- # end
74
- #
75
- # or even...
76
- #
77
- # #The below variables still hold on to their database sessions.
78
- # #So no confusion happens when passing variables around scopes.
79
- #
80
- # DataMapper.database(:second_database) do
81
- #
82
- # animal = Animal.first
83
- #
84
- # DataMapper.database(:default) do
85
- # Animal.new(animal).save
86
- # end # :default database
87
- #
88
- # end # :second_database
89
- class Database
90
-
91
- @databases = {}
92
-
93
- # Allows you to access any of the named databases you have already setup.
94
- #
95
- # default_db = DataMapper::Database[:default]
96
- # second_db = DataMapper::Database[:second_database]
97
- def self.[](name)
98
- @databases[name]
99
- end
100
-
101
- # Returns the array of Database sessions currently being used
102
- #
103
- # This is what gives us thread safety, boys and girls
104
- def self.context
105
- Thread::current[:database_contexts] || Thread::current[:database_contexts] = []
106
- end
107
-
108
- # Setup creates a database and sets all of your properties for that database.
109
- # Setup looks for either a hash of options passed in to the database or a symbolized name
110
- # for your database, as well as it's hash of parameters
111
- #
112
- # If no options are passed, an ArgumentException will be raised.
113
- #
114
- # DataMapper::Database.setup(name = :default, options_hash)
115
- #
116
- # DataMapper::Database.setup({
117
- # :adapter => 'mysql'
118
- # :host => 'localhost'
119
- # :username => 'root'
120
- # :password => 'R00tPaswooooord'
121
- # :database => 'selecta_development'
122
- # })
123
- #
124
- #
125
- # DataMapper::Database.setup(:named_database, {
126
- # :adapter => 'mysql'
127
- # :host => 'localhost'
128
- # :username => 'root'
129
- # :password => 'R00tPaswooooord'
130
- # :database => 'selecta_development'
131
- # })
132
-
133
- def self.setup(*args)
134
-
135
- name, options = nil
136
-
137
- if (args.nil?) || (args[1].nil? && args[0].class != Hash)
138
- raise ArgumentError.new('Database cannot be setup without at least an options hash.')
139
- end
140
-
141
- if args.size == 1
142
- name, options = :default, args[0]
143
- elsif args.size == 2
144
- name, options = args[0], args[1]
145
- end
146
-
147
- current = self.new(name)
148
-
149
- current.single_threaded = false if options[:single_threaded] == false
150
-
151
- options.each_pair do |k,v|
152
- current.send("#{k}=", v)
153
- end
154
-
155
- @databases[name] = current
156
- end
157
-
158
- # Creates a new database object with the name you specify, and a default set of options.
159
- #
160
- # The default options are as follows:
161
- # { :host => 'localhost', :database => nil, :port => nil, :username => 'root', :password => '', :adapter = nil }
162
- def initialize(name)
163
- @name = name
164
-
165
- @adapter = nil
166
- @host = 'localhost'
167
- @database = nil
168
- @port = nil
169
- @schema_search_path = nil
170
- @username = 'root'
171
- @password = ''
172
- @socket = nil
173
-
174
- @log_level = Logger::WARN
175
- @log_stream = nil
176
- end
177
-
178
- attr_reader :name, :adapter, :log_stream
179
-
180
- attr_accessor :host, :database, :port, :schema_search_path, :username, :password, :log_level, :index_path, :socket
181
-
182
- def log_stream=(val)
183
- @log_stream = (val.is_a?(String) && val =~ /STDOUT/ ? STDOUT : val)
184
- end
185
-
186
- # Allows us to set the adapter for this database object. It can only be set once, and expects two types of values.
187
- #
188
- # You may pass in either a class inheriting from DataMapper::Adapters::AbstractAdapter
189
- # or pass in a string indicating the type of adapter you would like to use.
190
- #
191
- # To create your own adapters, create a file in data_mapper/adapters/new_adapter.rb that inherits from AbstractAdapter
192
- #
193
- # database.adapter=("postgresql")
194
- def adapter=(value)
195
- if @adapter
196
- raise ArgumentError.new('The adapter is readonly after being set')
197
- end
198
-
199
- if value.is_a?(DataMapper::Adapters::AbstractAdapter)
200
- @adapter = value
201
- elsif value.is_a?(Class)
202
- @adapter = value.new(self)
203
- else
204
- begin
205
- require "data_mapper/adapters/#{Inflector.underscore(value)}_adapter"
206
- rescue LoadError
207
- require "#{Inflector.underscore(value)}_adapter"
208
- end
209
- adapter_class = Adapters::const_get(Inflector.classify(value) + "Adapter")
210
-
211
- @adapter = adapter_class.new(self)
212
- end
213
- end
214
-
215
- # Default Logger from Ruby's logger.rb
216
- def logger
217
- @logger = create_logger
218
-
219
- class << self
220
- attr_reader :logger
221
- end
222
-
223
- return @logger
224
- end
225
-
226
- def create_logger
227
- x = Logger.new(@log_stream, File::WRONLY | File::APPEND | File::CREAT)
228
- x.level = @log_level
229
- at_exit { x.close }
230
- return x
231
- end
232
- end
233
-
234
- end
@@ -1,28 +0,0 @@
1
- module DataMapper
2
- class DependencyQueue
3
-
4
- def initialize
5
- @dependencies = Hash.new { |h,k| h[k] = [] }
6
- end
7
-
8
- def add(class_name, &b)
9
- @dependencies[class_name] << b
10
- resolve!
11
- end
12
-
13
- def resolve!
14
- @dependencies.each_pair do |class_name, callbacks|
15
- if Object.const_defined?(class_name)
16
- klass = Object.const_get(class_name)
17
-
18
- callbacks.each do |b|
19
- b.call(klass)
20
- end
21
-
22
- callbacks.clear
23
- end
24
- end
25
- end
26
-
27
- end # class DependencyQueue
28
- end # module DataMapper
@@ -1,145 +0,0 @@
1
- module DataMapper
2
-
3
- # == EmbeddedValue
4
- # As an alternative to an extraneous has_one association, EmbeddedValue offers a means
5
- # to serialize component objects to a table without having to define an entirely new model.
6
- #
7
- # Example:
8
- #
9
- # class Person < DataMapper::Base
10
- #
11
- # property :name, :string
12
- # property :occupation, :string
13
- #
14
- # embed :address, :prefix => true do
15
- # property :street, :string
16
- # property :city, :string
17
- # property :state, :string, :size => 2
18
- # property :zip_code, :string, :size => 10
19
- #
20
- # def city_state_zip_code
21
- # "#{city}, #{state} #{zip_code}"
22
- # end
23
- #
24
- # end
25
- # end
26
- #
27
- # Columns for the Address model will appear in the Person table. Passing
28
- # <tt>:prefix => true</tt> will prefix the column name with the parent table's name.
29
- # The default behavior is to use the columns as they are defined. Using the above
30
- # example, the database table structure will become:
31
- #
32
- # Column Datatype, Options
33
- # ===============================================================
34
- # name :string
35
- # occupation :string
36
- # address_street :string
37
- # address_city :string
38
- # address_state :string, :size => 2
39
- # address_zip_code :string, :size => 10
40
- #
41
- # EmbeddedValue's become instance methods off of an instance of the parent
42
- # class and return a sub-class of the parent class.
43
- #
44
- # bob = Person.first(:name => 'Bob')
45
- # bob.address # => #<Person::Address:0x1a492b8>
46
- # bob.address.city # => "Pittsburgh"
47
- # bob.address.city_state_zip_code # => "Pitsburgh, PA 90210"
48
-
49
- class EmbeddedValue
50
- EMBEDDED_PROPERTIES = []
51
-
52
- def initialize(instance)
53
- @instance = instance
54
- @container_prefix = ''
55
- end
56
-
57
- def self.inherited(base)
58
- base.const_set('EMBEDDED_PROPERTIES', [])
59
- end
60
-
61
- # add an embedded property. For more information about how to define properties, visit Property.
62
- def self.property(name, type, options = {})
63
- # set lazy option on the mapping if defined in the embed block
64
- options[:lazy] ||= @container_lazy
65
-
66
- options[:reader] ||= options[:accessor] || @container_reader_visibility
67
- options[:writer] ||= options[:accessor] || @container_writer_visibility
68
-
69
- property_name = @container_prefix ? @container_prefix + name.to_s : name
70
-
71
- property = containing_class.property(property_name, type, options)
72
- define_property_getter(name, property)
73
- define_property_setter(name, property)
74
- end
75
-
76
- # define embedded property getters
77
- def self.define_property_getter(name, property) # :nodoc:
78
-
79
- # add the method on the embedded class
80
- class_eval <<-EOS
81
- #{property.reader_visibility.to_s}
82
- def #{name}
83
- #{"@instance.lazy_load!("+ property.name.inspect + ")" if property.lazy?}
84
- @instance.instance_variable_get(#{property.instance_variable_name.inspect})
85
- end
86
- EOS
87
-
88
- # add a shortcut boolean? method if applicable (ex: activated?)
89
- if property.type == :boolean
90
- class_eval("alias #{property.name}? #{property.name}")
91
- end
92
- end
93
-
94
- # define embedded property setters
95
- def self.define_property_setter(name, property) # :nodoc:
96
-
97
- # add the method on the embedded class
98
- class_eval <<-EOS
99
- #{property.writer_visibility.to_s}
100
- def #{name.to_s.sub(/\?$/, '')}=(value)
101
- @instance.instance_variable_set(#{property.instance_variable_name.inspect}, value)
102
- end
103
- EOS
104
- end
105
-
106
- # returns the class in which the EmbeddedValue is declared
107
- def self.containing_class
108
- @containing_class || @containing_class = begin
109
- tree = name.split('::')
110
- tree.pop
111
- tree.inject(Object) { |klass, current| klass.const_get(current) }
112
- end
113
- end
114
-
115
- def self.define(container, name, options, &block)
116
- embedded_class, embedded_class_name, accessor_name = nil
117
-
118
- accessor_name = name.to_s
119
- embedded_class_name = Inflector.camelize(accessor_name)
120
- embedded_class = Class.new(EmbeddedValue)
121
- container.const_set(embedded_class_name, embedded_class) unless container.const_defined?(embedded_class_name)
122
-
123
- if options[:prefix]
124
- container_prefix = options[:prefix].kind_of?(String) ? options[:prefix] : "#{accessor_name}_"
125
- embedded_class.instance_variable_set('@container_prefix', container_prefix)
126
- end
127
-
128
- embedded_class.instance_variable_set('@containing_class', container)
129
-
130
- embedded_class.instance_variable_set('@container_lazy', !!options[:lazy])
131
- embedded_class.instance_variable_set('@container_reader_visibility', options[:reader] || options[:accessor] || :public)
132
- embedded_class.instance_variable_set('@container_writer_visibility', options[:writer] || options[:accessor] || :public)
133
-
134
- embedded_class.class_eval(&block) if block_given?
135
-
136
- container.class_eval <<-EOS
137
- def #{accessor_name}
138
- #{embedded_class_name}.new(self)
139
- end
140
- EOS
141
- end
142
-
143
- end
144
-
145
- end # module DataMapper
@@ -1,47 +0,0 @@
1
- module DataMapper
2
-
3
- # Tracks objects to help ensure that each object gets loaded only once.
4
- # See: http://www.martinfowler.com/eaaCatalog/identityMap.html
5
- class IdentityMap
6
-
7
- def initialize
8
- # WeakHash is much more expensive, and not necessary if the IdentityMap is tied to Session instead of Database.
9
- # @cache = Hash.new { |h,k| h[k] = Support::WeakHash.new }
10
- @cache = Hash.new { |h,k| h[k] = Hash.new }
11
- end
12
-
13
- # Pass a Class and a key, and to retrieve an instance.
14
- # If the instance isn't found, nil is returned.
15
- def get(klass, key)
16
- @cache[mapped_class(klass)][key]
17
- end
18
-
19
- # Pass an instance to add it to the IdentityMap.
20
- # The instance must have an assigned key.
21
- def set(instance)
22
- instance_key = instance.key
23
- raise "Can't store an instance with a nil key in the IdentityMap" if instance_key.nil?
24
-
25
- @cache[mapped_class(instance.class)][instance_key] = instance
26
- end
27
-
28
- # Remove an instance from the IdentityMap.
29
- def delete(instance)
30
- @cache[mapped_class(instance.class)].delete(instance.key)
31
- end
32
-
33
- # Clears a particular set of classes from the IdentityMap.
34
- def clear!(klass)
35
- @cache.delete(klass)
36
- end
37
-
38
- private
39
- def mapped_class(klass)
40
- unless klass.superclass.respond_to?(:persistent?)
41
- klass
42
- else
43
- mapped_class(klass.superclass)
44
- end
45
- end
46
- end
47
- end