X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/19965b2a5d89fdec9a6bb05f80b2b63dc632f267..5fd514fee3abd51af1dfeb0dfef46d727db8e036:/app/controllers/amf_controller.rb diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 095ae4786..6aa64f6a7 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -29,6 +29,7 @@ class AmfController < ApplicationController # (cf http://www.ruby-forum.com/topic/122163) req.read(2) # Skip version indicator and client ID results={} # Results of each body + renumberednodes={} # Shared across repeated putways # ------------- # Parse request @@ -56,7 +57,9 @@ class AmfController < ApplicationController when 'getway'; results[index]=putdata(index,getway(args)) when 'getway_old'; results[index]=putdata(index,getway_old(args)) when 'getway_history'; results[index]=putdata(index,getway_history(args)) - when 'putway'; results[index]=putdata(index,putway(args)) + when 'putway'; r=putway(args,renumberednodes) + renumberednodes=r[3] + results[index]=putdata(index,r) when 'deleteway'; results[index]=putdata(index,deleteway(args)) when 'putpoi'; results[index]=putdata(index,putpoi(args)) when 'getpoi'; results[index]=putdata(index,getpoi(args)) @@ -361,6 +364,7 @@ EOF FROM ways,users WHERE ways.id=#{wayid} AND ways.user_id=users.id + AND ways.visible=1 ORDER BY version DESC EOF histlist=ActiveRecord::Base.connection.select_all(sql) @@ -376,7 +380,7 @@ EOF # returns current way ID, new way ID, hash of renumbered nodes, # xmin,xmax,ymin,ymax - def putway(args) + def putway(args,renumberednodes) RAILS_DEFAULT_LOGGER.info(" putway started") usertoken,originalway,points,attributes,oldversion,baselong,basey,masterscale=args uid=getuserid(usertoken) @@ -435,7 +439,6 @@ EOF xmin=ymin= 999999 xmax=ymax=-999999 insertsql='' - renumberednodes={} nodelist=[] points.each_index do |i| @@ -684,28 +687,27 @@ def readwayquery_old(id,version,historic) EOF rows=ActiveRecord::Base.connection.select_all(sql) - # if historic (full revert), get the old version of each node, - # and use this (though with a new id) if it differs from the current one + # if historic (full revert), get the old version of each node + # - if it's in another way now, generate a new id + # - if it's not in another way, use the old ID if historic then rows.each_index do |i| sql=<<-EOF - SELECT latitude*0.0000001 AS latitude,longitude*0.0000001 AS longitude,tags - FROM nodes - WHERE id=#{rows[i]['id']} - AND timestamp<="#{waytime}" - ORDER BY timestamp DESC + SELECT latitude*0.0000001 AS latitude,longitude*0.0000001 AS longitude,tags,cwn.id AS currentway + FROM nodes n + LEFT JOIN current_way_nodes cwn + ON cwn.node_id=n.id + WHERE n.id=#{rows[i]['id']} + AND n.timestamp<="#{waytime}" + AND cwn.id!=#{id} + ORDER BY n.timestamp DESC LIMIT 1 EOF row=ActiveRecord::Base.connection.select_one(sql) unless row.nil? then nx=row['longitude'].to_f ny=row['latitude'].to_f - if (nx!=rows[i]['longitude'].to_f or ny!=rows[i]['latitude'].to_f or row['tags']!=rows[i]['tags']) then - rows[i]['id']=-1 - # This generates a new node id if x/y/tags differ from current node. - # Strictly speaking, it need only do this for uniquenodes, but we're - # not generating uniquenodes for historic ways (yet!). - end + if (row['currentway'] && (nx!=rows[i]['longitude'].to_f or ny!=rows[i]['latitude'].to_f or row['tags']!=rows[i]['tags'])) then rows[i]['id']=-1 end rows[i]['longitude']=nx rows[i]['latitude' ]=ny rows[i]['tags' ]=row['tags'] @@ -794,31 +796,25 @@ end def sqlescape(a) - a.gsub(/[\000-\037]/,"").gsub("'","''").gsub(92.chr,92.chr+92.chr) + a.gsub(/[\000-\037]/,"").gsub("'","''").gsub(92.chr) {92.chr+92.chr} end def tag2array(a) tags={} - a.gsub(';;;','#%').split(';').each do |b| - b.gsub!('#%',';;;') - b.gsub!('===','#%') - k,v=b.split('=') - if k.nil? then k='' end - if v.nil? then v='' end - tags[k.gsub('#%','=').gsub(':','|')]=v.gsub('#%','=') + Tags.split(a) do |k, v| + tags[k.gsub(':','|')]=v end tags end def array2tag(a) - str='' + tags = [] a.each do |k,v| if v=='' then next end if v[0,6]=='(type ' then next end - if str!='' then str+=';' end - str+=k.gsub(';',';;;').gsub('=','===').gsub('|',':')+'='+v.gsub(';',';;;').gsub('=','===') + tags << [k.gsub('|',':'), v] end - str + return Tags.join(tags) end def getuserid(token)