# (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
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))
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)
# 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)
xmin=ymin= 999999
xmax=ymax=-999999
insertsql=''
- renumberednodes={}
nodelist=[]
points.each_index do |i|
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']