Added a consistency check that both ids are valid and match. Fixed diff upload code where this wasn't being set.
This commit is contained in:
parent
807070f818
commit
d073d9bc75
2 changed files with 10 additions and 6 deletions
|
@ -6,7 +6,9 @@ module ConsistencyValidations
|
||||||
# needed for creates, but are currently not run :-(
|
# needed for creates, but are currently not run :-(
|
||||||
# This will throw an exception if there is an inconsistency
|
# This will throw an exception if there is an inconsistency
|
||||||
def check_consistency(old, new, user)
|
def check_consistency(old, new, user)
|
||||||
if new.version != old.version
|
if new.id != old.id or new.id.nil? or old.id.nil?
|
||||||
|
raise OSM::APIPreconditionFailedError.new("New and old IDs don't match on #{new.class.to_s}. #{new.id} != #{old.id}.")
|
||||||
|
elsif new.version != old.version
|
||||||
raise OSM::APIVersionMismatchError.new(new.id, new.class.to_s, new.version, old.version)
|
raise OSM::APIVersionMismatchError.new(new.id, new.class.to_s, new.version, old.version)
|
||||||
elsif new.changeset.nil?
|
elsif new.changeset.nil?
|
||||||
raise OSM::APIChangesetMissingError.new
|
raise OSM::APIChangesetMissingError.new
|
||||||
|
|
|
@ -156,19 +156,21 @@ class DiffReader
|
||||||
|
|
||||||
# if the ID is a placeholder then map it to the real ID
|
# if the ID is a placeholder then map it to the real ID
|
||||||
model_sym = model.to_s.downcase.to_sym
|
model_sym = model.to_s.downcase.to_sym
|
||||||
is_placeholder = ids[model_sym].include? new.id
|
client_id = new.id
|
||||||
id = is_placeholder ? ids[model_sym][new.id] : new.id
|
is_placeholder = ids[model_sym].include? client_id
|
||||||
|
id = is_placeholder ? ids[model_sym][client_id] : client_id
|
||||||
|
|
||||||
# and the old one from the database
|
# and the old one from the database
|
||||||
old = model.find(id)
|
old = model.find(id)
|
||||||
|
|
||||||
|
# translate any placeholder IDs to their true IDs.
|
||||||
new.fix_placeholders!(ids)
|
new.fix_placeholders!(ids)
|
||||||
|
new.id = id
|
||||||
|
|
||||||
old.update_from(new, @changeset.user)
|
old.update_from(new, @changeset.user)
|
||||||
|
|
||||||
xml_result = XML::Node.new model.to_s.downcase
|
xml_result = XML::Node.new model.to_s.downcase
|
||||||
# oh, the irony... the "new" element actually contains the "old" ID
|
xml_result["old_id"] = client_id.to_s
|
||||||
# a better name would have been client/server, but anyway...
|
|
||||||
xml_result["old_id"] = new.id.to_s
|
|
||||||
xml_result["new_id"] = id.to_s
|
xml_result["new_id"] = id.to_s
|
||||||
# version is updated in "old" through the update, so we must not
|
# version is updated in "old" through the update, so we must not
|
||||||
# return new.version here but old.version!
|
# return new.version here but old.version!
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue