+
+ # ----- getway_old (objectname, way, version, baselong, basey, masterscale)
+ # returns old version of way
+
+ # Node handling on undelete (historic=false):
+ # - always use the node specified, even if it's moved
+
+ # Node handling on revert (historic=true):
+ # - if it's a visible node, use a new node id (i.e. not mucking up the old one)
+ # which means the SWF needs to allocate new ids
+ # - if it's an invisible node, we can reuse the old node id
+
+ def getway_old(args)
+ objname,wayid,version,baselong,basey,masterscale=args
+ wayid = wayid.to_i
+ xmin = ymin = 999999
+ xmax = ymax = -999999
+ dellist=[]
+
+ # get version (if -1) and timestamp
+ if version<0
+ historic=false
+ row=ActiveRecord::Base.connection.select_one("SELECT version FROM ways WHERE way=#{wayid} ORDER BY version DESC LIMIT 1")
+ version=row['version']
+ else
+ historic=true
+ end
+ row=ActiveRecord::Base.connection.select_one("SELECT timestamp FROM ways WHERE version=#{version} AND way=#{wayid}")
+ timestamp=row['timestamp']
+
+ # get node list from this version
+ sql=<<-EOF
+ SELECT cn.id,visible,latitude*0.0000001 AS latitude,longitude*0.0000001 AS longitude,tags
+ FROM way_nodes wn,current_nodes cn
+ WHERE wn.version=#{version}
+ AND wn.id=#{wayid}
+ AND wn.node_id=cn.id
+ ORDER BY sequence_id
+ EOF
+ ActiveRecord::Base.connection.select_all(sql).each {|row|
+ points<<[long2coord(row['longitude'].to_f,baselong,masterscale),lat2coord(row['latitude'].to_f,basey,masterscale),row['id'].to_i,row['visible'].to_i,tag2array(row['tags'])]
+ xmin=[xmin,row['longitude'].to_f].min
+ xmax=[xmax,row['longitude'].to_f].max
+ ymin=[ymin,row['latitude'].to_f].min
+ ymax=[ymax,row['latitude'].to_f].max
+ }
+
+ # if historic (full revert), get the old version of each node
+ if historic then
+ for i in (0..points.length-1)
+ sql=<<-EOF
+ SELECT latitude*0.0000001 AS latitude,longitude*0.0000001 AS longitude,tags
+ FROM nodes
+ WHERE id=#{points[i][2]}
+ AND timestamp<=#{waytime}
+ ORDER BY timestamp DESC
+ LIMIT 1
+ EOF
+ row=ActiveRecord::Base.connection.select_one(sql)
+ unless row.empty? then
+ points[i][0]=long2coord(row['longitude'].to_f,baselong,masterscale)
+ points[i][1]=lat2coord(row['latitude'].to_f,baselong,masterscale)
+ points[i][4]=tag2array(row['tags'])
+ end
+ end
+ end
+
+ # get tags from this version
+ attributes={}
+ attrlist=ActiveRecord::Base.connection.select_all "SELECT k,v FROM current_way_tags WHERE id=#{wayid} AND version=#{version}"
+ attrlist.each {|a| attributes[a['k'].gsub(':','|')]=a['v'] }
+
+ [objname,points,attributes,xmin,xmax,ymin,ymax]
+ end
+
+ # ----- getway_history (way)
+ # returns array of previous versions (version,timestamp,visible,user)
+ # should also show 'created_by'
+
+ def getway_history(wayid)
+ RAILS_DEFAULT_LOGGER.info(" Received history request for #{wayid}")
+ history=[]
+ sql=<<-EOF
+ SELECT version,timestamp,visible,display_name,data_public
+ FROM ways,users
+ WHERE ways.id=#{wayid}
+ AND ways.user_id=users.id
+ ORDER BY version DESC
+ EOF
+ histlist=ActiveRecord::Base.connection.select_all(sql)
+ histlist.each { |row|
+ if row['data_public'] then user=row['display_name'] else user='anonymous' end
+ history<<[row['version'],row['timestamp'],row['visible'],user]
+ }
+ [history]
+ end