diff options
author | nfoy <nfoy@purdue.edu> | 2014-04-28 20:39:29 -0400 |
---|---|---|
committer | nfoy <nfoy@purdue.edu> | 2014-04-28 20:39:29 -0400 |
commit | d2c700eb31e6a81cb5befe2f9dc57afa7fe8dc91 (patch) | |
tree | 7a3447dff226b45bee3d60762fa4138f04327b14 /lib/throttled_api_request.rb | |
parent | 25ff0e9d1a22cbfa65fbece800d00d7cae0c0d8e (diff) |
Luke did some shit I dont know if he finished
Diffstat (limited to 'lib/throttled_api_request.rb')
-rw-r--r-- | lib/throttled_api_request.rb | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/lib/throttled_api_request.rb b/lib/throttled_api_request.rb index 3f30c56..1020071 100644 --- a/lib/throttled_api_request.rb +++ b/lib/throttled_api_request.rb @@ -1,18 +1,25 @@ -class ThrottledApiRequest < Struct.new(:api_name, :unit_time, :requests_per) +# limits is in the format: +# limits = [ +# {:unit_time => 10.seconds, :requests_per => 10}, +# {:unit_time => 10.minutes, :requests_per => 500}, +# ] +class ThrottledApiRequest < Struct.new(:api_name, :limits) def before(job) loop do sleep_for = -1 ActiveRecord::Base.transaction do ApiRequests.create(:api_name => self.api_name) - recent_requests = ApiRequets. - where(:api_name => self.api_name). - where("updated_at > ?", Time.now.utc - self.unit_time). - order(:updated_at) - if (recent_requests.count > self.requests_per) - sleep_for = Time.now.utc - recent_requests[recent_requests.count-self.requests_per].updated_at + self.limits.each do |limit| + recent_requests = ApiRequets. + where(:api_name => self.api_name). + where("updated_at > ?", Time.now.utc - limit[:unit_time]). + order(:updated_at) + if (recent_requests.count > limit[:requests_per]) + sleep_for = [sleep_for, Time.now.utc - recent_requests[recent_requests.count-limit[:requests_per]].updated_at].max + end + end + if sleep_for != -1 raise ActiveRecord::Rollback - else - sleep_for = -1 end end if sleep_for != -1 |