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:
Matt Amos 2009-05-13 19:21:04 +00:00
parent 807070f818
commit d073d9bc75
2 changed files with 10 additions and 6 deletions

View file

@ -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

View file

@ -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!