if defined?(Mongrel) if defined?(Mongrel::UploadProgress) puts "DB_UPLOAD_PLUGIN enabled" class Mongrel::DbUploadProgress attr_accessor :debug def initialize(options = {}) @guard = Mutex.new @options = options @debug = true puts "DbUploadProgress object created." if @debug end def check(upid) puts "UploadProgress checked on #{upid}" if @debug #@counters[upid].last rescue nil end def add(upid, size) @guard.synchronize do row = get_row(upid) row.update_attribute(@options[:total_size_method_name], size) row.update_attribute(@options[:remaining_method_name], size) puts "#{upid}: Added #{size}" if @debug end rescue StandardError => e #puts "Exception in add: #{e}" end def mark(upid, len) #return unless status = check(upid) puts "#{upid}: Marking #{len}" if @debug @guard.synchronize { row = get_row(upid) row.update_attribute(@options[:remaining_method_name], len) } rescue StandardError => e puts "Exception in mark: #{e}. #{e.backtrace}" end def finish(upid) @guard.synchronize do puts "#{upid}: Finished" if @debug #@counters.delete(upid) end rescue StandardError => e #puts "Exception in finish: #{e}" end def list puts "Upload progress object listed" if @debug #@counters.keys.sort end private def get_row(upid) row = @options[:object_name].to_s.camelize.constantize.send("find_by_#{@options[:id_method_name]}", upid) if row.nil? h = {@options[:id_method_name] => upid} puts "Creating new #{@options[:object_name]} with options: #{h.inspect}" row = @options[:object_name].to_s.camelize.constantize.create!(h) end return row rescue StandardError => e puts "Exception in get_row(#{upid}): #{e}. #{e.backtrace}" return nil end end class Upload def upload_notify(action, params, *args) Upload.setup unless defined?(@@uploads) return unless @path_info.include?(params['PATH_INFO']) && params[Mongrel::Const::REQUEST_METHOD] == 'POST' && upload_id = Mongrel::HttpRequest.query_parse(params['QUERY_STRING'])['upload_id'] if action == :mark last_checked_time = @@last_checked[upload_id] # puts "Decided to mark progres... or not? Last update was #{last_checked_time}, #{Time.now - last_checked_time}, freq is #{@frequency}" return if last_checked_time && Time.now - last_checked_time < @frequency end puts "---- Sending method call to #{action}" # now we actually do shit @@uploads.send(action, upload_id, *args) @@last_checked[upload_id] = Time.now unless action == :finish end def self.setup(options = {}) default_options = {:object_name => :upload_status, :id_method_name => :upid, :remaining_method_name => :remaining, :total_size_method_name => :total} @@options = options.reverse_merge(default_options) @@last_checked = {} unless defined?(@@last_checked) @@uploads = Mongrel::DbUploadProgress.new(@@options) end end else puts "MONGREL_UPLOAD_PROGRESS_DB_PLUGIN disabled even through mongrel is running... do you have mongrel_upload_progress gem installed? are you running mongrel with -S option?" class Upload # dummy class... just in case you always expect it there def self.setup(options = {}) # dummy method end end end else class Upload # dummy class... just in case you always expect it there def self.setup(options = {}) # dummy method end end end