Updated to libxml-ruby 2.0.5 and fixed code accordingly.
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.
This commit is contained in:
parent
ddc9446ed8
commit
9105a7e66d
2 changed files with 19 additions and 2 deletions
|
@ -18,7 +18,7 @@ Rails::Initializer.run do |config|
|
|||
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'
|
||||
|
|
|
@ -20,6 +20,10 @@ class DiffReader
|
|||
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")
|
||||
end
|
||||
|
||||
##
|
||||
|
@ -85,8 +89,21 @@ class DiffReader
|
|||
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
|
||||
@reader.next
|
||||
|
||||
# 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!
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue