- # -- 6.i compare segments
-
- numberedsegments={}
- seglist=''
- 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 seg[segid]=="#{from}-#{to}" then
- if (seglist!='') then seglist+=',' end; seglist+=segid.to_s
- next
- end
- 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
- # 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)
-
- # a=''
- # ActiveRecord::Base.connection.select_values("SELECT segment_id FROM #{db_uqs}").each {|b| a+=b+',' }
- # RAILS_DEFAULT_LOGGER.error("Unique segments are #{a}")
- # a=ActiveRecord::Base.connection.select_value("SELECT #{db_now}")
- # RAILS_DEFAULT_LOGGER.error("Timestamp of this edit is #{a}")
- # RAILS_DEFAULT_LOGGER.error("Userid of this edit is #{uid}")
-
- # delete nodes from uniquesegments (and not in modified way)
-
- 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,
- current_segments AS cs,
- #{db_uqs} AS us
- WHERE(cn.id=cs.node_a OR cn.id=cs.node_b)
- AND cs.id=us.segment_id AND cs.visible=1
- AND (cn.timestamp!=#{db_now} OR cn.user_id!=#{uid})
- EOF
- ActiveRecord::Base.connection.insert(sql)
-
- sql=<<-EOF
- UPDATE current_nodes AS cn,
- current_segments AS cs,
- #{db_uqs} AS us
- SET cn.timestamp=#{db_now},cn.visible=0,cn.user_id=#{uid}
- WHERE (cn.id=cs.node_a OR cn.id=cs.node_b)
- AND cs.id=us.segment_id AND cs.visible=1
- AND (cn.timestamp!=#{db_now} OR cn.user_id!=#{uid})
- EOF
- ActiveRecord::Base.connection.update(sql)
-
- # 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
- AND (cs.timestamp!=#{db_now} OR cs.user_id!=#{uid})
- 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
- AND (cs.timestamp!=#{db_now} OR cs.user_id!=#{uid})
- EOF
- ActiveRecord::Base.connection.update(sql)
- ActiveRecord::Base.connection.execute("DROP TABLE #{db_uqs}")
-
- # 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=='' then next end
- 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)"
- 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
-
- # ----- deleteway (user token, way)
- # returns way ID only
-
- def deleteway(args)
- usertoken,way=args
- uid=getuserid(usertoken); if !uid then return end
- way=way.to_i
-
- db_uqs='uniq'+usertoken+way.to_i.abs.to_s+Time.new.to_i.to_s # temp uniquesegments table name, typically 51 chars
- db_now='@now'+usertoken+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)
-
- 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,
- current_segments AS cs,
- #{db_uqs} AS us
- WHERE (cn.id=cs.node_a OR cn.id=cs.node_b)
- AND cs.id=us.segment_id
- EOF
- ActiveRecord::Base.connection.insert(sql)
-
- sql=<<-EOF
- UPDATE current_nodes AS cn,
- current_segments AS cs,
- #{db_uqs} AS us
- SET cn.timestamp=#{db_now},cn.visible=0,cn.user_id=#{uid}
- WHERE (cn.id=cs.node_a OR cn.id=cs.node_b)
- AND cs.id=us.segment_id
- EOF
- ActiveRecord::Base.connection.update(sql)
-
- # - delete any otherwise unused segments
-
- 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
- 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
- EOF
- ActiveRecord::Base.connection.update(sql)
- ActiveRecord::Base.connection.execute("DROP TABLE #{db_uqs}")
-
- # - delete way
-
- ActiveRecord::Base.connection.insert("INSERT INTO ways (id,user_id,timestamp,visible) VALUES (#{way},#{uid},#{db_now},0)")
- ActiveRecord::Base.connection.update("UPDATE current_ways SET user_id=#{uid},timestamp=#{db_now},visible=0 WHERE id=#{way}")
- ActiveRecord::Base.connection.execute("DELETE FROM current_way_segments WHERE id=#{way}")
- ActiveRecord::Base.connection.execute("DELETE FROM current_way_tags WHERE id=#{way}")
-
- way
- end
-
- # ====================================================================
- # Support functions for remote calls
-
- def readwayquery(id)
- ActiveRecord::Base.connection.select_all "SELECT n1.latitude AS lat1,n1.longitude AS long1,n1.id AS id1,n1.tags as tags1, "+
- " n2.latitude AS lat2,n2.longitude AS long2,n2.id AS id2,n2.tags as tags2,segment_id "+
- " FROM current_way_segments,current_segments,current_nodes AS n1,current_nodes AS n2 "+
- " WHERE current_way_segments.id=#{id} "+
- " AND segment_id=current_segments.id "+
- " AND n1.id=node_a and n2.id=node_b "+
- " ORDER BY sequence_id"
- end
-
- def createuniquesegments(way,uqs_name)
- sql=<<-EOF
- CREATE TEMPORARY TABLE #{uqs_name}
- SELECT a.segment_id,COUNT(a.segment_id) AS ct
- FROM current_way_segments AS a, current_way_segments AS b
- WHERE a.segment_id=b.segment_id
- AND a.id=#{way}
- GROUP BY a.segment_id
- HAVING ct=1
- EOF
- ActiveRecord::Base.connection.execute(sql)
- end
-
+ # ----- getway (objectname, way, baselong, basey, masterscale)
+ # returns objectname, array of co-ordinates, attributes,
+ # xmin,xmax,ymin,ymax
+
+ def getway(args)
+ objname,wayid,baselong,basey,masterscale=args
+ wayid = wayid.to_i
+ points = []
+ lastid = -1
+ xmin = ymin = 999999
+ xmax = ymax = -999999
+
+ readwayquery(wayid).each {|row|
+ xs1=long2coord(row['long1'].to_f,baselong,masterscale); ys1=lat2coord(row['lat1'].to_f,basey,masterscale)
+ xs2=long2coord(row['long2'].to_f,baselong,masterscale); ys2=lat2coord(row['lat2'].to_f,basey,masterscale)
+ points << [xs1,ys1,row['id1'].to_i,0,tag2array(row['tags1']),0] if (row['id1'].to_i!=lastid)
+ lastid = row['id2'].to_i
+ points << [xs2,ys2,row['id2'].to_i,1,tag2array(row['tags2']),row['segment_id'].to_i]
+ xmin = [xmin,row['long1'].to_f,row['long2'].to_f].min
+ xmax = [xmax,row['long1'].to_f,row['long2'].to_f].max
+ ymin = [ymin,row['lat1'].to_f,row['lat2'].to_f].min
+ ymax = [ymax,row['lat1'].to_f,row['lat2'].to_f].max
+ }
+
+ attributes={}
+ attrlist=ActiveRecord::Base.connection.select_all "SELECT k,v FROM current_way_tags WHERE id=#{wayid}"
+ attrlist.each {|a| attributes[a['k']]=a['v'] }
+
+ [objname,points,attributes,xmin,xmax,ymin,ymax]
+ end