]> git.openstreetmap.org Git - rails.git/blobdiff - app/controllers/amf_controller.rb
further refinement to revert
[rails.git] / app / controllers / amf_controller.rb
index bffff484e23a7d7223bf897c4f86097906683b9a..6aa64f6a76813952d974d319d1e69b2a247e9750 100644 (file)
@@ -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))
@@ -132,6 +135,7 @@ navigable drain: waterway=drain,boat=yes,name=(type name here)
 derelict canal: waterway=derelict_canal,name=(type name here)
 unnavigable river: waterway=river,boat=no,name=(type name here)
 unnavigable drain: waterway=drain,boat=no,name=(type name here)
+stream: waterway=stream,boat=no,name=(type name here)
 
 way/railway
 railway: railway=rail
@@ -197,7 +201,7 @@ post office: amenity=post_office,tourism=,name=,religion=,denomination=
 pub: tourism=,amenity=pub,name=(type name here),religion=,denomination=
 
 POI/natural
-peak: point=peak
+peak: natural=peak
 EOF
 
     StringIO.open(txt) do |file|
@@ -360,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)
@@ -375,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)
@@ -434,7 +439,6 @@ EOF
     xmin=ymin= 999999
     xmax=ymax=-999999
     insertsql=''
-    renumberednodes={}
        nodelist=[]
 
     points.each_index do |i|
@@ -683,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']
@@ -793,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)