I've tested this through the unit tests and by hitting it with
bulk_upload.py and neither fail or cause the server to crash or
go into an infinite loop. Both of these things happened randomly
with 1.1.3/4 due to an apparent early deregistration of the
expanded nodes.
unless STATUS == :database_offline
config.gem 'composite_primary_keys', :version => '2.2.2'
end
unless STATUS == :database_offline
config.gem 'composite_primary_keys', :version => '2.2.2'
end
- config.gem 'libxml-ruby', :version => '~> 1.1.1', :lib => 'libxml'
+ config.gem 'libxml-ruby', :version => '>= 2.0.5', :lib => 'libxml'
config.gem 'rmagick', :lib => 'RMagick'
config.gem 'oauth', :version => '>= 0.4.3'
config.gem 'oauth-plugin', :version => '0.3.14'
config.gem 'rmagick', :lib => 'RMagick'
config.gem 'oauth', :version => '>= 0.4.3'
config.gem 'oauth-plugin', :version => '0.3.14'
def initialize(data, changeset)
@reader = XML::Reader.string(data)
@changeset = changeset
def initialize(data, changeset)
@reader = XML::Reader.string(data)
@changeset = changeset
+ # document that's (re-)used to handle elements expanded out of the
+ # diff processing stream.
+ @doc = XML::Document.new
+ @doc.root = XML::Node.new("osm")
model = MODELS[model_name]
raise OSM::APIBadUserInput.new("Unexpected element type #{model_name}, " +
"expected node, way or relation.") if model.nil?
model = MODELS[model_name]
raise OSM::APIBadUserInput.new("Unexpected element type #{model_name}, " +
"expected node, way or relation.") if model.nil?
- yield model, @reader.expand
+ # new in libxml-ruby >= 2, expand returns an element not associated
+ # with a document. this means that there's no encoding parameter,
+ # which means basically nothing works.
+ expanded = @reader.expand
+
+ # create a new, empty document to hold this expanded node
+ new_node = @doc.import(expanded)
+ @doc.root << new_node
+
+ yield model, new_node
+
+ # remove element from doc - it will be garbage collected and the
+ # rest of the document is re-used in the next iteration.
+ @doc.root.child.remove!