various things from TomH
authorSteve Coast <steve@asklater.com>
Tue, 29 May 2007 23:25:41 +0000 (23:25 +0000)
committerSteve Coast <steve@asklater.com>
Tue, 29 May 2007 23:25:41 +0000 (23:25 +0000)
app/controllers/api_controller.rb
app/models/trace.rb
config/database.yml
config/environment.rb
lib/daemons/gpx_import.rb

index f61c67d6e548c4ff438ad376aae820af4ef7768d..4a29b4a40dd12e826a8a0a5435eb8e37dd59ea7b 100644 (file)
@@ -243,6 +243,7 @@ class ApiController < ApplicationController
     #exit when we have too many requests
     if @@count > MAX_COUNT
       @@count = COUNT
+      
       exit!
     end
 
index 0d9e8861d1d8bbb4c94222a28a835270705626bd..0307b5f653eac11a6563c7b21b5fa7ceae23a36a 100644 (file)
@@ -56,6 +56,10 @@ class Trace < ActiveRecord::Base
     "/home/osm/icons/#{id}_icon.gif"
   end
 
+  def trace_name
+    "/home/osm/gpx/#{id}.gpx"
+  end
+
   def to_xml_node
     el1 = XML::Node.new 'gpx_file'
     el1['id'] = self.id.to_s
@@ -68,4 +72,85 @@ class Trace < ActiveRecord::Base
     el1['timestamp'] = self.timestamp.xmlschema
     return el1
   end
+
+  def import
+    begin
+      logger.info("GPX Import importing #{name} (#{id}) from #{user.email}")
+
+      # TODO *nix specific, could do to work on windows... would be functionally inferior though - check for '.gz'
+      filetype = `file -b #{trace_name}`.chomp
+      gzipped = filetype =~ /^gzip/
+      zipped = filetype =~ /^Zip/
+
+      if gzipped
+        filename = tempfile = "/tmp/#{rand}"
+        system("gunzip -c #{trace_name} > #{filename}")
+      elsif zipped
+        filename = tempfile = "/tmp/#{rand}"
+        system("unzip -p #{trace_name} > #{filename}")
+      else
+        filename = trace_name
+      end
+
+      gpx = OSM::GPXImporter.new(filename)
+
+      f_lat = 0
+      f_lon = 0
+      first = true
+
+      Tracepoint.delete_all(['gpx_id = ?', self.id])
+
+      gpx.points do |point|
+        if first
+          f_lat = point['latitude']
+          f_lon = point['longitude']
+        end
+
+        tp = Tracepoint.new
+        tp.lat = point['latitude'].to_f
+        tp.lng = point['longitude'].to_f
+        tp.altitude = point['altitude'].to_f
+        tp.user_id = user.id
+        tp.gpx_id = id
+        tp.trackid = point['segment'].to_i
+        tp.save!
+      end
+
+      if gpx.actual_points > 0
+        max_lat = Tracepoint.maximum('latitude', :conditions => ['gpx_id = ?', id])
+        min_lat = Tracepoint.minimum('latitude', :conditions => ['gpx_id = ?', id])
+        max_lon = Tracepoint.maximum('longitude', :conditions => ['gpx_id = ?', id])
+        min_lon = Tracepoint.minimum('longitude', :conditions => ['gpx_id = ?', id])
+
+        max_lat = max_lat.to_f / 1000000
+        min_lat = min_lat.to_f / 1000000
+        max_lon = max_lon.to_f / 1000000
+        min_lon = min_lon.to_f / 1000000
+
+        self.latitude = f_lat
+        self.longitude = f_lon
+        self.large_picture = gpx.get_picture(min_lat, min_lon, max_lat, max_lon, gpx.actual_points)
+        self.icon_picture = gpx.get_icon(min_lat, min_lon, max_lat, max_lon)
+        self.size = gpx.actual_points
+        self.inserted = true
+        self.save
+
+        Notifier::deliver_gpx_success(self, gpx.possible_points)
+      else
+        FileUtils.rm_f("/home/osm/gpx/#{id}.gpx")
+        self.destroy
+        Notifier::deliver_gpx_failure(self, '0 points parsed ok. Do they all have lat,lng,alt,timestamp?')
+      end
+
+      logger.info "done trace #{id}"
+    rescue Exception => ex
+      logger.info ex
+      ex.backtrace.each {|l| logger.info l }
+      FileUtils.rm_f("/home/osm/gpx/#{id}.gpx")
+      self.destroy
+      Notifier::deliver_gpx_failure(self, ex.to_s + ex.backtrace.join("\n") )
+    ensure
+      FileUtils.rm_f(tempfile) if tempfile
+    end
+  end
 end
index 93e3cf00eabd9f0aefccb08ca77a8d6b88266924..436e3d3062eb05280e6c333637ba9c8829b595b7 100644 (file)
@@ -30,6 +30,7 @@ test:
 production:
   adapter: mysql
   database: openstreetmap
-  username: TheUsername
-  password: ThePassword
-  host: localhost
+  username: openstreetmap
+  password: openstreetmap
+  host: db.openstreetmap.org
+
index bcd5a89fb971ae36f87cd2af79f1f303e83f160f..a1382e9e99dcfe42cd4529c15618c02e037fa3e0 100644 (file)
@@ -77,7 +77,7 @@ HTTP_EXPECTATION_FAILED = 417
 #Taming FCGI
 #
 COUNT = 0
-MAX_COUNT = 100
+MAX_COUNT = 10000
 
 
 
index acf2153001bb065ddf4a04e879f1ed375cb11711..3b7fb02e2fb1bf52453eb907565bb0b478f45cc4 100755 (executable)
 
 require File.dirname(__FILE__) + "/../../config/environment"
 
-$running = true;
-Signal.trap("TERM") do 
-  $running = false
-end
+terminated = false
 
 logger = ActiveRecord::Base.logger
 
-while($running) do
-
+while(true) do
   ActiveRecord::Base.logger.info("GPX Import daemon wake @ #{Time.now}.")
 
-  traces = Trace.find(:all, :conditions => ['inserted = ?', false])
-
-  if traces and traces.length > 0
-    traces.each do |trace|
-      begin
-
-        logger.info("GPX Import importing #{trace.name} (#{trace.id}) from #{trace.user.email}")
-
-        # TODO *nix specific, could do to work on windows... would be functionally inferior though - check for '.gz'
-        filetype = `file -b /home/osm/gpx/#{trace.id}.gpx`.chomp
-        gzipped = filetype =~ /^gzip/
-        zipped = filetype =~ /^Zip/
-
-        if gzipped
-          logger.info("gzipped")
-          filename = "/tmp/#{rand}"
-          system("gunzip -c /home/osm/gpx/#{trace.id}.gpx > #{filename}")
-        elsif zipped
-          logger.info("zipped")
-          filename = "/tmp/#{rand}"
-          system("unzip -p /home/osm/gpx/#{trace.id}.gpx > #{filename}")
-        else
-          logger.info("not gzipped")
-          filename = "/home/osm/gpx/#{trace.id}.gpx"
-        end
-
-        gpx = OSM::GPXImporter.new(filename)
-
-        f_lat = 0
-        f_lon = 0
-        first = true
-
-        gpx.points do |point|
-          if first
-            f_lat = point['latitude']
-            f_lon = point['longitude']
-          end
-
-          tp = Tracepoint.new
-          tp.lat = point['latitude'].to_f
-          tp.lng = point['longitude'].to_f
-          tp.altitude = point['altitude'].to_f
-          tp.user_id = trace.user.id
-          tp.gpx_id = trace.id
-          tp.trackid = point['segment'].to_i
-          tp.save!
-        end
-
-        if gpx.actual_points > 0
-          max_lat = Tracepoint.maximum('latitude', :conditions => ['gpx_id = ?', trace.id])
-          min_lat = Tracepoint.minimum('latitude', :conditions => ['gpx_id = ?', trace.id])
-          max_lon = Tracepoint.maximum('longitude', :conditions => ['gpx_id = ?', trace.id])
-          min_lon = Tracepoint.minimum('longitude', :conditions => ['gpx_id = ?', trace.id])
-
-          max_lat = max_lat.to_f / 1000000
-          min_lat = min_lat.to_f / 1000000
-          max_lon = max_lon.to_f / 1000000
-          min_lon = min_lon.to_f / 1000000
-
-          trace.latitude = f_lat
-          trace.longitude = f_lon
-          trace.large_picture = gpx.get_picture(min_lat, min_lon, max_lat, max_lon, gpx.actual_points)
-          trace.icon_picture = gpx.get_icon(min_lat, min_lon, max_lat, max_lon)
-          trace.size = gpx.actual_points
-          trace.inserted = true
-          trace.save
+  Trace.find(:all, :conditions => ['inserted = ?', false]).each do |trace|
+    Signal.trap("TERM") do 
+      terminated = true
+    end
 
-          if gzipped || zipped
-            FileUtils.rm_f(filename)
-          end
+    trace.import
 
-          logger.info "done trace #{trace.id}"
-          Notifier::deliver_gpx_success(trace, gpx.possible_points)
-        else
-          FileUtils.rm_f("/home/osm/gpx/#{trace.id}.gpx", filename)
-          trace.destroy
-          Notifier::deliver_gpx_failure(trace, '0 points parsed ok. Do they all have lat,lng,alt,timestamp?')
-        end
+    Signal.trap("TERM", "DEFAULT")
 
-      rescue Exception => ex
-        logger.info ex
-        ex.backtrace.each {|l| logger.info l }
-          FileUtils.rm_f("/home/osm/gpx/#{trace.id}.gpx", filename)
-          trace.destroy
-          Notifier::deliver_gpx_failure(trace, ex.to_s + ex.backtrace.join("\n") )
-      end
-    end
+    exit if terminated
   end
 
-  Trace.find(:all, :conditions => ['inserted = ?', false]).each do |trace|
-     FileUtils.rm_f("/home/osm/gpx/#{trace.id}.gpx")
-     trace.destroy
-  end
-  exit
   sleep 15.minutes
 end