X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/89e976c6e57c9aa8afae00437aaf4399ea5fc58f..3b751f79b87699b7943e74ef1fcea1e8fdb3129f:/app/models/way.rb diff --git a/app/models/way.rb b/app/models/way.rb index cd06b1210..09d1dafa0 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -3,42 +3,45 @@ class Way < ActiveRecord::Base belongs_to :user - has_many :way_segments, :foreign_key => 'id' + has_many :way_segments, :foreign_key => 'id', :order => 'sequence_id' has_many :way_tags, :foreign_key => 'id' - has_many :old_ways, :foreign_key => :id + has_many :old_ways, :foreign_key => 'id', :order => 'version' set_table_name 'current_ways' def self.from_xml(xml, create=false) - p = XML::Parser.new - p.string = xml - doc = p.parse + begin + p = XML::Parser.new + p.string = xml + doc = p.parse - way = Way.new + way = Way.new - doc.find('//osm/way').each do |pt| - if !create and pt['id'] != '0' - way.id = pt['id'].to_i - end + doc.find('//osm/way').each do |pt| + if !create and pt['id'] != '0' + way.id = pt['id'].to_i + end - if create - way.timestamp = Time.now - way.visible = true - else - if pt['timestamp'] - way.timestamp = Time.parse(pt['timestamp']) + if create + way.timestamp = Time.now + way.visible = true + else + if pt['timestamp'] + way.timestamp = Time.parse(pt['timestamp']) + end end - end - pt.find('tag').each do |tag| - way.add_tag_keyval(tag['k'], tag['v']) - end + pt.find('tag').each do |tag| + way.add_tag_keyval(tag['k'], tag['v']) + end - pt.find('seg').each do |seg| - way.add_seg_num(seg['id']) + pt.find('seg').each do |seg| + way.add_seg_num(seg['id']) + end end - + rescue + way = nil end return way @@ -56,14 +59,17 @@ class Way < ActiveRecord::Base el1['visible'] = self.visible.to_s el1['timestamp'] = self.timestamp.xmlschema - if user_display_name_cache and user_display_name_cache[self.user_id] + user_display_name_cache = {} if user_display_name_cache.nil? + + if user_display_name_cache and user_display_name_cache.key?(self.user_id) # use the cache if available - else + elsif self.user.data_public? user_display_name_cache[self.user_id] = self.user.display_name + else + user_display_name_cache[self.user_id] = nil end - - #el1['user'] = self.user.display_name if self.user.data_public? - el1['user'] = user_display_name_cache[self.user_id] + + el1['user'] = user_display_name_cache[self.user_id] unless user_display_name_cache[self.user_id].nil? # make sure segments are output in sequence_id order ordered_segments = [] @@ -82,7 +88,7 @@ class Way < ActiveRecord::Base end ordered_segments.each do |seg_id| - if seg_id + if seg_id and seg_id != '0' e = XML::Node.new 'seg' e['id'] = seg_id el1 << e @@ -137,40 +143,53 @@ class Way < ActiveRecord::Base end def save_with_history - t = Time.now - self.timestamp = t - self.save - - WayTag.delete_all(['id = ?', self.id]) - - self.tags.each do |k,v| - tag = WayTag.new - tag.k = k - tag.v = v - tag.id = self.id - tag.save - end + begin + Way.transaction do + t = Time.now + self.timestamp = t + self.save! + + tags = self.tags + + WayTag.delete_all(['id = ?', self.id]) + + tags.each do |k,v| + tag = WayTag.new + tag.k = k + tag.v = v + tag.id = self.id + tag.save! + end - WaySegment.delete_all(['id = ?', self.id]) - - i = 0 - self.segs.each do |n| - seg = WaySegment.new - seg.id = self.id - seg.segment_id = n - seg.sequence_id = i - seg.save - i += 1 - end + segs = self.segs - old_way = OldWay.from_way(self) - old_way.timestamp = t - old_way.save_with_dependencies + WaySegment.delete_all(['id = ?', self.id]) + + i = 1 + segs.each do |n| + seg = WaySegment.new + seg.id = self.id + seg.segment_id = n + seg.sequence_id = i + seg.save! + i += 1 + end + + old_way = OldWay.from_way(self) + old_way.timestamp = t + old_way.save_with_dependencies! + end + + return true + rescue + return nil + end end def preconditions_ok? + return false if self.segs.empty? self.segs.each do |n| - segment = Segment.find(n) + segment = Segment.find(:first, :conditions => ["id = ?", n]) unless segment and segment.visible and segment.preconditions_ok? return false end