X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/5bc1730d89053486d39af6923d8ee7132402fe0c..b03a3f8889d6f752881a24cd23e010a9ced89efc:/app/controllers/amf_controller.rb diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index c5a7c30ea..b91052266 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -33,6 +33,8 @@ class AmfController < ApplicationController bytes=getlong(req) # | get total size in bytes args=getvalue(req) # | get response (probably an array) + ActiveRecord::Base.logger.info(" Message: #{message}") + case message when 'getpresets'; results[index]=putdata(index,getpresets) when 'whichways'; results[index]=putdata(index,whichways(args)) @@ -168,6 +170,13 @@ EOF # corner-crossing ways, it simply enlarges the bounding box by +/- 0.01 def whichways(args) + xmin = args[0].to_f-0.01 + ymin = args[1].to_f-0.01 + xmax = args[2].to+f-0.01 + ymax = args[3].to+f-0.01 + + ActiveRecord::Base.logger.info(" Bounding Box: #{xmin},#{ymin},#{xmax},#{ymax}") + waylist=WaySegment.find_by_sql("SELECT DISTINCT current_way_segments.id AS wayid"+ " FROM current_way_segments,current_segments,current_nodes,current_ways "+ " WHERE segment_id=current_segments.id "+ @@ -175,8 +184,8 @@ EOF " AND node_a=current_nodes.id "+ " AND current_ways.id=current_way_segments.id "+ " AND current_ways.visible=1 "+ - " AND (latitude BETWEEN "+(args[1].to_f-0.01).to_s+" AND "+(args[3].to_f+0.01).to_s+") "+ - " AND (longitude BETWEEN "+(args[0].to_f-0.01).to_s+" AND "+(args[2].to_f+0.01).to_s+")") + " AND (latitude BETWEEN "+ymin.to_s+" AND "+ymax.to_s+") "+ + " AND (longitude BETWEEN "+xmin.to_s+" AND "+xmax.to_s+")") ways = waylist.collect {|a| a.wayid.to_i } # get an array of way id's @@ -184,8 +193,8 @@ EOF " FROM current_nodes "+ " LEFT OUTER JOIN current_segments cs1 ON cs1.node_a=current_nodes.id "+ " LEFT OUTER JOIN current_segments cs2 ON cs2.node_b=current_nodes.id "+ - " WHERE (latitude BETWEEN "+(args[1].to_f-0.01).to_s+" AND "+(args[3].to_f+0.01).to_s+") "+ - " AND (longitude BETWEEN "+(args[0].to_f-0.01).to_s+" AND "+(args[2].to_f-0.01).to_s+") "+ + " WHERE (latitude BETWEEN "+ymin.to_s+" AND "+ymax.to_s+") "+ + " AND (longitude BETWEEN "+xmin.to_s+" AND "+xmax.to_s+") "+ " AND cs1.id IS NULL AND cs2.id IS NULL "+ " AND current_nodes.visible=1") @@ -263,7 +272,7 @@ EOF xmin = ymin = 999999 xmax = ymax = -999999 - insertsql = nodelist = '' + insertsql = '' renumberednodes={} points.each_index do |i| @@ -288,24 +297,18 @@ EOF if (xs!=xc[node] or (ys/0.0000001).round!=(yc[node]/0.0000001).round or tagstr!=tagc[node]) ActiveRecord::Base.connection.insert("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags) VALUES (#{node},#{ys},#{xs},#{db_now},#{uid},1,#{tagsql})") ActiveRecord::Base.connection.update("UPDATE current_nodes SET latitude=#{ys},longitude=#{xs},timestamp=#{db_now},user_id=#{uid},tags=#{tagsql},visible=1 WHERE id=#{node}") - else - if (nodelist!='') then nodelist+=',' end; nodelist+=node.to_s end else # old node, created in another way and now added to this way - if (nodelist!='') then nodelist+=',' end; nodelist+=node.to_s end end - if nodelist!='' then - ActiveRecord::Base.connection.update("UPDATE current_nodes SET timestamp=#{db_now},user_id=#{uid},visible=1 WHERE id IN (#{nodelist})") - end # -- 6.i compare segments numberedsegments={} - seglist='' + seglist='' # list of existing segments that we want to keep for i in (0..(points.length-2)) if (points[i+1][3].to_i==0) then next end segid=points[i+1][5].to_i @@ -324,14 +327,10 @@ EOF end # numberedsegments.each{|a,b| RAILS_DEFAULT_LOGGER.error("Sending back: seg no. #{a} -> id #{b}") } - if seglist!='' then - ActiveRecord::Base.connection.update("UPDATE current_segments SET timestamp=#{db_now},user_id=#{uid},visible=1 WHERE id IN (#{seglist})") - end - # -- 6.ii insert new way segments - createuniquesegments(way,db_uqs) + createuniquesegments(way,db_uqs,seglist) # segments which appear in this way but no other # delete segments from uniquesegments (and not in modified way) @@ -340,7 +339,6 @@ EOF SELECT DISTINCT segment_id,node_a,node_b,#{db_now},#{uid},0 FROM current_segments AS cs, #{db_uqs} AS us WHERE cs.id=us.segment_id AND cs.visible=1 - AND (cs.timestamp!=#{db_now} OR cs.user_id!=#{uid}) EOF ActiveRecord::Base.connection.insert(sql) @@ -348,13 +346,12 @@ EOF UPDATE current_segments AS cs, #{db_uqs} AS us SET cs.timestamp=#{db_now},cs.visible=0,cs.user_id=#{uid} WHERE cs.id=us.segment_id AND cs.visible=1 - AND (cs.timestamp!=#{db_now} OR cs.user_id!=#{uid}) EOF ActiveRecord::Base.connection.update(sql) # delete nodes not in modified way or any other segments - createuniquenodes(db_uqs,db_uqn) + createuniquenodes(db_uqs,db_uqn) # nodes which appear in this way but no other sql=<<-EOF INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible) @@ -401,7 +398,7 @@ EOF if v[0,6]=='(type ' then next end if insertsql !='' then insertsql +=',' end if currentsql!='' then currentsql+=',' end - insertsql +="(#{way},'"+sqlescape(k)+"','"+sqlescape(v)+"',version)" + insertsql +="(#{way},'"+sqlescape(k)+"','"+sqlescape(v)+"',#{version})" currentsql+="(#{way},'"+sqlescape(k)+"','"+sqlescape(v)+"')" end @@ -424,7 +421,7 @@ EOF db_uqn='unin'+uid.to_s+way.to_i.abs.to_s+Time.new.to_i.to_s # temp uniquenodes table name, typically 51 chars db_now='@now'+uid.to_s+way.to_i.abs.to_s+Time.new.to_i.to_s # 'now' variable name, typically 51 chars ActiveRecord::Base.connection.execute("SET #{db_now}=NOW()") - createuniquesegments(way,db_uqs) + createuniquesegments(way,db_uqs,'') # - delete any otherwise unused segments @@ -490,8 +487,8 @@ def readwayquery(id) " ORDER BY sequence_id" end -def createuniquesegments(way,uqs_name) - # Finds segments which appear in this way and no other +def createuniquesegments(way,uqs_name,seglist) + # Finds segments which appear in (previous version of) this way and no other sql=<<-EOF CREATE TEMPORARY TABLE #{uqs_name} SELECT a.segment_id @@ -502,6 +499,7 @@ def createuniquesegments(way,uqs_name) AND b.id != #{way} WHERE b.segment_id IS NULL EOF + if (seglist!='') then sql+=" AND a.segment_id NOT IN (#{seglist})" end ActiveRecord::Base.connection.execute(sql) end @@ -555,9 +553,9 @@ end def getuserid(token) token=sqlescape(token) if (token=~/^(.+)\+(.+)$/) then - return ActiveRecord::Base.connection.select_value("SELECT id FROM users WHERE active=1 AND timeout>NOW() AND email='#{$1}' AND pass_crypt=MD5('#{$2}')") + return ActiveRecord::Base.connection.select_value("SELECT id FROM users WHERE active=1 AND email='#{$1}' AND pass_crypt=MD5('#{$2}')") else - return ActiveRecord::Base.connection.select_value("SELECT id FROM users WHERE active=1 AND timeout>NOW() AND token='#{token}'") + return ActiveRecord::Base.connection.select_value("SELECT id FROM users WHERE active=1 AND token='#{token}'") end end