+ elsif xc.has_key?(node)
+ # old node from original way - update
+ 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}")
+ end
+ else
+ # old node, created in another way and now added to this way
+ end
+
+ end
+
+
+ # -- 6.i compare segments
+
+ numberedsegments={}
+ 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
+ from =points[i ][2].to_i
+ to =points[i+1][2].to_i
+ if seg.has_key?(segid)
+ # if segment exists, check it still refers to the same nodes
+ if seg[segid]=="#{from}-#{to}" then
+ if (seglist!='') then seglist+=',' end; seglist+=segid.to_s
+ next
+ end
+ elsif segid>0
+ # not in previous version of way, but supplied, so assume
+ # that it's come from makeway (i.e. unwayed segments)
+ if (seglist!='') then seglist+=',' end; seglist+=segid.to_s
+ next
+ end
+ segid=ActiveRecord::Base.connection.insert("INSERT INTO current_segments ( node_a,node_b,timestamp,user_id,visible,tags) VALUES ( #{from},#{to},#{db_now},#{uid},1,'')")
+ ActiveRecord::Base.connection.insert("INSERT INTO segments (id,node_a,node_b,timestamp,user_id,visible,tags) VALUES (#{segid},#{from},#{to},#{db_now},#{uid},1,'')")
+ points[i+1][5]=segid
+ numberedsegments[(i+1).to_s]=segid.to_s
+ end
+
+
+ # -- 6.ii insert new way segments
+
+ createuniquesegments(way,db_uqs,seglist) # segments which appear in this way but no other
+
+ # delete segments from uniquesegments (and not in modified way)
+
+ sql=<<-EOF
+ INSERT INTO segments (id,node_a,node_b,timestamp,user_id,visible)
+ 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
+ EOF
+ ActiveRecord::Base.connection.insert(sql)
+
+ sql=<<-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
+ EOF
+ ActiveRecord::Base.connection.update(sql)
+
+ # delete nodes not in modified way or any other segments
+
+ 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)
+ SELECT DISTINCT cn.id,cn.latitude,cn.longitude,#{db_now},#{uid},0
+ FROM current_nodes AS cn,#{db_uqn}
+ WHERE cn.id=node_id
+ EOF
+ ActiveRecord::Base.connection.insert(sql)
+
+ sql=<<-EOF
+ UPDATE current_nodes AS cn, #{db_uqn}
+ SET cn.timestamp=#{db_now},cn.visible=0,cn.user_id=#{uid}
+ WHERE cn.id=node_id
+ EOF
+ ActiveRecord::Base.connection.update(sql)
+
+ ActiveRecord::Base.connection.execute("DROP TABLE #{db_uqs}")
+ ActiveRecord::Base.connection.execute("DROP TABLE #{db_uqn}")
+
+ # insert new version of route into way_segments
+
+ insertsql =''
+ currentsql=''
+ sequence =1
+ for i in (0..(points.length-2))
+ if (points[i+1][3].to_i==0) then next end
+ if insertsql !='' then insertsql +=',' end
+ if currentsql!='' then currentsql+=',' end
+ insertsql +="(#{way},#{points[i+1][5]},#{version})"
+ currentsql+="(#{way},#{points[i+1][5]},#{sequence})"
+ sequence +=1
+ end
+
+ ActiveRecord::Base.connection.execute("DELETE FROM current_way_segments WHERE id=#{way}");
+ ActiveRecord::Base.connection.insert("INSERT INTO way_segments (id,segment_id,version ) VALUES #{insertsql}");
+ ActiveRecord::Base.connection.insert("INSERT INTO current_way_segments (id,segment_id,sequence_id) VALUES #{currentsql}");
+
+ # -- 7. insert new way tags
+
+ insertsql =''
+ currentsql=''
+ attributes.each do |k,v|
+ if v=='' or v.nil? then next end
+ if v[0,6]=='(type ' then next end
+ if insertsql !='' then insertsql +=',' end
+ if currentsql!='' then currentsql+=',' end
+ k=k.gsub(/[\000-\037]/,"")
+ v=v.gsub(/[\000-\037]/,"")
+ insertsql +="(#{way},'"+sqlescape(k)+"','"+sqlescape(v)+"',#{version})"
+ currentsql+="(#{way},'"+sqlescape(k)+"','"+sqlescape(v)+"')"
+ end
+
+ ActiveRecord::Base.connection.execute("DELETE FROM current_way_tags WHERE id=#{way}")
+ if (insertsql !='') then ActiveRecord::Base.connection.insert("INSERT INTO way_tags (id,k,v,version) VALUES #{insertsql}" ) end
+ if (currentsql!='') then ActiveRecord::Base.connection.insert("INSERT INTO current_way_tags (id,k,v) VALUES #{currentsql}") end
+
+ [originalway,way,renumberednodes,numberedsegments,xmin,xmax,ymin,ymax]
+ end