- def getpoi(id) #:doc:
- n = Node.find(id)
-
- if n
- return [n.id, n.lon, n.lat, n.tags_as_hash]
- else
- return [nil, nil, nil, '']
- end
- end
-
-
- def deleteway(usertoken, way_id) #:doc:
- uid = getuserid(usertoken)
- if !uid then return -1,"You are not logged in, so the way could not be deleted." end
-
- # FIXME: would be good not to make two history entries when removing
- # two nodes from the same relation
- user = User.find(uid)
- way = Way.find(way_id)
- way.unshared_node_ids.each do |n|
- deleteitemrelations(n, 'node')
- end
-
- way.delete_with_relations_and_nodes_and_history(user)
-
- [0, way_id]
- end
-
- def createuniquenodes(way,uqn_name,nodelist) #:doc:
- # Find nodes which appear in this way but no others
- sql=<<-EOF
- CREATE TEMPORARY TABLE #{uqn_name}
- SELECT a.node_id
- FROM (SELECT DISTINCT node_id FROM current_way_nodes
- WHERE id=#{way}) a
- LEFT JOIN current_way_nodes b
- ON b.node_id=a.node_id
- AND b.id!=#{way}
- WHERE b.node_id IS NULL
- EOF
- unless nodelist.empty? then
- sql+="AND a.node_id NOT IN ("+nodelist.join(',')+")"
- end
- ActiveRecord::Base.connection.execute(sql)
+ # Delete way and all constituent nodes. Also removes from any relations.
+ # Params:
+ # * The user token
+ # * the changeset id
+ # * the id of the way to change
+ # * the version of the way that was downloaded
+ # * a hash of the id and versions of all the nodes that are in the way, if any
+ # of the nodes have been changed by someone else then, there is a problem!
+ # Returns 0 (success), unchanged way id.
+
+ def deleteway(usertoken, changeset_id, way_id, way_version, node_id_version) #:doc:
+ user = getuser(usertoken)
+ unless user then return -1,"You are not logged in, so the way could not be deleted." end
+
+ way_id = way_id.to_i
+ # Need a transaction so that if one item fails to delete, the whole delete fails.
+ Way.transaction do
+
+ # FIXME: would be good not to make two history entries when removing
+ # two nodes from the same relation
+ old_way = Way.find(way_id)
+ #old_way.unshared_node_ids.each do |n|
+ # deleteitemrelations(n, 'node')
+ #end
+ #deleteitemrelations(way_id, 'way')
+
+
+ #way.delete_with_relations_and_nodes_and_history(changeset_id.to_i)
+ old_way.unshared_node_ids.each do |node_id|
+ # delete the node
+ node = Node.find(node_id)
+ delete_node = Node.new
+ delete_node.version = node_id_version[node_id]
+ node.delete_with_history!(delete_node, user)
+ end
+ # delete the way
+ delete_way = Way.new
+ delete_way.version = way_version
+ old_way.delete_with_history!(delete_way, user)
+ end # transaction
+ [0, way_id]
+ rescue OSM::APIChangesetAlreadyClosedError => ex
+ return [-1, "The changeset #{ex.changeset.id} was closed at #{ex.changeset.closed_at}"]
+ rescue OSM::APIVersionMismatchError => ex
+ # Really need to check to see whether this is a server load issue, and the
+ # last version was in the same changeset, or belongs to the same user, then
+ # we can return something different
+ return [-3, "You have taken too long to edit, please reload the area"]
+ rescue OSM::APIAlreadyDeletedError => ex
+ return [-1, "The object has already been deleted"]
+ rescue OSM::APIError => ex
+ # Some error that we don't specifically catch
+ return [-2, "Something really bad happened :-()"]