From d073d9bc75971e790029f0b98fea99e348677d9e Mon Sep 17 00:00:00 2001 From: Matt Amos Date: Wed, 13 May 2009 19:21:04 +0000 Subject: [PATCH] Added a consistency check that both ids are valid and match. Fixed diff upload code where this wasn't being set. --- lib/consistency_validations.rb | 4 +++- lib/diff_reader.rb | 12 +++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/consistency_validations.rb b/lib/consistency_validations.rb index 4f3881542..d23ef8400 100644 --- a/lib/consistency_validations.rb +++ b/lib/consistency_validations.rb @@ -6,7 +6,9 @@ module ConsistencyValidations # needed for creates, but are currently not run :-( # This will throw an exception if there is an inconsistency 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) elsif new.changeset.nil? raise OSM::APIChangesetMissingError.new diff --git a/lib/diff_reader.rb b/lib/diff_reader.rb index be48f8b4e..0b1593158 100644 --- a/lib/diff_reader.rb +++ b/lib/diff_reader.rb @@ -156,19 +156,21 @@ class DiffReader # if the ID is a placeholder then map it to the real ID model_sym = model.to_s.downcase.to_sym - is_placeholder = ids[model_sym].include? new.id - id = is_placeholder ? ids[model_sym][new.id] : new.id + client_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 old = model.find(id) + # translate any placeholder IDs to their true IDs. new.fix_placeholders!(ids) + new.id = id + old.update_from(new, @changeset.user) xml_result = XML::Node.new model.to_s.downcase - # oh, the irony... the "new" element actually contains the "old" ID - # a better name would have been client/server, but anyway... - xml_result["old_id"] = new.id.to_s + xml_result["old_id"] = client_id.to_s xml_result["new_id"] = id.to_s # version is updated in "old" through the update, so we must not # return new.version here but old.version! -- 2.43.2