X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/568c05c548773a222e6204e091342db6e76b62b3..6c66507427961a22a8f282b5b2f4ab7fda1dad6f:/app/controllers/amf_controller.rb diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index b4cbaeaf0..d729fdd45 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -41,7 +41,7 @@ class AmfController < ApplicationController include MapBoundary session :off - before_filter :check_write_availability + before_filter :check_api_writable # Main AMF handlers: process the raw AMF string (using AMF library) and # calls each action (private method) accordingly. @@ -55,7 +55,7 @@ class AmfController < ApplicationController # Parse request - headers=AMF.getint(req) # Read number of headers + headers=AMF.getint(req) # Read number of headers headers.times do # Read each header name=AMF.getstring(req) # | @@ -76,7 +76,8 @@ class AmfController < ApplicationController when 'getpresets'; results[index]=AMF.putdata(index,getpresets()) when 'whichways'; results[index]=AMF.putdata(index,whichways(*args)) when 'whichways_deleted'; results[index]=AMF.putdata(index,whichways_deleted(*args)) - when 'getway'; results[index]=AMF.putdata(index,getway(args[0].to_i)) + when 'getway'; r=AMF.putdata(index,getway(args[0].to_i)) + results[index]=r when 'getrelation'; results[index]=AMF.putdata(index,getrelation(args[0].to_i)) when 'getway_old'; results[index]=AMF.putdata(index,getway_old(args[0].to_i,args[1])) when 'getway_history'; results[index]=AMF.putdata(index,getway_history(args[0].to_i)) @@ -157,7 +158,7 @@ class AmfController < ApplicationController cs.tags = cstags cs.user_id = user.id # smsm1 doesn't like the next two lines and thinks they need to be abstracted to the model more/better - cs.created_at = Time.now + cs.created_at = Time.now.getutc cs.closed_at = cs.created_at + Changeset::IDLE_TIMEOUT cs.save_with_tags! return [0,cs.id] @@ -276,7 +277,7 @@ class AmfController < ApplicationController [wayid, points, tags, version] end - + # Get an old version of a way, and all constituent nodes. # # For undelete (version<0), always uses the most recent version of each node, @@ -451,7 +452,8 @@ class AmfController < ApplicationController # Returns # 0. 0 (success), # 1. original relation id (unchanged), - # 2. new relation id. + # 2. new relation id, + # 3. version. def putrelation(renumberednodes, renumberedways, usertoken, changeset_id, version, relid, tags, members, visible) #:doc: user = getuser(usertoken) @@ -475,8 +477,8 @@ class AmfController < ApplicationController members.each do |m| mid = m[1].to_i if mid < 0 - mid = renumberednodes[mid] if m[0] == 'node' - mid = renumberedways[mid] if m[0] == 'way' + mid = renumberednodes[mid] if m[0] == 'Node' + mid = renumberedways[mid] if m[0] == 'Way' end if mid typedmembers << [m[0], mid, m[2]] @@ -490,8 +492,7 @@ class AmfController < ApplicationController new_relation.changeset_id = changeset_id new_relation.version = version - - if id <= 0 + if relid <= 0 # We're creating the node new_relation.create_with_history(user) elsif visible @@ -503,10 +504,10 @@ class AmfController < ApplicationController end end # transaction - if id <= 0 + if relid <= 0 return [0, relid, new_relation.id, new_relation.version] else - return [0, relid, relation.id, relation.version] + return [0, relid, relid, relation.version] end rescue OSM::APIChangesetAlreadyClosedError => ex return [-1, "The changeset #{ex.changeset.id} was closed at #{ex.changeset.closed_at}."] @@ -519,7 +520,7 @@ class AmfController < ApplicationController return [-1, "The relation has already been deleted."] rescue OSM::APIError => ex # Some error that we don't specifically catch - return [-2, "Something really bad happened :-( ."] + return [-2, "An unusual error happened (in 'putrelation' #{relid})."] end # Save a way to the database, including all nodes. Any nodes in the previous @@ -620,7 +621,7 @@ class AmfController < ApplicationController uniques=uniques-pointlist uniques.each do |n| node = Node.find(n) - deleteitemrelations(user, changeset_id, id, 'node', node.version) + deleteitemrelations(user, changeset_id, id, 'Node', node.version) new_node = Node.new new_node.changeset_id = changeset_id new_node.version = node.version @@ -643,7 +644,7 @@ class AmfController < ApplicationController return [-1, "The point has already been deleted."] rescue OSM::APIError => ex # Some error that we don't specifically catch - return [-2, "Something really bad happened :-(."] + return [-2, "An unusual error happened (in 'putway' #{originalway})."] end # Save POI to the database. @@ -706,7 +707,7 @@ class AmfController < ApplicationController return [-1, "The point has already been deleted"] rescue OSM::APIError => ex # Some error that we don't specifically catch - return [-2, "Something really bad happened :-()"] + return [-2, "An unusual error happened (in 'putpoi' #{id})."] end # Read POI from database @@ -748,12 +749,13 @@ class AmfController < ApplicationController # delete the way old_way = Way.find(way_id) + u = old_way.unshared_node_ids delete_way = Way.new delete_way.version = way_version delete_way.changeset_id = changeset_id old_way.delete_with_history!(delete_way, user) - old_way.unshared_node_ids.each do |node_id| + u.each do |node_id| # delete the node node = Node.find(node_id) delete_node = Node.new @@ -763,7 +765,7 @@ class AmfController < ApplicationController else # in case the node wasn't passed (i.e. if it was previously removed # from the way in Potlatch) - deleteitemrelations(user, changeset_id, node_id, 'node', node.version) + deleteitemrelations(user, changeset_id, node_id, 'Node', node.version) delete_node.version = node.version end node.delete_with_history!(delete_node, user) @@ -781,7 +783,7 @@ class AmfController < ApplicationController return [-1, "The way has already been deleted."] rescue OSM::APIError => ex # Some error that we don't specifically catch - return [-2, "Something really bad happened :-( ."] + return [-2, "An unusual error happened (in 'deleteway' #{way_id})."] end @@ -795,7 +797,7 @@ class AmfController < ApplicationController def deleteitemrelations(user, changeset_id, objid, type, version) #:doc: relations = RelationMember.find(:all, - :conditions => ['member_type = ? and member_id = ?', type, objid], + :conditions => ['member_type = ? and member_id = ?', type.classify, objid], :include => :relation).collect { |rm| rm.relation }.uniq relations.each do |rel| @@ -883,7 +885,7 @@ class AmfController < ApplicationController SELECT DISTINCT cr.id AS relid,cr.version AS version FROM current_relations cr INNER JOIN current_relation_members crm ON crm.id=cr.id - INNER JOIN current_nodes cn ON crm.member_id=cn.id AND crm.member_type='node' + INNER JOIN current_nodes cn ON crm.member_id=cn.id AND crm.member_type='Node' WHERE #{OSM.sql_for_area(ymin, xmin, ymax, xmax, "cn.")} EOF unless way_ids.empty? @@ -892,17 +894,17 @@ class AmfController < ApplicationController SELECT DISTINCT cr.id AS relid,cr.version AS version FROM current_relations cr INNER JOIN current_relation_members crm ON crm.id=cr.id - WHERE crm.member_type='way' + WHERE crm.member_type='Way' AND crm.member_id IN (#{way_ids.join(',')}) EOF end - return ActiveRecord::Base.connection.select_all(sql).collect { |a| [a['relid'].to_i,a['version'].to_i] } + ActiveRecord::Base.connection.select_all(sql).collect { |a| [a['relid'].to_i,a['version'].to_i] } end def sql_get_nodes_in_way(wayid) points=[] sql=<<-EOF - SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lon,current_nodes.id + SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lon,current_nodes.id,current_nodes.version FROM current_way_nodes,current_nodes WHERE current_way_nodes.id=#{wayid.to_i} AND current_way_nodes.node_id=current_nodes.id @@ -915,7 +917,7 @@ class AmfController < ApplicationController nodetags[n['k']]=n['v'] end nodetags.delete('created_by') - points << [row['lon'].to_f,row['lat'].to_f,row['id'].to_i,nodetags] + points << [row['lon'].to_f,row['lat'].to_f,row['id'].to_i,nodetags,row['version'].to_i] end points end