+ # ----- putpoi (user token, id, x,y,tag array,visible,baselong,basey,masterscale)
+ # returns current id, new id
+ # if new: add new row to current_nodes and nodes
+ # if old: add new row to nodes, update current_nodes
+
+ def putpoi(args)
+ usertoken,id,x,y,tags,visible,baselong,basey,masterscale=args
+ uid=getuserid(usertoken)
+ return if !uid
+ db_now='@now'+uid.to_s+id.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()")
+
+ id=id.to_i
+ visible=visible.to_i
+ if visible==0 then
+ # if deleting, check node hasn't become part of a way
+ inway=ActiveRecord::Base.connection.select_one("SELECT cw.id FROM current_ways cw,current_way_nodes cwn WHERE cw.id=cwn.id AND cw.visible=1 AND cwn.node_id=#{id} LIMIT 1")
+ unless inway.nil? then return [id,id] end # should really return an error
+ deleteitemrelations(id,'node',uid,db_now)
+ end
+
+ x=coord2long(x.to_f,masterscale,baselong)
+ y=coord2lat(y.to_f,masterscale,basey)
+ tagsql="'"+sqlescape(array2tag(tags))+"'"
+ lat=(y * 10000000).round
+ long=(x * 10000000).round
+ tile=QuadTile.tile_for_point(y, x)
+
+ if (id>0) then
+ ActiveRecord::Base.connection.insert("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{id},#{lat},#{long},#{db_now},#{uid},#{visible},#{tagsql},#{tile})");
+ ActiveRecord::Base.connection.update("UPDATE current_nodes SET latitude=#{lat},longitude=#{long},timestamp=#{db_now},user_id=#{uid},visible=#{visible},tags=#{tagsql},tile=#{tile} WHERE id=#{id}");
+ newid=id
+ else
+ newid=ActiveRecord::Base.connection.insert("INSERT INTO current_nodes (latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{lat},#{long},#{db_now},#{uid},#{visible},#{tagsql},#{tile})");
+ ActiveRecord::Base.connection.update("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags,tile) VALUES (#{newid},#{lat},#{long},#{db_now},#{uid},#{visible},#{tagsql},#{tile})");
+ end
+ [id,newid]
+ end
+
+ # ----- getpoi (id,baselong,basey,masterscale)
+ # returns id,x,y,tag array
+
+ def getpoi(args)
+ id,baselong,basey,masterscale=args; id=id.to_i
+ poi=ActiveRecord::Base.connection.select_one("SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lng,tags "+
+ "FROM current_nodes WHERE visible=1 AND id=#{id}")
+ if poi.nil? then return [nil,nil,nil,''] end
+ [id,
+ long2coord(poi['lng'].to_f,baselong,masterscale),
+ lat2coord(poi['lat'].to_f,basey,masterscale),
+ tag2array(poi['tags'])]
+ end
+
+ # ----- deleteway (user token, way, nodes to keep)