delayed_job_sequel 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright © 2010 Fabrice Armisen & Collective Idea
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,11 @@
1
+ # delayed_job Sequel backend
2
+
3
+ ## Installation
4
+
5
+ Add the gems to your Gemfile:
6
+
7
+ gem 'delayed_job', '2.1.1'
8
+ gem 'delayed_job_sequel', '0.0.1'
9
+
10
+
11
+ That's it. Use [delayed_job as normal](http://github.com/collectiveidea/delayed_job).
@@ -0,0 +1,133 @@
1
+ module Delayed
2
+ module Backend
3
+ module Sequel
4
+ class Job
5
+
6
+ def self.LazyJob
7
+ @@LazyJob ||= self.createLazyJob()
8
+ end
9
+
10
+ def self.createLazyJob()
11
+ eval <<-eos
12
+ class LazyJob < ::Sequel::Model(:delayed_jobs)
13
+ include Delayed::Backend::Base
14
+ include Delayed::Backend::Sequel::LazyJob
15
+
16
+
17
+ class <<self
18
+ alias :create! :create
19
+ end
20
+
21
+ alias :save! :save
22
+ alias :update_attributes :update
23
+
24
+ end
25
+
26
+ eos
27
+ Class.new(LazyJob)
28
+ end
29
+
30
+ class <<self
31
+ def method_missing(sym, *args, &block)
32
+ self.LazyJob.send sym, *args, &block
33
+ end
34
+ end
35
+
36
+ def self.new(options)
37
+ self.LazyJob.new(options)
38
+ end
39
+ end
40
+
41
+ module LazyJob
42
+
43
+ def self.included(base)
44
+ base.extend ClassMethods
45
+ end
46
+
47
+ module ClassMethods
48
+ def find_available(worker_name, limit = 5, max_run_time = Worker.max_run_time)
49
+ right_now = db_time_now
50
+ filters = []
51
+ filters << "(run_at <= '#{make_db_timestamp(right_now)}' AND (locked_at IS NULL OR locked_at < '#{make_db_timestamp(right_now - max_run_time)}') OR locked_by = '#{worker_name}') AND failed_at IS NULL"
52
+ filters << "priority >= #{Worker.min_priority.to_i}" if Worker.min_priority
53
+ filters << "priority <= #{Worker.max_priority.to_i}" if Worker.max_priority
54
+ Job.filter(filters.join(' and ')).order(:priority, :run_at).limit(limit).all()
55
+ end
56
+
57
+ # When a worker is exiting, make sure we don't have any locked jobs.
58
+ def clear_locks!(worker_name)
59
+ Job.filter("locked_by = '#{worker_name}'").update(:locked_at => nil, :locked_by => nil)
60
+ end
61
+
62
+ def db_time_now
63
+ Time.now
64
+ end
65
+
66
+ def make_db_timestamp(time)
67
+ "#{time.strftime('%Y-%m-%d %H:%M:%S')}.#{time.usec}#{time.strftime('%z')}"
68
+ end
69
+
70
+ def delete_all
71
+ Job.delete()
72
+ end
73
+
74
+ def find(id)
75
+ self[id]
76
+ end
77
+ end
78
+
79
+
80
+ def ==(other_job)
81
+ id == other_job.id
82
+ end
83
+
84
+ def before_create
85
+ self.last_error ||= nil
86
+ self.updated_at ||= Time.now
87
+ self.locked_at ||= nil
88
+ self.locked_by ||= nil
89
+ self.failed_at ||= nil
90
+ self.attempts ||= 0
91
+ self.created_at ||= Time.now
92
+ self.priority ||= 0
93
+ end
94
+
95
+ def before_save
96
+ set_default_run_at
97
+ super
98
+ end
99
+
100
+ # Lock this job for this worker.
101
+ # Returns true if we have the lock, false otherwise.
102
+ def lock_exclusively!(max_run_time, worker = worker_name)
103
+ right_now = self.class.db_time_now
104
+ overtime = right_now - max_run_time.to_i
105
+
106
+ affected_rows = if locked_by != worker
107
+ filter = "id = #{id} and (locked_at is null or locked_at < '#{make_db_timestamp(overtime)}') and (run_at <= '#{make_db_timestamp(right_now)}')"
108
+ Job.filter(filter).update(:locked_at => right_now, :locked_by => worker)
109
+ else
110
+ filter = "id = #{id} and locked_by = '#{worker}'"
111
+ Job.filter(filter).update(:locked_at => right_now)
112
+ end
113
+
114
+ if affected_rows == 1
115
+ self.locked_at = right_now
116
+ self.locked_by = worker
117
+ return true
118
+ else
119
+ return false
120
+ end
121
+ end
122
+
123
+
124
+ private
125
+
126
+ def make_db_timestamp(time)
127
+ Job.make_db_timestamp(time)
128
+ end
129
+
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,14 @@
1
+ class Sequel::Model
2
+ yaml_as "tag:ruby.yaml.org,2002:Sequel"
3
+
4
+ def self.yaml_new(klass, tag, val)
5
+ obj = klass[val['values'][:id]]
6
+ raise DeserializationError if obj.nil?
7
+ obj
8
+ end
9
+
10
+ def to_yaml_properties
11
+ ['@values']
12
+ end
13
+ end
14
+
@@ -0,0 +1,5 @@
1
+ require 'delayed_job'
2
+ require 'delayed/serialization/sequel'
3
+ require 'delayed/backend/sequel'
4
+
5
+ Delayed::Worker.backend = :sequel
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Delayed::Backend::Sequel::Job do
4
+ it_should_behave_like 'a delayed_job backend'
5
+ end
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ require 'rspec'
6
+ require 'logger'
7
+ require 'sequel'
8
+
9
+
10
+ @db = Sequel.sqlite
11
+
12
+ @db.create_table(:delayed_jobs) do
13
+ primary_key :id
14
+ Integer :priority, :default => 0
15
+ Integer :attempts, :default => 0
16
+ String :handler, :text => true, :default => nil
17
+ String :last_error, :text => true, :default => nil
18
+ DateTime :run_at, :default => nil
19
+ DateTime :locked_at, :default => nil
20
+ DateTime :failed_at, :default => nil
21
+ String :locked_by, :default => nil
22
+ DateTime :created_at, :default => nil
23
+ DateTime :updated_at, :default => nil
24
+ end
25
+
26
+ @db.create_table(:story) do
27
+ primary_key :id
28
+ String :text
29
+ end
30
+
31
+ require 'benchmark'
32
+ require 'delayed_job'
33
+ require 'delayed_job_sequel'
34
+ require 'delayed/backend/shared_spec'
35
+
36
+ class Story < Sequel::Model(@db[:story])
37
+ def tell; text; end
38
+ def whatever(n, _); tell*n; end
39
+ def self.count; end
40
+
41
+ handle_asynchronously :whatever
42
+
43
+ def update_attributes(param)
44
+ update(param)
45
+ end
46
+ end
47
+
48
+
metadata ADDED
@@ -0,0 +1,181 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: delayed_job_sequel
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Fabrice Armisen
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-11-19 00:00:00 -08:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: sequel
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: activesupport
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 7
44
+ segments:
45
+ - 3
46
+ - 0
47
+ - 0
48
+ version: 3.0.0
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: i18n
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ type: :runtime
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: delayed_job
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ~>
72
+ - !ruby/object:Gem::Version
73
+ hash: 1
74
+ segments:
75
+ - 2
76
+ - 1
77
+ version: "2.1"
78
+ type: :runtime
79
+ version_requirements: *id004
80
+ - !ruby/object:Gem::Dependency
81
+ name: sqlite3-ruby
82
+ prerelease: false
83
+ requirement: &id005 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - "="
87
+ - !ruby/object:Gem::Version
88
+ hash: 21
89
+ segments:
90
+ - 1
91
+ - 2
92
+ - 5
93
+ version: 1.2.5
94
+ type: :development
95
+ version_requirements: *id005
96
+ - !ruby/object:Gem::Dependency
97
+ name: rspec
98
+ prerelease: false
99
+ requirement: &id006 !ruby/object:Gem::Requirement
100
+ none: false
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ hash: 11
105
+ segments:
106
+ - 2
107
+ - 1
108
+ - 0
109
+ version: 2.1.0
110
+ type: :development
111
+ version_requirements: *id006
112
+ - !ruby/object:Gem::Dependency
113
+ name: rake
114
+ prerelease: false
115
+ requirement: &id007 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ hash: 3
121
+ segments:
122
+ - 0
123
+ version: "0"
124
+ type: :development
125
+ version_requirements: *id007
126
+ description:
127
+ email: farmisen@gmail.com
128
+ executables: []
129
+
130
+ extensions: []
131
+
132
+ extra_rdoc_files:
133
+ - LICENSE
134
+ - README.md
135
+ files:
136
+ - lib/delayed/backend/sequel.rb
137
+ - lib/delayed/serialization/sequel.rb
138
+ - lib/delayed_job_sequel.rb
139
+ - spec/delayed_job_sequel_spec.rb
140
+ - spec/spec.opts
141
+ - spec/spec_helper.rb
142
+ - LICENSE
143
+ - README.md
144
+ has_rdoc: true
145
+ homepage: http://github.com/farmisen/delayed_job_sequel
146
+ licenses: []
147
+
148
+ post_install_message:
149
+ rdoc_options:
150
+ - --charset=UTF-8
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ hash: 3
159
+ segments:
160
+ - 0
161
+ version: "0"
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ none: false
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ hash: 3
168
+ segments:
169
+ - 0
170
+ version: "0"
171
+ requirements: []
172
+
173
+ rubyforge_project:
174
+ rubygems_version: 1.3.7
175
+ signing_key:
176
+ specification_version: 3
177
+ summary: Sequel backend for delayed_job
178
+ test_files:
179
+ - spec/delayed_job_sequel_spec.rb
180
+ - spec/spec.opts
181
+ - spec/spec_helper.rb